public note

AWSのインターフェイス型VPCエンドポイントはAZごとに1つだけ設定できる

AWSインターフェイスVPC エンドポイント (以下、Interface endpoint)を作成する際に、気になったことがあったのでまとめます。

サブネットの設定でエラーになった

例として、ECR エンドポイントを作成する CloudFormation のコードを挙げます。

ECREndpoint:
  Type: AWS::EC2::VPCEndpoint
  Properties:
    ServiceName: !Sub "com.amazonaws.${AWS::Region}.ecr.dkr"
    VpcEndpointType: Interface
    PrivateDnsEnabled: true
    VpcId: !Ref VPC
    SubnetIds:
      - !Ref PrivateSubnet1
      - !Ref PrivateSubnet2
      - !Ref PrivateSubnet3
    SecurityGroupIds:
      - !Ref EndpointSecurityGroup

エンドポイントを設置するサブネットを指定する SubnetIds という属性があります。

私が実現したかったのは、同一の AZ に属するサブネットがすべて Interface endpoint を使える構成でした。 そこで、SubnetIds に、同じ AZ に属するサブネットを複数設定しようとしたところ、以下のエラーが発生しました。

Found another VPC endpoint subnet in the availability zone of subnet-xxxxxxxxxxxxxxxx.
VPC endpoint subnets should be in different availability zones supported by the VPC endpoint service.
(Service: AmazonEC2; Status Code: 400; Error Code: DuplicateSubnetsInSameZone; Request ID: 12345678-abcd-9012-efgh-ijklmnopqrst; Proxy: null)

Interface endpoint に設定するサブネットは、異なる AZ に属していなければならないようです。 では、SubnetIds に指定していないサブネットは、Interface endpoint を使えないのだろうか?というのが気になりました。

検証してみた

結論から言うと、使えました。

検証の際は NAT Gateway を設置せずインターネットと直接通信ができないようにして、Interface endpoint が使えなければエラーとなるような構成にしました。 検証コードはこちらのリポジトリにあります。

github.com

PrivateSubnet1 は ap-northeast-1a に作成しており、ECR, CloudWatchLogs, SecretsManager のエンドポイントにて指定しています。 一方で、同じ AZ に属する PrivateSubnet4 は、エンドポイントでの設定に含まれていない状態です。

この PrivateSubnet4 にて、上記のエンドポイントを使用する AWS Batch を実行したところ、正常終了しました。

どうやら、Interface endpoint で指定したサブネットに AZ を代表する形で設置され、同一 AZ 内でのサービス利用時に良い感じにルーティングしてくれるようです。

参考

stackoverflow.com