はじめに
EC2 から AWS サービスへの通信は、デフォルトではインターネットを経由したアクセスが必要になりますが、VPCエンドポイントを利用することで、AWS のデータセンター内のインターナルネットワーク経由でのアクセスが可能になります。今回はセキュアな通信方法として VPCエンドポイントを経由した S3 へのアクセスを試してみようと思います。
VPCエンドポイントとは
VPC とAWS サービス間の接続を有効にするコンポーネントのことで、以下2つの種類の VPCエンドポイントがあります。本エントリーでは「ゲートウェイエンドポイント」を使います。
ゲートウェイエンドポイント
VPC のサービス専用のゲートウェイをアタッチします。ゲートウェイエンドポイントの対象サービスは S3 と DynamoDB です。
インターフェイスエンドポイント
VCP のサブネットに ENI を作成します。ENI に割り当てられたプライベートIPアドレスを使用してサービスにアクセスします(AWS PrivateLinkという技術を使用)。インターフェイスエンドポイントの対象サービスは S3を含み数多くあります。
アーキテクチャ
インターネット経由での S3 のアクセスを拒否し、VPCエンドポイント経由での S3 へのアクセスのみを許可します。
手順
1. S3 バケットの作成
「20220809-endpoint-gateway」というバケットを作成します。
適当にファイルもアップロードします。
2. IAMロールの作成
「EC2toS3」という EC2 が S3 へアクセスするための IAMロールを作成します。
3. EC2 インスタンスの起動
作成した IAMロールを設定し、プライベートサブネットに EC2 インスタンスを起動します。
また、パブリックサブネットにも同様に EC2 インスタンスを起動します。
4. VPCエンドポイントの作成
サービス「com.amazonaws.ap-northeast-1.s3」を選択します。
プライベートサブネットに属しているルートテーブルを選択してエンドポイントを作成します。
このようにエンドポイントが作成されます。
5. バケットポリシーの設定
バケットポリシーを以下のように設定し、VPCエンドポイントを経由した場合のみバケットへのアクセスを許可します。
{ "Id": "VPCe", "Version": "2012-10-17", "Statement": [ { "Sid": "VPCe", "Action": "s3:*", "Effect": "Deny", "Resource": "arn:aws:s3:::20220809-endpoint-gateway", "Condition": { "StringNotEquals": { "aws:SourceVpce": [ "vpce-02d3065c3ea6a5612" ] } }, "Principal": "*" } ] }
6. 動作確認
インターネット経由でのアクセス
パブリックサブネットにあるインスタンスから S3 バケットにアクセスします。
aws s3 ls --region ap-northeast-1 --recursive s3://20220809-endpoint-gateway
アクセスが拒否されました。想定通りの動きですね。
VPCエンドポイント経由でのアクセス
プライベートサブネットにあるインスタンスから S3 バケットにアクセスします。
aws s3 ls --region ap-northeast-1 --recursive s3://20220809-endpoint-gateway
S3 バケットにアクセスすることができました。
さいごに
このように VPCエンドポイントを使うことでセキュアな通信が可能になります。インターフェイスエンドポイントについてはこちらのエントリーでまとめていますので、興味のある方はぜひ読んでみてください。