nakamurakko’s blog

仕事で覚えたこと、勉強したことを自分のメモ代わりに書いていこうかなと。

Azure から AWS に VPN接続して、 PrivateLink 経由で S3 にアクセスする

AWS PrivateLink for Amazon S3 の一般提供を開始というリリース情報を見ると、

仮想ネットワークからのプライベート IP を使用して、Amazon Simple Storage Service (S3) とオンプレミスリソース間のプライベート接続を提供します。

と書いてあった。 ではAzureとVPN接続して、エンドポイント(PrivateLink)経由でアクセス出来るのか試してみる。 イメージはこんな感じ。

f:id:nakamurakko:20210409212904p:plain

環境

  • Azure
  • AWS

AzureのVPN設定

AzureのVPNは、 VPN Gateway のドキュメントチュートリアル:Azure Portal でサイト間接続を作成する を参考に構築した。

仮想ネットワーク (Virtual Network)

まず、仮想ネットワークを作成する。

f:id:nakamurakko:20210409213019p:plain

作成した仮想ネットワークに、サブネットとゲートウェイサブネットを作成する。

f:id:nakamurakko:20210409213040p:plain

対象 CIDR
仮想ネットワーク 10.0.1.0/24
サブネット 10.0.1.0/28
GatewaySubnet 10.0.1.240/28

ゲートウェイ サブネットについて には、

ゲートウェイ サブネットを作成するときに、サブネットに含まれる IP アドレスの数を指定します。 必要な IP アドレスの数は、作成する VPN ゲートウェイの構成によって異なります。 一部の構成では、他の構成よりも多くの IP アドレスを割り当てる必要があります。 作成するゲートウェイ サブネットには /27 または /28 を使用することをお勧めします。

と書いてあり、仮想ネットワーク内にゲートウェイ サブネット分を意識して割り当てる必要がある。

仮想ネットワーク ゲートウェイ (VPN gateway)

仮想ネットワーク ゲートウェイを作成する。

  • SKUは Basic を選択。 (お試しなので)
  • 仮想ネットワークは作成したものを選択。
  • パブリックIPアドレスを新規作成。

作成ボタンを押してから使用可能になるまで20分以上かかるので、気長に待つ。

f:id:nakamurakko:20210409213107p:plain

仮想ネットワーク ゲートウェイ用のパブリックIPアドレスを使って、AWSのカスタマーゲートウェイを作成できるので、次はAWS側を設定する。

f:id:nakamurakko:20210409213129p:plain

AWSのVPN設定

AWSのVPNは、 AWS Site-to-Site VPN とは開始方法 を参考に構築した。

VPC、サブネット

まず、VPCを用意とサブネットを作成した。Azure側のサブネットと被らないように作成している。 VPCとサブネットの範囲は一緒にしたけど、サブネットを増やす予定が無ければ、VPCと同じCIDRでもいいと思う。プロジェクトごとで判断ということで。

対象 CIDR
VPC 10.0.0.0/24
サブネット 10.0.0.0/24

カスタマーゲートウェイ (Customer gateway)

カスタマーゲートウェイを作成する。 IPアドレスには、Azureの仮想ネットワークゲートウェイのパブリックIPアドレスを入力する。

f:id:nakamurakko:20210409213150p:plain

仮想プライベートゲートウェイ (Virtual private gateway)

仮想プライベートゲートウェイを作成したら、アクションから「VPCにアタッチ」を選択して、対象のVPCに紐づける。

f:id:nakamurakko:20210409213212p:plain

ルートテーブル

ルートテーブルを作成して、下記の設定を追加する。

  • 「ルートの編集」でVPCにアタッチした仮想プライベートゲートウェイを追加する。送信先にはAzure側のサブネット(今回は10.0.1.0/24)を指定した。
  • 「サブネットの関連付け」でVPC内に作成したサブネットを関連付ける。

f:id:nakamurakko:20210409213233p:plain

f:id:nakamurakko:20210409213254p:plain

VPN接続 (Site-to-Site VPN)

サイト間のVPN接続を作成する。

  • VPCにアタッチした仮想プライベートゲートウェイを選択。
  • Azure側のパブリックIPアドレスを設定したカスタマーゲートウェイを選択。
  • ルーティングオプションを静的にして、Azure側のサブネットを指定。

今回その他の項目はデフォルトもしくは自動生成にした。

f:id:nakamurakko:20210409213315p:plain

VPN接続を作成したら、設定ファイルをダウンロードしておく。

f:id:nakamurakko:20210409213336p:plain

再度AzureのVPN設定

Azure側に戻って、AWSのVPN接続の設定ファイルを使って設定していく。

ローカル ネットワーク ゲートウェイ (Local network gateway)

ローカル ネットワーク ゲートウェイを作成する。

  • IPアドレスにAWSのTunnel 1のパブリックIPアドレスを設定する。 (設定ファイルの 「IPSec Tunnel #1」 - 「Outside IP Addresses:」 - 「Virtual Private Gateway」)
  • アドレス空間にはAWS側のCIDRを指定する。 (今回は10.0.0.0/24)

f:id:nakamurakko:20210409214521p:plain

ローカル ネットワーク ゲートウェイ作成後、接続メニューから接続情報を追加する。

f:id:nakamurakko:20210409213425p:plain

  • 作成した仮想ネットワークを選択。
  • 共有キーにAWSのTunnel 1の共有キーを設定する。 (設定ファイルの 「IPSec Tunnel #1」 - 「Pre-Shared Key」)

f:id:nakamurakko:20210409214813p:plain

接続の確認

Azure、AWS両方で接続状態を確認する。

Azureはローカル ネットワーク ゲートウェイの接続で「接続済み」になっているか確認する。

f:id:nakamurakko:20210409213527p:plain

AWSはサイト間のVPN接続のトンネル詳細タブでトンネルのステータスが「アップ」になっているか確認する。 今回はTunnel 1のみ接続しているため、Tunnel 2が「ダウン」になっているが、やりとりは問題なく可能。ただし、本番運用時は両方つないでおくのか、プロジェクトごとで要検討。 (参考 : Site-to-Site VPN 接続のトンネルオプション)

f:id:nakamurakko:20210409213547p:plain

AWSでの準備

VPN接続が完了したので、

  • IAMユーザーを作成
  • エンドポイント (PrivateLink for S3) を作成
  • S3バケットを準備

をやってみる。

IAMユーザー作成

今回はポリシーを何も割り当てないIAMユーザーを作る。アクセス制御はS3バケットポリシーで設定する。

f:id:nakamurakko:20210409213609p:plain

エンドポイント (PrivateLink for S3) 作成

エンドポイントは、

  • com.amazonaws.ap-northeast-1.s3 (東京リージョンで作業しているので)
  • Interface

を選択して作成した。

f:id:nakamurakko:20210409213648p:plain

セキュリティグループはインバウンドにAzure、AWS両方のサブネットからHTTPSを許可するように作成。 (「VPN接続している拠点がもう1つあって、そこからのアクセスは制限したい」という時は設定した方がいいかもしれないけど、今回は要らない気がする。)

f:id:nakamurakko:20210409213754p:plain

S3バケット作成

S3 バケットを作成する。「パブリックアクセスをすべて ブロック」にチェックを付けて外部からアクセス出来ないようにしておく。 バケットポリシーには、IAMユーザー、エンドポイントを指定して、対象のIAMユーザーがエンドポイントを使わないとアクセス出来ないようにした。

{
    "Version": "2012-10-17",
    "Id": "Policyxxxxxxxxxxxxx",
    "Statement": [
        {
            "Sid": "Stmtxxxxxxxxxxxxx",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::xxxxxxxxxxxx:user/no-policy-user"
            },
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::vpn-access-sample-bucket",
                "arn:aws:s3:::vpn-access-sample-bucket/*"
            ],
            "Condition": {
                "ArnEquals": {
                    "aws:SourceVpce": "vpce-xxxxxxxxxxxxxxxxx"
                }
            }
        }
    ]
}

準備が出来たので、サンプルファイルをS3バケットにアップロードしておく。

f:id:nakamurakko:20210409213629p:plain

Azureからアクセス

後はAzure側からアクセスするだけ。

準備

Azureに用意したWindowsに AWS CLI を Windows での AWS CLI バージョン 2 のインストール、更新、アンインストール を参考にインストールする。 インストールが完了したら aws configure コマンドを実行して、AWSのIAMユーザー情報を登録する。

aws configure list で設定を確認。

f:id:nakamurakko:20210409213811p:plain

コマンド実行

実行するコマンドは、 AWS PrivateLink for Amazon S3AWS CLI の例 を参考にすると、S3 のバケット一覧取得は、

aws s3 --endpoint-url https://bucket.エンドポイントのDNS名 ls s3://バケット名

でアクセス出来ると書いてあるが、Azureからアクセスする場合は、 Amazon S3 バケットで sync コマンドを実行するときに、「エンドポイント URL に接続できませんでした」というエラーをトラブルシューティングする方法を教えてください。 に、

VPC エンドポイントが別のリージョンにあるときに --region us-west-1 を使用して sync コマンドを実行すると、CLI は https://s3.us-west-1.amazonaws.com に問い合わせます。これにより、「エンドポイント URL に接続できませんでした」というエラーが発生します。

とあるように、 --region も必要になるので、

aws s3 --endpoint-url https://bucket.エンドポイントのDNS名 --region リージョン名 ls s3://バケット名

となる。

上記コマンドを使用して一覧取得した結果は下記の通り、一覧取得出来た。

f:id:nakamurakko:20210409213833p:plain

念のため、VPNの外からのアクセスが制限されているかを確認する。 今回は CloudBerry Explorer Freeware for Amazon S3 をインストールし、作成したIAMユーザー、S3 バケットでアクセスしてみて、

f:id:nakamurakko:20210409213853p:plain

エラーになる事を確認。VPN内からのアクセスに限定出来た。

f:id:nakamurakko:20210409213909p:plain

備考

CIDR重複は基本的に避ける

CIDR重複を避けてネットワークを構成する。 Azure、AWSそれぞれ記載されている箇所は下記の通り。

対象クラウド 記載ページ 対象の記載内容
Azure 仮想ネットワークの作成 仮想ネットワークを別の仮想ネットワークに接続する場合、アドレス空間を別の仮想ネットワークと重複させることはできません。
AWS Site-to-Site VPN の制限 VPC を共通のオンプレミスネットワークに接続する場合は、ネットワークに重複しない CIDR ブロックを使用することをお勧めします。
AWS ルートテーブルと VPN ルーティングの優先度