1. はじめに

個人プロジェクトでAWSでインフラを構築してた際にプライベートサブネットからDynamoDBに接続する構成を作成しました。

プライベートサブネットからVPCを接続するには、VPCエンドポイントを作成してVPC外のAWSサービスにアクセスする必要があります。

VPCエンドポイントを通してVPC外のAWSサービスにアクセスする方法を解説します。

※ NatGatewayを利用する方法がありますが、ここでは対象外とします。

2. なぜVPCエンドポイントを利用するのか

VPC のプライベートサブネットからVPC外のリソースにアクセスするには、VPCエンドポイントを作成することで可能です。

なぜVPCエンドポイントが必要かというと、プライベートサブネットからVPC外部のAWSサービスにアクセスするための経路がないためです。

2.1 そもそもVPCエンドポイントとは

VPCエンドポイントとは、AWSのVPCから、インターネットを経由せずにAWSサービスに安全にアクセスできる仕組みです。

VPCエンドポイントはインターフェース型とゲートウェイ型があります。

DynamoDBとS3はゲートウェイ型で、それ以外のAWSサービスはインターフェース型です。

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

ENI(Elastic Network Interface)を使って、VPC内にENI(仮想ネットワークインターフェース)を作成し、対象のサービスにアクセスします。

  • 特徴
    • 多くのAWSサービスに対応している
    • エンドポイントはVPC内にENIとして作成され、プライベートIPが割り当てられる。
    • セキュリティグループを設定できる。

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

VPCルートテーブルを使用して、特定のAWSサービス(現在はS3とDynamoDBのみ)にゲートウェイ経由でアクセスします。

  • 特徴
    • S3, DynamoDBに対応します。
    • ルートテーブルにターゲットとして設定する。
    • セキュリティグループは使えないが、エンドポイントポリシーでアクセス制御が可能です。

3. 構成図

プライベートサブネットのECSからDynamoDBへアクセスする図です。

プライベートのlambdaからDynamoDBにアクセスする図

4. 実際の手順

ここでは、VPCの作成からエンドポイントの作成までの手順を書いていきます。

  • ゲートウェイエンド型ポイントを通してDynamoDB接続に必要なリソース
    • VPC
    • プライベートサブネット
    • ルートテーブル
    • VPCエンドポイント

VPCを作成する。

VPC:
  Type: AWS::EC2::VPC
  Properties:
    CidrBlock: 192.168.0.0/20
    EnableDnsSupport: true
    EnableDnsHostnames: true
    Tags:
      - Key: Name
        Value: 'vpc'

プライベートサブネットを作成する。

PrivateSubnet:
  Type: AWS::EC2::Subnet
  Properties:
    VpcId: !Ref VPC
    AvailabilityZone: !Select [0, !GetAZs '']
    CidrBlock: 192.168.0.0/23
    MapPublicIpOnLaunch: false
    Tags:
      - Key: Name
        Value: 'ecs-private-subnet'

ルートテーブルを作成する。

EcsPrivateRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: VPC
      Tags:
        - Key: Name
          Value: 'ecs-private-route-table'

  EcsPrivateSubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PrivateSubnet
      RouteTableId: !Ref EcsPrivateRouteTable

VPCエンドポイントを作成する

DynamoDbVPCEndpoint:
  Type: AWS::EC2::VPCEndpoint
  DependsOn: EcsPrivateRouteTable
  Properties:
    ServiceName: !Sub 'com.amazonaws.${AWS::Region}.dynamodb'
    VpcId: !Ref GymManagementVPC
    VpcEndpointType: Gateway
    RouteTableIds:
      - !Ref PrivateRouteTable
    Tags:
      - Key: Name
        Value: 'dynamodb-vpc-endpoint'

※ ゲートウェイ型エンドポイントは、セキュリティグループは不要です。

※ ゲートウェイ型エンドポイントは、ルートテーブルが必要です。逆にインターフェース型エンドポイントはルートテーブルが必要です。

5. まとめ

VPCエンドポイントは、プラーベートサブネットに作成したECS,Lambda等からVPC外のAWSリソースにアクセスするために利用するサービスで、 AWSのネットワークを構築するためには必須のリソースです。

VPC外のAWSリソースにアクセスするにはVPCエンドポイント以外にもNatGatewayとインターネットゲートウェイを利用してVPC外のリソースにアクセスすることが可能です。

この2つの方法は、両者メリット、デメリットがあり、要件に応じて使い分けが必要です。

次回、プライベートサブネットからNatgatewayを利用したVPC外のAWSリソースについて説明していきたいと思います。

7. 参考ページ

テクニカルインストラクターと学ぶインターフェース型とゲートウェイ型の VPC エンドポイント サービスエンドポイント