AWSの部屋

AWS学習者向けのブログです

スポンサーリンク

VPCエンドポイント経由で S3 にアクセスする ~インターフェイスエンドポイント編~

はじめに

過去エントリーゲートウェイエンドポイント経由での S3 へのアクセスについて書きました。本エントリーではインターフェイスエンドポイントを使って S3 へアクセスしてみようと思います。

VPCエンドポイントとは

VPCAWS サービス間の接続を有効にするコンポーネントのことで、以下2つの種類の VPCエンドポイントがあります。本エントリーでは「インターフェイスエンドポイント」を使います。

ゲートウェイエンドポイント

VPC のサービス専用のゲートウェイをアタッチします。ゲートウェイエンドポイントの対象サービスは S3 と DynamoDB です。

インターフェイスエンドポイント

VCP のサブネットに ENI を作成します。ENI に割り当てられたプライベートIPアドレスを使用してサービスにアクセスします(AWS PrivateLinkという技術を使用)。インターフェイスエンドポイントの対象サービスは S3 を含み数多くあります。

アーキテクチャ

インターネット経由での S3 のアクセスを拒否し、インターフェイスエンドポイント経由での S3 へのアクセスのみを許可します。

手順

  1. S3 バケットの作成
  2. IAMロールの作成
  3. EC2 インスタンスの起動
  4. VPCエンドポイントの作成
  5. バケットポリシーの設定
  6. 動作確認

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 バケットにアクセスすることができました。

さいごに

ゲートウェイエンドポイントと異なりインターフェースエンドポイントは料金が発生しますので、そこだけご注意ください。