AWSの部屋

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

VPCエンドポイント経由で S3 にアクセスする

はじめに

EC2 から AWS サービスへの通信は、デフォルトではインターネットを経由したアクセスが必要になりますが、VPCエンドポイントを利用することで、AWS のデータセンター内のインターナルネットワーク経由でのアクセスが可能になります。今回はセキュアな通信方法として VPCエンドポイントを経由した S3 へのアクセスを試してみようと思います。

VPCエンドポイントとは

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

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

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

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

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

アーキテクチャ

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

手順

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

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エンドポイントを使うことでセキュアな通信が可能になります。今回はゲートウェイエンドポイントのみでしたので、次はインターフェイスエンドポイントも使ってみようと思います。