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 が使えなければエラーとなるような構成にしました。 検証コードはこちらのリポジトリにあります。
PrivateSubnet1 は ap-northeast-1a
に作成しており、ECR, CloudWatchLogs, SecretsManager のエンドポイントにて指定しています。
一方で、同じ AZ に属する PrivateSubnet4 は、エンドポイントでの設定に含まれていない状態です。
この PrivateSubnet4 にて、上記のエンドポイントを使用する AWS Batch を実行したところ、正常終了しました。
どうやら、Interface endpoint で指定したサブネットに AZ を代表する形で設置され、同一 AZ 内でのサービス利用時に良い感じにルーティングしてくれるようです。