AWS PrivateLink for Amazon S3 の一般提供を開始というリリース情報を見ると、
仮想ネットワークからのプライベート IP を使用して、Amazon Simple Storage Service (S3) とオンプレミスリソース間のプライベート接続を提供します。
と書いてあった。 ではAzureとVPN接続して、エンドポイント(PrivateLink)経由でアクセス出来るのか試してみる。 イメージはこんな感じ。
環境
- Azure
- AWS
AzureのVPN設定
AzureのVPNは、 VPN Gateway のドキュメント の チュートリアル:Azure Portal でサイト間接続を作成する を参考に構築した。
仮想ネットワーク (Virtual Network)
まず、仮想ネットワークを作成する。
作成した仮想ネットワークに、サブネットとゲートウェイサブネットを作成する。
対象 | 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分以上かかるので、気長に待つ。
仮想ネットワーク ゲートウェイ用のパブリックIPアドレスを使って、AWSのカスタマーゲートウェイを作成できるので、次はAWS側を設定する。
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アドレスを入力する。
仮想プライベートゲートウェイ (Virtual private gateway)
仮想プライベートゲートウェイを作成したら、アクションから「VPCにアタッチ」を選択して、対象のVPCに紐づける。
ルートテーブル
ルートテーブルを作成して、下記の設定を追加する。
- 「ルートの編集」でVPCにアタッチした仮想プライベートゲートウェイを追加する。送信先にはAzure側のサブネット(今回は10.0.1.0/24)を指定した。
- 「サブネットの関連付け」でVPC内に作成したサブネットを関連付ける。
VPN接続 (Site-to-Site VPN)
サイト間のVPN接続を作成する。
- VPCにアタッチした仮想プライベートゲートウェイを選択。
- Azure側のパブリックIPアドレスを設定したカスタマーゲートウェイを選択。
- ルーティングオプションを静的にして、Azure側のサブネットを指定。
今回その他の項目はデフォルトもしくは自動生成にした。
VPN接続を作成したら、設定ファイルをダウンロードしておく。
再度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)
ローカル ネットワーク ゲートウェイ作成後、接続メニューから接続情報を追加する。
- 作成した仮想ネットワークを選択。
- 共有キーにAWSのTunnel 1の共有キーを設定する。 (設定ファイルの 「IPSec Tunnel #1」 - 「Pre-Shared Key」)
接続の確認
Azure、AWS両方で接続状態を確認する。
Azureはローカル ネットワーク ゲートウェイの接続で「接続済み」になっているか確認する。
AWSはサイト間のVPN接続のトンネル詳細タブでトンネルのステータスが「アップ」になっているか確認する。 今回はTunnel 1のみ接続しているため、Tunnel 2が「ダウン」になっているが、やりとりは問題なく可能。ただし、本番運用時は両方つないでおくのか、プロジェクトごとで要検討。 (参考 : Site-to-Site VPN 接続のトンネルオプション)
AWSでの準備
VPN接続が完了したので、
- IAMユーザーを作成
- エンドポイント (PrivateLink for S3) を作成
- S3バケットを準備
をやってみる。
IAMユーザー作成
今回はポリシーを何も割り当てないIAMユーザーを作る。アクセス制御はS3バケットポリシーで設定する。
エンドポイント (PrivateLink for S3) 作成
エンドポイントは、
- com.amazonaws.ap-northeast-1.s3 (東京リージョンで作業しているので)
- Interface
を選択して作成した。
セキュリティグループはインバウンドにAzure、AWS両方のサブネットからHTTPSを許可するように作成。 (「VPN接続している拠点がもう1つあって、そこからのアクセスは制限したい」という時は設定した方がいいかもしれないけど、今回は要らない気がする。)
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バケットにアップロードしておく。
Azureからアクセス
後はAzure側からアクセスするだけ。
準備
Azureに用意したWindowsに AWS CLI を Windows での AWS CLI バージョン 2 のインストール、更新、アンインストール を参考にインストールする。
インストールが完了したら aws configure
コマンドを実行して、AWSのIAMユーザー情報を登録する。
aws configure list
で設定を確認。
コマンド実行
実行するコマンドは、 AWS PrivateLink for Amazon S3 の AWS 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://バケット名
となる。
上記コマンドを使用して一覧取得した結果は下記の通り、一覧取得出来た。
念のため、VPNの外からのアクセスが制限されているかを確認する。 今回は CloudBerry Explorer Freeware for Amazon S3 をインストールし、作成したIAMユーザー、S3 バケットでアクセスしてみて、
エラーになる事を確認。VPN内からのアクセスに限定出来た。
備考
CIDR重複は基本的に避ける
CIDR重複を避けてネットワークを構成する。 Azure、AWSそれぞれ記載されている箇所は下記の通り。
対象クラウド | 記載ページ | 対象の記載内容 |
---|---|---|
Azure | 仮想ネットワークの作成 | 仮想ネットワークを別の仮想ネットワークに接続する場合、アドレス空間を別の仮想ネットワークと重複させることはできません。 |
AWS | Site-to-Site VPN の制限 | VPC を共通のオンプレミスネットワークに接続する場合は、ネットワークに重複しない CIDR ブロックを使用することをお勧めします。 |
AWS | ルートテーブルと VPN ルーティングの優先度 |