インターフェイス型のVPCエンドポイントでサブネットを指定しないのダメ絶対

インターフェイス型のVPCエンドポイントを作成する際は必ずサブネットを指定しよう
2022.08.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

サブネットを指定しないとどうなるのか

こんにちは、のんピ(@non____97)です。

皆さんはVPCエンドポイント使っていますか? 私は使っています。

VPCエンドポイントはゲートウェイ型とインターフェイス型、Gateway Load Balancer型の3種類あります。

ふと、VPCエンドポイント作成のAPIであるCreateVpcEndpointを確認していると、サブネットIDを指定するパラメーターSubnetId.Nが必須でないことに気づきました。

SubnetId.N

(Interface and Gateway Load Balancer endpoints) The ID of one or more subnets in which to create an endpoint network interface. For a Gateway Load Balancer endpoint, you can specify one subnet only.

Type: Array of strings

Required: No

インターフェイス型とGateway Load Balancer型のVPCエンドポイントの場合に指定するようですが、必須とは一言も書かれていません。

そこで、サブネットを指定せずに、インターフェイス型のVPCエンドポイントを作成した場合にどのような影響があるのか確認します。

いきなりまとめ

  • Amazon Provided DNSをDNSサーバーに指定した場合に、作成したVPCエンドポイントのサービスエンドポイントの名前解決ができなくなる

検証の構成

検証で使う環境の構成図は以下の通りです。

構成図

このVPC上に、サブネットを指定せずにVPCエンドポイントを作成するとどんな挙動をするのか確認します。

やってみた

検証環境のデプロイ

検証環境をAWS CDKでデプロイします。

AWS CDKのコードは以下の通りです。

./lib/ec2-instace-stack.ts

import { aws_iam as iam, aws_ec2 as ec2, Stack, StackProps } from "aws-cdk-lib";
import { Construct } from "constructs";

export class Ec2InstaceStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    // SSM IAM role
    const ec2InstanceIamRole = new iam.Role(this, "EC2 Instance IAM Role", {
      assumedBy: new iam.ServicePrincipal("ec2.amazonaws.com"),
      managedPolicies: [
        iam.ManagedPolicy.fromAwsManagedPolicyName(
          "AmazonSSMManagedInstanceCore"
        ),
        iam.ManagedPolicy.fromAwsManagedPolicyName("AmazonEC2ReadOnlyAccess"),
      ],
    });

    // VPC
    const vpc = new ec2.Vpc(this, "VPC", {
      cidr: "10.0.1.0/24",
      enableDnsHostnames: true,
      enableDnsSupport: true,
      natGateways: 0,
      maxAzs: 1,
      subnetConfiguration: [
        {
          name: "Public",
          subnetType: ec2.SubnetType.PUBLIC,
          cidrMask: 26,
        },
      ],
    });

    // EC2 Instance
    new ec2.Instance(this, "EC2 Instance", {
      instanceType: new ec2.InstanceType("t3.micro"),
      machineImage: ec2.MachineImage.latestAmazonLinux({
        generation: ec2.AmazonLinuxGeneration.AMAZON_LINUX_2,
      }),
      vpc,
      blockDevices: [
        {
          deviceName: "/dev/xvda",
          volume: ec2.BlockDeviceVolume.ebs(8, {
            volumeType: ec2.EbsDeviceVolumeType.GP3,
          }),
        },
      ],
      propagateTagsToVolumeOnCreation: true,
      vpcSubnets: vpc.selectSubnets({
        subnetType: ec2.SubnetType.PUBLIC,
      }),
      role: ec2InstanceIamRole,
    });

    new ec2.SecurityGroup(this, "VPC Endpoint SG", {
      vpc,
    }).addIngressRule(ec2.Peer.ipv4(vpc.vpcCidrBlock), ec2.Port.tcp(443));
  }
}

VPCエンドポイントにアタッチするセキュリティグループも一緒に作成します。

名前解決の確認

サブネットを指定せずにVPCエンドポイントを作成する前に、サービスエンドポイントの名前解決ができることを確認します。

まず、リージョンのEC2のサービスエンドポイント(ec2.us-east-1.amazonaws.com)に対する名前解決です。

$ dig ec2.us-east-1.amazonaws.com

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.5.2 <<>> ec2.us-east-1.amazonaws.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51968
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;ec2.us-east-1.amazonaws.com.   IN      A

;; ANSWER SECTION:
ec2.us-east-1.amazonaws.com. 66 IN      CNAME   ec2.amazonaws.com.
ec2.amazonaws.com.      28      IN      A       209.54.182.97

;; Query time: 1 msec
;; SERVER: 10.0.1.2#53(10.0.1.2)
;; WHEN: Wed Aug 24 02:13:05 UTC 2022
;; MSG SIZE  rcvd: 90

名前解決できました。ec2.us-east-1.amazonaws.comec2.amazonaws.comのCNAMEのようですね。

また、SERVER: 10.0.1.2#53(10.0.1.2)であることからAmazon Provided DNSを使って名前解決していることが分かります。

次に、ec2.amazonaws.comです。

$ dig ec2.amazonaws.com

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.5.2 <<>> ec2.amazonaws.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36470
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;ec2.amazonaws.com.             IN      A

;; ANSWER SECTION:
ec2.amazonaws.com.      56      IN      A       52.46.155.190

;; Query time: 0 msec
;; SERVER: 10.0.1.2#53(10.0.1.2)
;; WHEN: Wed Aug 24 02:28:22 UTC 2022
;; MSG SIZE  rcvd: 62

こちらもAmazon Provided DNSを使って名前解決できました。

ついでにAWSのAPIを叩けることも確認しておきましょう。

自身のEC2インスタンスIDをdescribe-instancesで出力します。

# インスタンスメタデータからインスタンスIDを取得
$ instance_id=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)

# 自身のインスタンスIDをAWS CLIで表示
$ aws ec2 describe-instances \
    --instance-ids "$instance_id" \
    --query 'Reservations[*].Instances[*].{Instance:InstanceId}' \
    --region us-east-1
[
    [
        {
            "Instance": "i-021d5a5d8a3770f22"
        }
    ]
]

正しく実行できました。

サブネットを指定せずにVPCエンドポイントを作成してみる

それでは、サブネットを指定せずにEC2のVPCエンドポイントを作成してみます。

# VPCエンドポイントの作成
$ aws ec2 create-vpc-endpoint \
    --vpc-id vpc-07715c76106d55335 \
    --vpc-endpoint-type Interface \
    --service-name com.amazonaws.us-east-1.ec2 \
    --security-group-ids sg-0d60564602ac7b781 \
    --region us-east-1
{
    "VpcEndpoint": {
        "VpcEndpointId": "vpce-0d4e6262d3e098393",
        "VpcEndpointType": "Interface",
        "VpcId": "vpc-07715c76106d55335",
        "ServiceName": "com.amazonaws.us-east-1.ec2",
        "State": "pending",
        "RouteTableIds": [],
        "SubnetIds": [],
        "Groups": [
            {
                "GroupId": "sg-0d60564602ac7b781",
                "GroupName": "Ec2InstaceStack-VPCEndpointSG3E5EA584-3S12B3HWZ9I0"
            }
        ],
        "IpAddressType": "ipv4",
        "DnsOptions": {
            "DnsRecordIpType": "ipv4"
        },
        "PrivateDnsEnabled": true,
        "RequesterManaged": false,
        "NetworkInterfaceIds": [],
        "DnsEntries": [],
        "CreationTimestamp": "2022-08-29T00:25:48.965000+00:00",
        "OwnerId": "<AWSアカウントID>"
    }
}

# VPCエンドポイントの確認
$ aws ec2 describe-vpc-endpoints
{
    "VpcEndpoints": [
        {
            "VpcEndpointId": "vpce-0d4e6262d3e098393",
            "VpcEndpointType": "Interface",
            "VpcId": "vpc-07715c76106d55335",
            "ServiceName": "com.amazonaws.us-east-1.ec2",
            "State": "available",
            "PolicyDocument": "{\n  \"Statement\": [\n    {\n      \"Action\": \"*\", \n      \"Effect\": \"Allow\", \n      \"Principal\": \"*\", \n      \"Resource\": \"*\"\n    }\n  ]\n}",
            "RouteTableIds": [],
            "SubnetIds": [],
            "Groups": [
                {
                    "GroupId": "sg-0d60564602ac7b781",
                    "GroupName": "Ec2InstaceStack-VPCEndpointSG3E5EA584-3S12B3HWZ9I0"
                }
            ],
            "IpAddressType": "ipv4",
            "DnsOptions": {
                "DnsRecordIpType": "ipv4"
            },
            "PrivateDnsEnabled": true,
            "RequesterManaged": false,
            "NetworkInterfaceIds": [],
            "DnsEntries": [],
            "CreationTimestamp": "2022-08-29T00:25:48.965000+00:00",
            "Tags": [],
            "OwnerId": "<AWSアカウントID>"
        }
    ]
}

コマンドの出力結果を確認したところ、サブネットとENIのレスポンスが空欄になってますね。

VPCエンドポイントのサブネットを指定していない状態で名前解決

この状態で名前解決してみます。

まず、ec2.us-east-1.amazonaws.comを名前解決してみます。

$ dig ec2.us-east-1.amazonaws.com

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.5.2 <<>> ec2.us-east-1.amazonaws.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42694
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;ec2.us-east-1.amazonaws.com.   IN      A

;; AUTHORITY SECTION:
ec2.us-east-1.amazonaws.com. 900 IN     SOA     ns-1536.awsdns-00.co.uk. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400

;; Query time: 1 msec
;; SERVER: 10.0.1.2#53(10.0.1.2)
;; WHEN: Mon Aug 29 00:26:52 UTC 2022
;; MSG SIZE  rcvd: 140

名前解決できなくなりました。

DNSサーバーをAmazon Provided DNS以外のものに指定して、再度名前解決してみます。

$ dig ec2.us-east-1.amazonaws.com @1.1.1.1

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.5.2 <<>> ec2.us-east-1.amazonaws.com @1.1.1.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47592
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;ec2.us-east-1.amazonaws.com.   IN      A

;; ANSWER SECTION:
ec2.us-east-1.amazonaws.com. 492 IN     CNAME   ec2.amazonaws.com.
ec2.amazonaws.com.      9       IN      A       209.54.177.247

;; Query time: 1 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Mon Aug 29 00:26:59 UTC 2022
;; MSG SIZE  rcvd: 90

こちらは名前解決できました。

また、digのオプションに+traceをつけて、ルートから名前解決してみます。

$ dig ec2.us-east-1.amazonaws.com +trace

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.5.2 <<>> ec2.us-east-1.amazonaws.com +trace
;; global options: +cmd
.                       36      IN      NS      a.root-servers.net.
.                       36      IN      NS      b.root-servers.net.
.                       36      IN      NS      c.root-servers.net.
.                       36      IN      NS      d.root-servers.net.
.                       36      IN      NS      e.root-servers.net.
.                       36      IN      NS      f.root-servers.net.
.                       36      IN      NS      g.root-servers.net.
.                       36      IN      NS      h.root-servers.net.
.                       36      IN      NS      i.root-servers.net.
.                       36      IN      NS      j.root-servers.net.
.                       36      IN      NS      k.root-servers.net.
.                       36      IN      NS      l.root-servers.net.
.                       36      IN      NS      m.root-servers.net.
;; Received 239 bytes from 10.0.1.2#53(10.0.1.2) in 0 ms

com.                    172800  IN      NS      l.gtld-servers.net.
com.                    172800  IN      NS      b.gtld-servers.net.
com.                    172800  IN      NS      c.gtld-servers.net.
com.                    172800  IN      NS      d.gtld-servers.net.
com.                    172800  IN      NS      e.gtld-servers.net.
com.                    172800  IN      NS      f.gtld-servers.net.
com.                    172800  IN      NS      g.gtld-servers.net.
com.                    172800  IN      NS      a.gtld-servers.net.
com.                    172800  IN      NS      h.gtld-servers.net.
com.                    172800  IN      NS      i.gtld-servers.net.
com.                    172800  IN      NS      j.gtld-servers.net.
com.                    172800  IN      NS      k.gtld-servers.net.
com.                    172800  IN      NS      m.gtld-servers.net.
com.                    86400   IN      DS      30909 8 2 E2D3C916F6DEEAC73294E8268FB5885044A833FC5459588F4A9184CF C41A5766
com.                    86400   IN      RRSIG   DS 8 1 86400 20220910170000 20220828160000 20826 . ZOcv63FA+cxvmB97V4p5dhYmKhcuhrVVdL9cADFPnJHhnWr5UR0Tz7nG y4slLiY2BOdXZTmiS9U3DVbJU7ZUcUhRxSgSn/m+FjaunhFxBzGvBUJ3 Ojs6AzDC393eJ3rGj4sqJonaCEl1PknRoBh9IewR93wG/x6Q/2jZceh0 iX5CF3R84tyqzOd81FkvCdz8N2Ll0ksulGPTnZVcfFxi/g3n67ABu/mj KEaA1DBdi0pmlQa+JrCU4RQ5jlbhH47IY3HLo7OmaD3iiEnXtRKMSW10 h9trIxoPMKUGKGYugx70t19w3eUuWP7KMYnqbpofmbEify4zmHA1clWK HKLCVw==
;; Received 1187 bytes from 192.5.5.241#53(f.root-servers.net) in 1 ms

amazonaws.com.          172800  IN      NS      u1.amazonaws.com.
amazonaws.com.          172800  IN      NS      u2.amazonaws.com.
amazonaws.com.          172800  IN      NS      r1.amazonaws.com.
amazonaws.com.          172800  IN      NS      r2.amazonaws.com.
CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN NSEC3 1 1 0 - CK0Q2D6NI4I7EQH8NA30NS61O48UL8G5 NS SOA RRSIG DNSKEY NSEC3PARAM
CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN RRSIG NSEC3 8 2 86400 20220904042433 20220828031433 32298 com. Q8/GURHUPmV/ykhy1kMRfOyVR4SElk51JPrRU8ZNQaqSdSS6LHMibxKH mZLhMJTZKmLIQuvOLw+6r8Y/QB/g8onzYAuFILpc7Um8gAHY6tfJhO6a LHRlbYzAAvnEUlQ4ydgsE3C6/BKRw+YmalYmQTHdtbI/nEHKWJMSWWO1 cWugKBKwXk/9roUzi1dwsbdSDuhCHkurzy0/dErTk7O0lA==
F1RGUCLKMTBFFL151IQ24FPP76MU5QO7.com. 86400 IN NSEC3 1 1 0 - F1RHC3NO0KSGMN6J90SGARJ7FQ7CH0QR NS DS RRSIG
F1RGUCLKMTBFFL151IQ24FPP76MU5QO7.com. 86400 IN RRSIG NSEC3 8 2 86400 20220901060128 20220825045128 32298 com. DxTTpawF/cDmmc0fTiwxNwKduA4ZlvTZHCSxDLKNlrUvdK5mHS9HuPr3 Uajd0VLc1KAk6rx3a/Oj0/rfoKdc/36NPBIOIaobCOGGPeTYU2Hfl+ft TTLYFQ8l4BnHbeOEyg0sJWB/bCFEiBYz7yCX5X5N1C5p3EClQAIq+MCY 8GNEVfSw1629kOh1nVHpBnXBJnAMQlWLOuVMcKZ9glbdRQ==
;; Received 849 bytes from 192.35.51.30#53(f.gtld-servers.net) in 33 ms

us-east-1.amazonaws.com. 600    IN      NS      ns1.p31.dynect.net.
us-east-1.amazonaws.com. 600    IN      NS      ns2.p31.dynect.net.
us-east-1.amazonaws.com. 600    IN      NS      ns3.p31.dynect.net.
us-east-1.amazonaws.com. 600    IN      NS      ns4.p31.dynect.net.
us-east-1.amazonaws.com. 600    IN      NS      pdns1.ultradns.net.
us-east-1.amazonaws.com. 600    IN      NS      pdns3.ultradns.org.
us-east-1.amazonaws.com. 600    IN      NS      pdns5.ultradns.info.
us-east-1.amazonaws.com. 600    IN      NS      u1.amazonaws.com.
us-east-1.amazonaws.com. 600    IN      NS      u2.amazonaws.com.
us-east-1.amazonaws.com. 600    IN      NS      u3.amazonaws.com.
us-east-1.amazonaws.com. 600    IN      NS      u4.amazonaws.com.
us-east-1.amazonaws.com. 600    IN      NS      u5.amazonaws.com.
us-east-1.amazonaws.com. 600    IN      NS      u6.amazonaws.com.
;; Received 602 bytes from 205.251.192.27#53(r1.amazonaws.com) in 15 ms

ec2.us-east-1.amazonaws.com. 900 IN     NS      ns-911.amazonaws.com.
ec2.us-east-1.amazonaws.com. 900 IN     NS      ns-912.amazonaws.com.
ec2.us-east-1.amazonaws.com. 900 IN     NS      ns-921.amazonaws.com.
ec2.us-east-1.amazonaws.com. 900 IN     NS      ns-923.amazonaws.com.
ec2.us-east-1.amazonaws.com. 900 IN     NS      ns-931.amazonaws.com.
ec2.us-east-1.amazonaws.com. 900 IN     NS      ns-932.amazonaws.com.
;; Received 182 bytes from 156.154.66.10#53(u3.amazonaws.com) in 1 ms

ec2.us-east-1.amazonaws.com. 600 IN     CNAME   ec2.amazonaws.com.
ec2.amazonaws.com.      60      IN      A       52.46.143.246
;; Received 79 bytes from 34.196.62.143#53(ns-921.amazonaws.com) in 1 ms

ルートから問い合わせる場合は、正しく名前解決できました。

ec2.amazonaws.comはどうでしょうか。

$ dig ec2.amazonaws.com

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.5.2 <<>> ec2.amazonaws.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44661
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;ec2.amazonaws.com.             IN      A

;; ANSWER SECTION:
ec2.amazonaws.com.      28      IN      A       209.54.181.211

;; Query time: 2 msec
;; SERVER: 10.0.1.2#53(10.0.1.2)
;; WHEN: Mon Aug 29 00:30:18 UTC 2022
;; MSG SIZE  rcvd: 62

こちらについては名前解決できました。

APIを叩けるのかも確認してみます。

# インスタンスメタデータからインスタンスIDを取得
$ instance_id=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)

# 自身のインスタンスIDをAWS CLIで表示
$ aws ec2 describe-instances \
    --instance-ids "$instance_id" \
    --query 'Reservations[*].Instances[*].{Instance:InstanceId}' \
    --region us-east-1
Could not connect to the endpoint URL: "https://ec2.us-east-1.amazonaws.com/"

サービスエンドポイント(ec2.us-east-1.amazonaws.com)にアクセスできず、失敗してしまいました。名前解決もできないので当然といえば当然ですね。

VPCエンドポイントにサブネットを指定してみる

それでは、VPCエンドポイントにサブネットを指定してみます。

# VPCエンドポイントにサブネットを指定
$ aws ec2 modify-vpc-endpoint \
    --vpc-endpoint-id vpce-0d4e6262d3e098393 \
    --add-subnet-ids subnet-01547e4c9f8156a10 \
    --region us-east-1
{
    "Return": true
}

# VPCエンドポイントの確認
$ aws ec2 describe-vpc-endpoints
{
    "VpcEndpoints": [
        {
            "VpcEndpointId": "vpce-0d4e6262d3e098393",
            "VpcEndpointType": "Interface",
            "VpcId": "vpc-07715c76106d55335",
            "ServiceName": "com.amazonaws.us-east-1.ec2",
            "State": "available",
            "PolicyDocument": "{\n  \"Statement\": [\n    {\n      \"Action\": \"*\", \n      \"Effect\": \"Allow\", \n      \"Principal\": \"*\", \n      \"Resource\": \"*\"\n    }\n  ]\n}",
            "RouteTableIds": [],
            "SubnetIds": [
                "subnet-01547e4c9f8156a10"
            ],
            "Groups": [
                {
                    "GroupId": "sg-0d60564602ac7b781",
                    "GroupName": "Ec2InstaceStack-VPCEndpointSG3E5EA584-3S12B3HWZ9I0"
                }
            ],
            "IpAddressType": "ipv4",
            "DnsOptions": {
                "DnsRecordIpType": "ipv4"
            },
            "PrivateDnsEnabled": true,
            "RequesterManaged": false,
            "NetworkInterfaceIds": [
                "eni-0a176cb760eae7ac8"
            ],
            "DnsEntries": [
                {
                    "DnsName": "vpce-0d4e6262d3e098393-6i1wgrnd.ec2.us-east-1.vpce.amazonaws.com",
                    "HostedZoneId": "Z7HUB22UULQXV"
                },
                {
                    "DnsName": "vpce-0d4e6262d3e098393-6i1wgrnd-us-east-1a.ec2.us-east-1.vpce.amazonaws.com",
                    "HostedZoneId": "Z7HUB22UULQXV"
                },
                {
                    "DnsName": "ec2.us-east-1.amazonaws.com",
                    "HostedZoneId": "Z01562193PES35W8HNPFL"
                },
                {
                    "DnsName": "ec2.us-east-1.api.aws",
                    "HostedZoneId": "Z015729631CHLB73NFWL8"
                }
            ],
            "CreationTimestamp": "2022-08-29T00:25:48.965000+00:00",
            "Tags": [],
            "OwnerId": "<AWSアカウントID>"
        }
    ]
}

サブネットを指定するとENIが作成され、DNS名も設定されましたね。

サブネット指定後、ec2.us-east-1.amazonaws.comを名前解決してみます。

$ dig ec2.us-east-1.amazonaws.com
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.5.2 <<>> ec2.us-east-1.amazonaws.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35097
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;ec2.us-east-1.amazonaws.com.   IN      A

;; ANSWER SECTION:
ec2.us-east-1.amazonaws.com. 60 IN      A       10.0.1.60

;; Query time: 4 msec
;; SERVER: 10.0.1.2#53(10.0.1.2)
;; WHEN: Mon Aug 29 00:39:52 UTC 2022
;; MSG SIZE  rcvd: 72

サブネットを指定してから5分ぐらいで、名前解決できるようになりました。名前解決されたIPアドレスはVPC CIDR内のプライベートIPアドレスですね。

ec2.amazonaws.comも名前解決してみます。

$ dig ec2.amazonaws.com
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.5.2 <<>> ec2.amazonaws.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25301
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;ec2.amazonaws.com.             IN      A

;; ANSWER SECTION:
ec2.amazonaws.com.      34      IN      A       52.46.142.78

;; Query time: 4 msec
;; SERVER: 10.0.1.2#53(10.0.1.2)
;; WHEN: Mon Aug 29 00:41:21 UTC 2022
;; MSG SIZE  rcvd: 62

名前解決できました。こちらはグローバルIPアドレスのままです。

APIも叩けるか確認してみます。

# インスタンスメタデータからインスタンスIDを取得
$ instance_id=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)

# 自身のインスタンスIDをAWS CLIで表示
$ aws ec2 describe-instances \
    --instance-ids "$instance_id" \
    --query 'Reservations[*].Instances[*].{Instance:InstanceId}' \
    --region us-east-1
[
    [
        {
            "Instance": "i-021d5a5d8a3770f22"
        }
    ]
]

正常に実行できるようになりました。

インターフェイス型のVPCエンドポイントを作成する際は必ずサブネットを指定しよう

サブネットを指定せずに、インターフェイス型のVPCエンドポイントを作成した場合にどのような影響があるのかを確認してみました。

サブネットを指定しない = ENIが作成されない = サービスエンドポイントの名前解決ができない

というように、インターフェイス型のVPCエンドポイントを作成する際にサブネットを指定しないと思わぬトラブルに繋がりそうです。

例えば、本番運用しているVPCで、Cloud Watch LogsのVPCエンドポイントをサブネットを指定せずに作成すると、CloudWatch Logsにログを転送できなくなる なんてことになりそうです。

インターフェイス型のVPCエンドポイントを作成する際は必ずサブネットを指定しましょう。

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!