はじめに
過去エントリーでゲートウェイエンドポイント経由での S3 へのアクセスについて書きました。本エントリーではインターフェイスエンドポイントを使って S3 へアクセスしてみようと思います。
VPCエンドポイントとは
VPC とAWS サービス間の接続を有効にするコンポーネントのことで、以下2つの種類の VPCエンドポイントがあります。本エントリーでは「インターフェイスエンドポイント」を使います。
ゲートウェイエンドポイント
VPC のサービス専用のゲートウェイをアタッチします。ゲートウェイエンドポイントの対象サービスは S3 と DynamoDB です。
インターフェイスエンドポイント
VCP のサブネットに ENI を作成します。ENI に割り当てられたプライベートIPアドレスを使用してサービスにアクセスします(AWS PrivateLinkという技術を使用)。インターフェイスエンドポイントの対象サービスは S3 を含み数多くあります。
アーキテクチャ
インターネット経由での S3 のアクセスを拒否し、インターフェイスエンドポイント経由での S3 へのアクセスのみを許可します。
手順
1. S3 バケットの作成
「20230108-endpoint-interface」というバケットを作成します。
適当にファイルもアップロードします。
2. IAMロールの作成
「EC2toS3」という EC2 が S3 へアクセスするための IAMロールを作成します。
3. EC2 インスタンスの起動
作成した IAMロールを設定し、プライベートサブネットに EC2 インスタンスを起動します。
また、パブリックサブネットにも同様に EC2 インスタンスを起動します。
4. VPCエンドポイントの作成
「エンドポイントを作成」を押します。
サービス「com.amazonaws.ap-northeast-1.s3」を選択します(タイプ=Interfaceの当該サービスを選択します)。
エンドポイントを設定する VPC を選択して、ENI を配置するサブネットを選択します。
ENI に設定するセキュリティグループを選択します。(EC2 からHTTPとHTTPSを受け取れるセキュリティグループとします)
このようにエンドポイントが作成されます。
5. バケットポリシーの設定
バケットポリシーを以下のように設定し、インターフェイスエンドポイントを経由した場合のみバケットへのアクセスを許可します。
{ "Id": "VPCe", "Version": "2012-10-17", "Statement": [ { "Sid": "VPCe", "Action": "s3:*", "Effect": "Deny", "Resource": "arn:aws:s3:::20230108-endpoint-interface", "Condition": { "StringNotEquals": { "aws:SourceVpce": [ "vpce-05f7380178e5d62db" ] } }, "Principal": "*" } ] }
6. 動作確認
以下のようなコマンドを使ってインターフェースエンドポイント経由での動作確認を行います。
aws s3 --endpoint-url https://bucket.<エンドポイントごと固有の値>.s3.ap-northeast-1.vpce.amazonaws.com ls s3://<バケット名>
<エンドポイントごと固有の値>はエンドポイントのDNS名の一部を設定します。
パブリックサブネットからのアクセス
[インターネット経由でのアクセス]
aws s3 ls --region ap-northeast-1 --recursive s3://20220809-endpoint-gateway
アクセスが拒否されました。想定通りの動きですね。
[インターフェースエンドポイント経由でのアクセス]
aws s3 ls --region ap-northeast-1 --endpoint-url https://bucket.vpce-05f7380178e5d62db-9tqbinyi.s3.ap-northeast-1.vpce.amazonaws.com s3://20230108-endpoint-interface
対象の S3 バケットにアクセスすることができました。
プライベートサブネットからのアクセス
[インターフェースエンドポイント経由でのアクセス]
aws s3 ls --region ap-northeast-1 --endpoint-url https://bucket.vpce-05f7380178e5d62db-9tqbinyi.s3.ap-northeast-1.vpce.amazonaws.com s3://20230108-endpoint-interface
対象の S3 バケットにアクセスすることができました。
さいごに
ゲートウェイエンドポイントと異なりインターフェースエンドポイントは料金が発生しますので、そこだけご注意ください。