VPC Lattice経由でSSH接続してみた

VPC Lattice経由でSSH接続してみた

VPC LatticeでもSSHできる。が
Clock Icon2024.12.17

VPC Lattice経由でSSH接続してみたい

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

皆さんはVPC Lattice経由でSSH接続してみたいと思ったことはありますか? 私はあります。

アップデートによりVPC LatticeがTCP接続をサポートしました。

https://dev.classmethod.jp/articles/amazon-vpc-lattice-tcp-vpc-resources/

これにより従来はHTTP/1.1、HTTP/2、gRPCでしか接続できなかったVPC Latticeの可能性がさらに広がりました。

こちらのアップデートのユースケースとしてはよく挙げられているのはRDSやAuroraへの接続です。VPC Latticeが「アプリケーションネットワーキングサービス」なので、アプリケーションの流れでDB接続を例に挙げているのだと推測します。

他に気になるユースケースはSSH接続です。

VPCのCIDRが重複しているなどで、AWS PrivateLink経由でSSH接続する場合があります。

しかし、その場合は接続したいリソース数分だけInterface型VPCエンドポイントをConsumer側に作成する必要があります。

一方、VPC Latticeを用いるService Network型VPCエンドポイントやService Network型VPC Associationの場合は、Service Networkを介して複数のVPCリソースをまとめることができるため、Interface型VPCエンドポイントの管理、コストを削減することが可能になります。

どんな使い勝手なのか気になったので、試してみました。

いきなりまとめ

  • VPC Lattice経由でSSH接続できる
  • 2024/12/17時点ではEC2インスタンスにARN指定はできない
  • Service Network型VPC AssociationでVPCリソースにアクセスするためには、Service NetworkとResource Configurationの関連付け時に生成されるDNS名を指定する
  • Service Network型VPCエンドポイントの場合はENIが少なくとも2つ作成される
    • サブネットを1つしか指定しない場合は1つのサブネットにENIが2つ作成される
    • 各ENIごとにIPアドレスを17個消費する
    • IPアドレスの空きに余裕がある場合でもInsufficientFreeAddressesInSubnetとなることがある
  • Service Network型VPCエンドポイントのサブネットを追加、変更することはできない
  • Service Network型VPCエンドポイントのステータスが失敗となっていても接続はできる
    • 失敗の原因は不明

やってみた

検証環境

検証環境は以下のとおりです。

Service Network型VPC Association.png

EC2 Instance AからService Networkを介して別VPCのEC2インスタンスへSSH接続できることを確認します。

VPCおよびEC2インスタンスは作成済みです。

Resource Gatewayの作成

Resource Gatewayの作成から行います。

ProviderとなるVPC BとVPC Cそれぞれに作成します。

# VPC B
> aws vpc-lattice create-resource-gateway \
  --name test-rgw-b \
  --vpc-identifier vpc-057d85fe789426161 \
  --subnet-ids subnet-045926210c582421d subnet-08e5f8f55f4ccd69c \
  --security-group-ids sg-01730f460dd64aced \
  --ip-address-typ IPV4
{
    "arn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:resourcegateway/rgw-00880fe035ba94555",
    "id": "rgw-00880fe035ba94555",
    "ipAddressType": "IPV4",
    "name": "test-rgw-b",
    "securityGroupIds": [
        "sg-01730f460dd64aced"
    ],
    "status": "ACTIVE",
    "subnetIds": [
        "subnet-045926210c582421d",
        "subnet-08e5f8f55f4ccd69c"
    ],
    "vpcIdentifier": "vpc-057d85fe789426161"
}

# VPC C
aws vpc-lattice create-resource-gateway \
  --name test-rgw-c \
  --vpc-identifier vpc-0cc4f3b545dd1b0f9 \
  --subnet-ids subnet-0cc1376da797e5f86 subnet-0f456e274c91dacf8 \
  --security-group-ids sg-0cadd3a965eedf5d3 \
  --ip-address-typ IPV4
{
    "arn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:resourcegateway/rgw-064310ca457d4cc0d",
    "id": "rgw-064310ca457d4cc0d",
    "ipAddressType": "IPV4",
    "name": "test-rgw-c",
    "securityGroupIds": [
        "sg-0cadd3a965eedf5d3"
    ],
    "status": "ACTIVE",
    "subnetIds": [
        "subnet-0cc1376da797e5f86",
        "subnet-0f456e274c91dacf8"
    ],
    "vpcIdentifier": "vpc-0cc4f3b545dd1b0f9"
}

空きIPアドレスが16未満の場合はAn error occurred (ValidationException) when calling the CreateResourceGateway operation: Subnet <サブネットID> is not valid because it doesn't have the minimum number of IPv4 addresses. Specify a subnet with at least 16 IPv4 addresses.と怒られるので注意しましょう。

Resource Configurationの作成

Resource Configurationを作成します。

こちらもProviderとなるEC2インスタンスそれぞれに作成します。

# EC2 Instance B1
> aws vpc-lattice create-resource-configuration \
  --name test-rcfg-b1 \
  --allow-association-to-shareable-service-network \
  --port-ranges 22 \
  --protocol TCP \
  --type SINGLE \
  --resource-configuration-definition ipResource={ipAddress='10.10.10.53'} \
  --resource-gateway-identifier rgw-00880fe035ba94555
{
    "allowAssociationToShareableServiceNetwork": true,
    "arn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:resourceconfiguration/rcfg-0f8b3049b4a9710e0",
    "id": "rcfg-0f8b3049b4a9710e0",
    "name": "test-rcfg-b1",
    "portRanges": [
        "22"
    ],
    "protocol": "TCP",
    "resourceConfigurationDefinition": {
        "ipResource": {
            "ipAddress": "10.10.10.53"
        }
    },
    "resourceGatewayId": "rgw-00880fe035ba94555",
    "status": "ACTIVE",
    "type": "SINGLE"
}

# EC2 Instance B2
> aws vpc-lattice create-resource-configuration \
  --name test-rcfg-b2 \
  --allow-association-to-shareable-service-network \
  --port-ranges 22 \
  --protocol TCP \
  --type SINGLE \
  --resource-configuration-definition ipResource={ipAddress='10.10.10.117'} \
  --resource-gateway-identifier rgw-00880fe035ba94555
{
    "allowAssociationToShareableServiceNetwork": true,
    "arn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:resourceconfiguration/rcfg-0b39a245f47c880f8",
    "id": "rcfg-0b39a245f47c880f8",
    "name": "test-rcfg-b2",
    "portRanges": [
        "22"
    ],
    "protocol": "TCP",
    "resourceConfigurationDefinition": {
        "ipResource": {
            "ipAddress": "10.10.10.117"
        }
    },
    "resourceGatewayId": "rgw-00880fe035ba94555",
    "status": "ACTIVE",
    "type": "SINGLE"
}

# EC2 Instance C1
> aws vpc-lattice create-resource-configuration \
  --name test-rcfg-c1 \
  --allow-association-to-shareable-service-network \
  --port-ranges 22 \
  --protocol TCP \
  --type SINGLE \
  --resource-configuration-definition ipResource={ipAddress='10.10.10.7'} \
  --resource-gateway-identifier rgw-064310ca457d4cc0d
{
    "allowAssociationToShareableServiceNetwork": true,
    "arn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:resourceconfiguration/rcfg-052f0211d381fbcfc",
    "id": "rcfg-052f0211d381fbcfc",
    "name": "test-rcfg-c1",
    "portRanges": [
        "22"
    ],
    "protocol": "TCP",
    "resourceConfigurationDefinition": {
        "ipResource": {
            "ipAddress": "10.10.10.7"
        }
    },
    "resourceGatewayId": "rgw-064310ca457d4cc0d",
    "status": "ACTIVE",
    "type": "SINGLE"
}

リソースの指定は各EC2インスタンスのプライベートIPアドレスで行いました。EC2インスタンスのARNでも指定できるのかなと思ったのですが、ValidationException: ARN-based integration is only supported for RDS and not <EC2インスタンスのARN>と怒られました。ARN指定は現時点ではRDSのみのようです。

また、後ほどログがどのように出力されるのか気になったので、EC2 Instance B1のResource Configurationのみアクセスログの出力設定を行いました。

8.test-rcfg-b1にもアクセスログの設定をしている.png

Resource Configurationの設定が完了するとResource Gateway側から、どのResource Configurationが関連付いているのか確認できるようになりました。

1.test-rgw-b.png

Service Networkの作成

次にService Networkの作成を行います。

> aws vpc-lattice create-service-network \
  --name test-service-network-a \
  --auth-type NONE \
  --sharing-config enabled=true
{
    "arn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09",
    "authType": "NONE",
    "id": "sn-0fc4c78a8f94d8f09",
    "name": "test-service-network-a",
    "sharingConfig": {
        "enabled": true
    }
}

Service Networkをマネジメントコンソールから確認すると以下のとおりです。

2.test-service-network-a.png

追加で作成したService Networkにアクセスログの設定を行います。

> aws vpc-lattice create-access-log-subscription \
  --destination-arn 'arn:aws:logs:us-east-1:<AWSアカウントID>:log-group:/aws/resource-configuration/:*' \
  --resource-identifier sn-0fc4c78a8f94d8f09 \
  --service-network-log-type RESOURCE
{
    "arn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:accesslogsubscription/als-0d81cdd87dd014c8f",
    "destinationArn": "arn:aws:logs:us-east-1:<AWSアカウントID>:log-group:/aws/resource-configuration/:*",
    "id": "als-0d81cdd87dd014c8f",
    "resourceArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09",
    "resourceId": "sn-0fc4c78a8f94d8f09",
    "serviceNetworkLogType": "RESOURCE"
}

Service NetworkとResource Configurationの関連付け

Service Networkと各Resource Configurationの関連付けを行います。

# EC2 Instance B1 の Resource Configuration
> aws vpc-lattice create-service-network-resource-association \
  --resource-configuration-identifier rcfg-0f8b3049b4a9710e0 \
  --service-network-identifier sn-0fc4c78a8f94d8f09
{
    "arn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetworkresourceassociation/snra-02edb58563f73e5e5",
    "createdBy": "<AWSアカウントID>",
    "id": "snra-02edb58563f73e5e5",
    "status": "CREATE_IN_PROGRESS"
}

# EC2 Instance B2 の Resource Configuration
> aws vpc-lattice create-service-network-resource-association \
  --resource-configuration-identifier rcfg-0b39a245f47c880f8 \
  --service-network-identifier sn-0fc4c78a8f94d8f09
{
    "arn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetworkresourceassociation/snra-03933dc55a22e41c2",
    "createdBy": "<AWSアカウントID>",
    "id": "snra-03933dc55a22e41c2",
    "status": "CREATE_IN_PROGRESS"
}

# EC2 Instance C1 の Resource Configuration
> aws vpc-lattice create-service-network-resource-association \
  --resource-configuration-identifier rcfg-052f0211d381fbcfc \
  --service-network-identifier sn-0fc4c78a8f94d8f09
{
    "arn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetworkresourceassociation/snra-08e6b95e785a5ce29",
    "createdBy": "<AWSアカウントID>",
    "id": "snra-08e6b95e785a5ce29",
    "status": "CREATE_IN_PROGRESS"
}

> aws vpc-lattice list-service-network-resource-associations
{
    "items": [
        {
            "arn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetworkresourceassociation/snra-03933dc55a22e41c2",
            "createdAt": "2024-12-16T08:51:19.255000+00:00",
            "createdBy": "<AWSアカウントID>",
            "dnsEntry": {
                "domainName": "snra-03933dc55a22e41c2.rcfg-0b39a245f47c880f8.4232ccc.vpc-lattice-rsc.us-east-1.on.aws",
                "hostedZoneId": "Z08285483B41F6ASEM5U1"
            },
            "id": "snra-03933dc55a22e41c2",
            "isManagedAssociation": false,
            "resourceConfigurationArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:resourceconfiguration/rcfg-0b39a245f47c880f8",
            "resourceConfigurationId": "rcfg-0b39a245f47c880f8",
            "resourceConfigurationName": "test-rcfg-b2",
            "serviceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09",
            "serviceNetworkId": "sn-0fc4c78a8f94d8f09",
            "serviceNetworkName": "test-service-network-a",
            "status": "ACTIVE"
        },
        {
            "arn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetworkresourceassociation/snra-08e6b95e785a5ce29",
            "createdAt": "2024-12-16T08:51:38.525000+00:00",
            "createdBy": "<AWSアカウントID>",
            "dnsEntry": {
                "domainName": "snra-08e6b95e785a5ce29.rcfg-052f0211d381fbcfc.4232ccc.vpc-lattice-rsc.us-east-1.on.aws",
                "hostedZoneId": "Z08285483B41F6ASEM5U1"
            },
            "id": "snra-08e6b95e785a5ce29",
            "isManagedAssociation": false,
            "resourceConfigurationArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:resourceconfiguration/rcfg-052f0211d381fbcfc",
            "resourceConfigurationId": "rcfg-052f0211d381fbcfc",
            "resourceConfigurationName": "test-rcfg-c1",
            "serviceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09",
            "serviceNetworkId": "sn-0fc4c78a8f94d8f09",
            "serviceNetworkName": "test-service-network-a",
            "status": "ACTIVE"
        },
        {
            "arn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetworkresourceassociation/snra-02edb58563f73e5e5",
            "createdAt": "2024-12-16T08:50:50.732000+00:00",
            "createdBy": "<AWSアカウントID>",
            "dnsEntry": {
                "domainName": "snra-02edb58563f73e5e5.rcfg-0f8b3049b4a9710e0.4232ccc.vpc-lattice-rsc.us-east-1.on.aws",
                "hostedZoneId": "Z08285483B41F6ASEM5U1"
            },
            "id": "snra-02edb58563f73e5e5",
            "isManagedAssociation": false,
            "resourceConfigurationArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:resourceconfiguration/rcfg-0f8b3049b4a9710e0",
            "resourceConfigurationId": "rcfg-0f8b3049b4a9710e0",
            "resourceConfigurationName": "test-rcfg-b1",
            "serviceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09",
            "serviceNetworkId": "sn-0fc4c78a8f94d8f09",
            "serviceNetworkName": "test-service-network-a",
            "status": "ACTIVE"
        }
    ]
}

関連付けを行うとDNS名が発行されていることが確認できます。

マネジメントコンソールから確認すると以下のとおりです。

5.snra-02edb58563f73e5e5.png

なお、こちらのホストゾーンはAWSマネージドであり、ユーザーのAWSアカウントのRoute 53 Hosted Zoneから確認することはできません。

6.ユーザーはそのホストゾーンを確認できない.png

アクセスする際はこのDNS名を用いて行います。

参考までにResource ConfigurationとService Network関連付け後のResource Gatewayをマネジメントコンソールから確認すると以下のとおりです。

4.test-rcfg-b1.png

Service NetworkとVPCの関連付け

Service NetworkとVPCの関連付けを行います。

> aws vpc-lattice create-service-network-vpc-association \
  --service-network-identifier sn-0fc4c78a8f94d8f09 \
  --vpc-identifier vpc-0d54cbe88a44ffd04 \
  --security-group-ids sg-0e2239cc74c5c84f9
{
    "arn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetworkvpcassociation/snva-0b9433d39cea1e073",
    "createdBy": "<AWSアカウントID>",
    "id": "snva-0b9433d39cea1e073",
    "securityGroupIds": [
        "sg-0e2239cc74c5c84f9"
    ],
    "status": "CREATE_IN_PROGRESS"
}

> aws vpc-lattice list-service-network-vpc-associations \
  --service-network-identifier sn-0fc4c78a8f94d8f09
{
    "items": [
        {
            "arn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetworkvpcassociation/snva-0b9433d39cea1e073",
            "createdAt": "2024-12-16T08:55:48.348000+00:00",
            "createdBy": "<AWSアカウントID>",
            "id": "snva-0b9433d39cea1e073",
            "lastUpdatedAt": "2024-12-16T08:56:51.479000+00:00",
            "serviceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09",
            "serviceNetworkId": "sn-0fc4c78a8f94d8f09",
            "serviceNetworkName": "test-service-network-a",
            "status": "ACTIVE",
            "vpcId": "vpc-0d54cbe88a44ffd04"
        }
    ]
}

関連付けが完了しました。

関連付けによってルートテーブルにVPC Latticeをターゲットとするルートが追加されました。

3.関連付けによってルートが追加された.png

Service Network型VPC Associationを介してSSHできるか確認

Service Network型VPC Associationを介してSSHできるか確認していきます。

EC2 Instance B1のDNS名の名前解決をします。

$ dig snra-02edb58563f73e5e5.rcfg-0f8b3049b4a9710e0.4232ccc.vpc-lattice-rsc.us-east-1.on.aws

; <<>> DiG 9.18.28 <<>> snra-02edb58563f73e5e5.rcfg-0f8b3049b4a9710e0.4232ccc.vpc-lattice-rsc.us-east-1.on.aws
.
.
(中略)
.
.
;; QUESTION SECTION:
;snra-02edb58563f73e5e5.rcfg-0f8b3049b4a9710e0.4232ccc.vpc-lattice-rsc.us-east-1.on.aws.        IN A

;; ANSWER SECTION:
snra-02edb58563f73e5e5.rcfg-0f8b3049b4a9710e0.4232ccc.vpc-lattice-rsc.us-east-1.on.aws. 60 IN A 129.224.52.10

;; Query time: 9 msec
;; SERVER: 10.10.10.2#53(10.10.10.2) (UDP)
;; WHEN: Mon Dec 16 09:40:11 UTC 2024
;; MSG SIZE  rcvd: 131

名前解決できましたね。

それではSSHしてみます。

EC2 Instance B1
$ ssh ec2-user@snra-02edb58563f73e5e5.rcfg-0f8b3049b4a9710e0.4232ccc.vpc-lattice-rsc.us-east-1.on.aws -i ~/.ssh/non-97-test.pem
The authenticity of host 'snra-02edb58563f73e5e5.rcfg-0f8b3049b4a9710e0.4232ccc.vpc-lattice-rsc.us-east-1.on.aws (129.224.52.10)' can't be established.
.
.
(中略)
.
.
Warning: Permanently added 'snra-02edb58563f73e5e5.rcfg-0f8b3049b4a9710e0.4232ccc.vpc-lattice-rsc.us-east-1.on.aws' (ED25519) to the list of known hosts.
   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'

$ hostname -i
10.10.10.53

$ TOKEN=$(
  curl -X PUT "http://169.254.169.254/latest/api/token" \
    -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" \
    -s
  )

$ curl \
  -H "X-aws-ec2-metadata-token: $TOKEN" \
  http://169.254.169.254/latest/meta-data/instance-id
i-0902bb7c744b89712

$ exit
logout
Connection to snra-02edb58563f73e5e5.rcfg-0f8b3049b4a9710e0.4232ccc.vpc-lattic closed.

正常にSSH接続できました。

同様に他EC2インスタンスにもVPC LatticeのService Network型VPC Associationを介してSSHできることを確認します。

EC2 Instance B2
$ ssh ec2-user@snra-03933dc55a22e41c2.rcfg-0b39a245f47c880f8.4232ccc.vpc-lattice-rsc.us-east-1.on.aws -i ~/.ssh/non-97-test.pem
The authenticity of host 'snra-03933dc55a22e41c2.rcfg-0b39a245f47c880f8.4232ccc.vpc-lattice-rsc.us-east-1.on.aws (129.224.52.0)' can't be established.
.
.
(中略)
.
.
Warning: Permanently added 'snra-03933dc55a22e41c2.rcfg-0b39a245f47c880f8.4232ccc.vpc-lattice-rsc.us-east-1.on.aws' (ED25519) to the list of known hosts.
   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
$ hostname -i
10.10.10.117

$ TOKEN=$(
  curl -X PUT "http://169.254.169.254/latest/api/token" \
    -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" \
    -s
  )

$ curl \
  -H "X-aws-ec2-metadata-token: $TOKEN" \
  http://169.254.169.254/latest/meta-data/instance-id
i-0ae4b4d9c4e67eef0

$ exit
logout
Connection to snra-03933dc55a22e41c2.rcfg-0b39a245f47c880f8.4232ccc.vpc-lattic closed.
EC2 Instance C1
$ ssh ec2-user@snra-08e6b95e785a5ce29.rcfg-052f0211d381fbcfc.4232ccc.vpc-lattice-rsc.us-east-1.on.aws -i ~/.ssh/non-97-test.pem
The authenticity of host 'snra-08e6b95e785a5ce29.rcfg-052f0211d381fbcfc.4232ccc.vpc-lattice-rsc.us-east-1.on.aws (129.224.52.1)' can't be established.
.
.
(中略)
.
.
Warning: Permanently added 'snra-08e6b95e785a5ce29.rcfg-052f0211d381fbcfc.4232ccc.vpc-lattice-rsc.us-east-1.on.aws' (ED25519) to the list of known hosts.
   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'

$ hostname -i
10.10.10.7

$ TOKEN=$(
  curl -X PUT "http://169.254.169.254/latest/api/token" \
    -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" \
    -s
  )

$ curl \
  -H "X-aws-ec2-metadata-token: $TOKEN" \
  http://169.254.169.254/latest/meta-data/instance-id
i-0356f8e0e11769b84

いずれも正常にSSH接続できました。

CloudWatch Logsを確認するとResource Configuration及び、Service Network単位でログストリームが作成されています。

7.:aws:resource-configuration:.png.png

実際にCloudWatch Logsに出力されたログは以下のとおりです。

/aws/vpc-lattice/resource-access-logs/rcfg-0f8b3049b4a9710e0
{
    "eventTimestamp": "2024-12-16T09:40:46.539Z",
    "serviceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09",
    "serviceNetworkResourceAssociationId": "snra-02edb58563f73e5e5",
    "sourceVpcArn": "arn:aws:ec2:us-east-1:<AWSアカウントID>:vpc/vpc-0d54cbe88a44ffd04",
    "resourceConfigurationArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:resourceconfiguration/rcfg-0f8b3049b4a9710e0",
    "protocol": "tcp",
    "sourceIpPort": "10.10.10.36:56200",
    "destinationIpPort": "129.224.52.10:22",
    "gatewayIpPort": "10.10.10.33:52008",
    "resourceIpPort": "10.10.10.53:22"
}
/aws/vpc-lattice/resource-access-logs/sn-0fc4c78a8f94d8f09
{
    "eventTimestamp": "2024-12-16T09:40:46.539Z",
    "serviceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09",
    "serviceNetworkResourceAssociationId": "snra-02edb58563f73e5e5",
    "sourceVpcArn": "arn:aws:ec2:us-east-1:<AWSアカウントID>:vpc/vpc-0d54cbe88a44ffd04",
    "resourceConfigurationArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:resourceconfiguration/rcfg-0f8b3049b4a9710e0",
    "protocol": "tcp",
    "sourceIpPort": "10.10.10.36:56200",
    "destinationIpPort": "129.224.52.10:22"
}
{
    "eventTimestamp": "2024-12-16T09:47:19.989Z",
    "serviceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09",
    "serviceNetworkResourceAssociationId": "snra-03933dc55a22e41c2",
    "sourceVpcArn": "arn:aws:ec2:us-east-1:<AWSアカウントID>:vpc/vpc-0d54cbe88a44ffd04",
    "resourceConfigurationArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:resourceconfiguration/rcfg-0b39a245f47c880f8",
    "protocol": "tcp",
    "sourceIpPort": "10.10.10.36:34104",
    "destinationIpPort": "129.224.52.0:22"
}
{
    "eventTimestamp": "2024-12-16T09:49:49.116Z",
    "serviceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09",
    "serviceNetworkResourceAssociationId": "snra-08e6b95e785a5ce29",
    "sourceVpcArn": "arn:aws:ec2:us-east-1:<AWSアカウントID>:vpc/vpc-0d54cbe88a44ffd04",
    "resourceConfigurationArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:resourceconfiguration/rcfg-052f0211d381fbcfc",
    "protocol": "tcp",
    "sourceIpPort": "10.10.10.36:36794",
    "destinationIpPort": "129.224.52.1:22"
}

セッション確立時のログが記録されていますね。SSH経由でコマンドを叩く度にログ出力されるようなものではないようです。

VPCリソースごとにログ出力を分けたい場合は、Resource Configuration単位でアクセスログ設定をすると良いでしょう。

Service Network型VPCエンドポイントの作成

せっかくなので、Service Network型VPCエンドポイント経由でもSSHできるか確認します。

構成図としては以下になります。

Service Network型VPCエンドポイント.png

※ Service Network型VPC Associationは一緒に描くと複雑になるため省略

Service Network型VPCエンドポイントの場合は適切なルーティングをしてあげればオンプレミスからも接続することが可能になります。

VPCエンドポイントを作成します。

> aws ec2 create-vpc-endpoint \
  --vpc-endpoint-type ServiceNetwork \
  --service-network-arn arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09 \
  --vpc-id vpc-0d54cbe88a44ffd04 \
  --subnet-ids subnet-0a84d8f4554925b16 subnet-0f6a1ce53b9fd9793 \
  --security-group-ids sg-0e2239cc74c5c84f9 \
  --private-dns-enabled
{
    "VpcEndpoint": {
        "VpcEndpointId": "vpce-031c89b7b6224200f",
        "VpcEndpointType": "ServiceNetwork",
        "VpcId": "vpc-0d54cbe88a44ffd04",
        "State": "Pending",
        "SubnetIds": [
            "subnet-0a84d8f4554925b16",
            "subnet-0f6a1ce53b9fd9793"
        ],
        "Groups": [
            {
                "GroupId": "sg-0e2239cc74c5c84f9",
                "GroupName": "default"
            }
        ],
        "IpAddressType": "IPV4",
        "PrivateDnsEnabled": true,
        "CreationTimestamp": "2024-12-16T10:41:14.461000+00:00",
        "Tags": [],
        "OwnerId": "<AWSアカウントID>",
        "ServiceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09"
    }
}

> aws ec2 describe-vpc-endpoints --vpc-endpoint-ids vpce-031c89b7b6224200f
{
    "VpcEndpoints": [
        {
            "VpcEndpointId": "vpce-031c89b7b6224200f",
            "VpcEndpointType": "ServiceNetwork",
            "VpcId": "vpc-0d54cbe88a44ffd04",
            "State": "Failed",
            "SubnetIds": [
                "subnet-0a84d8f4554925b16",
                "subnet-0f6a1ce53b9fd9793"
            ],
            "Groups": [
                {
                    "GroupId": "sg-0e2239cc74c5c84f9",
                    "GroupName": "default"
                }
            ],
            "IpAddressType": "IPV4",
            "PrivateDnsEnabled": true,
            "NetworkInterfaceIds": [
                "eni-0d8e476435913e924",
                "eni-0b16caf5a26b85ccb"
            ],
            "CreationTimestamp": "2024-12-16T10:41:14.461000+00:00",
            "Tags": [],
            "OwnerId": "<AWSアカウントID>",
            "ServiceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09"
        }
    ]
}

おや、失敗しました。

失敗の原因はマネジメントコンソールを見ても記載ありませんでした。

9.失敗.png

もしかすると、VPCと関連付けている場合はプライベートDNS名を有効にできないなどあるのでしょうか。

プライベートDNS名を無効にして再度チャレンジします。

> aws ec2 create-vpc-endpoint \
  --vpc-endpoint-type ServiceNetwork \
  --service-network-arn arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09 \
  --vpc-id vpc-0d54cbe88a44ffd04 \
  --subnet-ids subnet-0a84d8f4554925b16 subnet-0f6a1ce53b9fd9793 \
  --security-group-ids sg-0e2239cc74c5c84f9 \
  --no-private-dns-enabled
{
    "VpcEndpoint": {
        "VpcEndpointId": "vpce-093c4839ef012c65e",
        "VpcEndpointType": "ServiceNetwork",
        "VpcId": "vpc-0d54cbe88a44ffd04",
        "State": "Pending",
        "SubnetIds": [
            "subnet-0a84d8f4554925b16",
            "subnet-0f6a1ce53b9fd9793"
        ],
        "Groups": [
            {
                "GroupId": "sg-0e2239cc74c5c84f9",
                "GroupName": "default"
            }
        ],
        "IpAddressType": "IPV4",
        "PrivateDnsEnabled": false,
        "CreationTimestamp": "2024-12-16T10:46:22.723000+00:00",
        "Tags": [],
        "OwnerId": "<AWSアカウントID>",
        "ServiceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09"
    }
}

> aws ec2 describe-vpc-endpoints --vpc-endpoint-ids vpce-093c4839ef012c65e
{
    "VpcEndpoints": [
        {
            "VpcEndpointId": "vpce-093c4839ef012c65e",
            "VpcEndpointType": "ServiceNetwork",
            "VpcId": "vpc-0d54cbe88a44ffd04",
            "State": "Available",
            "SubnetIds": [
                "subnet-0a84d8f4554925b16",
                "subnet-0f6a1ce53b9fd9793"
            ],
            "Groups": [
                {
                    "GroupId": "sg-0e2239cc74c5c84f9",
                    "GroupName": "default"
                }
            ],
            "IpAddressType": "IPV4",
            "PrivateDnsEnabled": false,
            "NetworkInterfaceIds": [],
            "CreationTimestamp": "2024-12-16T10:46:22.723000+00:00",
            "Tags": [],
            "OwnerId": "<AWSアカウントID>",
            "ServiceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09"
        }
    ]
}

Availableになりました。

しかし、マネジメントコンソールから関連付けの状態を確認するとInsufficientFreeAddressesInSubnetとなっていました。

10.InsufficientFreeAddressesInSubnet.png

VPCエンドポイントで指定したサブネットの利用可能なIPv4アドレスは40個です。余裕はあるようですが判定は謎です。

11.利用可能な IPv4 アドレス40.png

試しに表示されたDNS名に対して名前解決しましたが、名前解決できませんでした。

$ dig vpce-093c4839ef012c65e-snra-02edb58563f73e5e5.rcfg-0f8b3049b4a9710e0.4232ccc.vpc-lattice-rsc.us-east-1.on.aws

; <<>> DiG 9.18.28 <<>> vpce-093c4839ef012c65e-snra-02edb58563f73e5e5.rcfg-0f8b3049b4a9710e0.4232ccc.vpc-lattice-rsc.us-east-1.on.aws
.
.
(中略)
.
.
;; QUESTION SECTION:
;vpce-093c4839ef012c65e-snra-02edb58563f73e5e5.rcfg-0f8b3049b4a9710e0.4232ccc.vpc-lattice-rsc.us-east-1.on.aws. IN A

;; AUTHORITY SECTION:
4232ccc.vpc-lattice-rsc.us-east-1.on.aws. 572 IN SOA ns-336.awsdns-42.com. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400

;; Query time: 0 msec
;; SERVER: 10.10.10.2#53(10.10.10.2) (UDP)
;; WHEN: Mon Dec 16 10:52:43 UTC 2024
;; MSG SIZE  rcvd: 219

AWSマネジメントコンソールで作成すると変わるのでしょうか。

12.マネジメントコンソールから作成.png

今度はInsufficientFreeAddressesInSubnetではなく、失敗となりました。

13.失敗2回目.png

判定が難しいですね。

Service NetworkとVPCの関連付けを解除して、状況変わるのか確認します。

> aws vpc-lattice delete-service-network-vpc-association --service-network-vpc-association-identifier snva-0b9433d39cea1e073
{
    "arn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetworkvpcassociation/snva-0b9433d39cea1e073",
    "id": "snva-0b9433d39cea1e073",
    "status": "DELETE_IN_PROGRESS"
}

> aws vpc-lattice list-service-network-vpc-associations \
  --service-network-identifier sn-0fc4c78a8f94d8f09
{
    "items": []
}

AWS CLIで作成します。

>  aws ec2 create-vpc-endpoint \
  --vpc-endpoint-type ServiceNetwork \
  --service-network-arn arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09 \
  --vpc-id vpc-0d54cbe88a44ffd04 \
  --subnet-ids subnet-0a84d8f4554925b16 subnet-0f6a1ce53b9fd9793 \
  --security-group-ids sg-0e2239cc74c5c84f9 \
  --private-dns-enabled
{
    "VpcEndpoint": {
        "VpcEndpointId": "vpce-0624d4a2ed2bdb10c",
        "VpcEndpointType": "ServiceNetwork",
        "VpcId": "vpc-0d54cbe88a44ffd04",
        "State": "Pending",
        "SubnetIds": [
            "subnet-0a84d8f4554925b16",
            "subnet-0f6a1ce53b9fd9793"
        ],
        "Groups": [
            {
                "GroupId": "sg-0e2239cc74c5c84f9",
                "GroupName": "default"
            }
        ],
        "IpAddressType": "IPV4",
        "PrivateDnsEnabled": true,
        "CreationTimestamp": "2024-12-16T11:07:19.227000+00:00",
        "Tags": [],
        "OwnerId": "<AWSアカウントID>",
        "ServiceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09"
    }
}

しかし結果はInsufficientFreeAddressesInSubnetと変わりありませんでした。

InsufficientFreeAddressesInSubnetなら範囲の広いネットワークアドレスとを持っているサブネットを作成し、そこにVPCエンドポイントを立ててみます。

用意したサブネットのサブネットマスクは/25で切ったので、利用可能なIPv4アドレスは123です。

19.利用可能な IPv4 アドレス  123.png

この状態でVPCエンドポイントを作成します。

すると、VPCエンドポイントの作成が正常に行えました。

15.VPCエンドポイントの作成ができた.png

>  aws ec2 describe-vpc-endpoints --vpc-endpoint-ids vpce-0a24ed2de86d21e73
{
    "VpcEndpoints": [
        {
            "VpcEndpointId": "vpce-0a24ed2de86d21e73",
            "VpcEndpointType": "ServiceNetwork",
            "VpcId": "vpc-0d54cbe88a44ffd04",
            "State": "Available",
            "SubnetIds": [
                "subnet-0ccd753a9867e9f72"
            ],
            "Groups": [
                {
                    "GroupId": "sg-0e2239cc74c5c84f9",
                    "GroupName": "default"
                }
            ],
            "IpAddressType": "IPV4",
            "PrivateDnsEnabled": true,
            "NetworkInterfaceIds": [
                "eni-06befb018998da374"
            ],
            "CreationTimestamp": "2024-12-16T11:17:22.354000+00:00",
            "Tags": [],
            "OwnerId": "<AWSアカウントID>",
            "ServiceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09"
        }
    ]
}

>  aws ec2 describe-vpc-endpoint-associations --vpc-endpoint-ids vpce-0a24ed2de86d21e73
{
    "VpcEndpointAssociations": [
        {
            "Id": "vpce-rsc-asc-033f5b90aecc31479",
            "VpcEndpointId": "vpce-0a24ed2de86d21e73",
            "ServiceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09",
            "ServiceNetworkName": "test-service-network-a",
            "AssociatedResourceAccessibility": "Accessible",
            "DnsEntry": {
                "DnsName": "vpce-0a24ed2de86d21e73-snra-08e6b95e785a5ce29.rcfg-052f0211d381fbcfc.4232ccc.vpc-lattice-rsc.us-east-1.on.aws",
                "HostedZoneId": "Z08285483B41F6ASEM5U1"
            },
            "AssociatedResourceArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:resourceconfiguration/rcfg-052f0211d381fbcfc"
        },
        {
            "Id": "vpce-rsc-asc-056a5c5beb0784787",
            "VpcEndpointId": "vpce-0a24ed2de86d21e73",
            "ServiceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09",
            "ServiceNetworkName": "test-service-network-a",
            "AssociatedResourceAccessibility": "Accessible",
            "DnsEntry": {
                "DnsName": "vpce-0a24ed2de86d21e73-snra-03933dc55a22e41c2.rcfg-0b39a245f47c880f8.4232ccc.vpc-lattice-rsc.us-east-1.on.aws",
                "HostedZoneId": "Z08285483B41F6ASEM5U1"
            },
            "AssociatedResourceArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:resourceconfiguration/rcfg-0b39a245f47c880f8"
        },
        {
            "Id": "vpce-rsc-asc-08a452a9b465ba992",
            "VpcEndpointId": "vpce-0a24ed2de86d21e73",
            "ServiceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09",
            "ServiceNetworkName": "test-service-network-a",
            "AssociatedResourceAccessibility": "Accessible",
            "DnsEntry": {
                "DnsName": "vpce-0a24ed2de86d21e73-snra-02edb58563f73e5e5.rcfg-0f8b3049b4a9710e0.4232ccc.vpc-lattice-rsc.us-east-1.on.aws",
                "HostedZoneId": "Z08285483B41F6ASEM5U1"
            },
            "AssociatedResourceArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:resourceconfiguration/rcfg-0f8b3049b4a9710e0"
        }
    ]
}

サブネットの利用可能なIPv4アドレスを確認すると、89になっていました。34個もIPアドレスを消費しています。

14.サブネットのIPアドレスを大量に使用する.png

このサブネットのENIを確認してみましょう。

> aws ec2 describe-network-interfaces \
  --filters "Name=subnet-id,Values=subnet-0ccd753a9867e9f72"
{
    "NetworkInterfaces": [
        {
            "Attachment": {
                "AttachmentId": "ela-attach-0ca75aa13ecc52551",
                "DeleteOnTermination": false,
                "DeviceIndex": 1,
                "InstanceOwnerId": "amazon-aws",
                "Status": "attached"
            },
            "AvailabilityZone": "us-east-1a",
            "Description": "VPC Endpoint Interface vpce-001aec494db35f597",
            "Groups": [
                {
                    "GroupId": "sg-0e2239cc74c5c84f9",
                    "GroupName": "default"
                }
            ],
            "InterfaceType": "interface",
            "Ipv6Addresses": [],
            "MacAddress": "0e:8b:4a:e1:57:c7",
            "NetworkInterfaceId": "eni-0caa10eaf3eae2e40",
            "OwnerId": "<AWSアカウントID>",
            "PrivateDnsName": "ip-10-10-10-160.ec2.internal",
            "PrivateIpAddress": "10.10.10.160",
            "PrivateIpAddresses": [
                {
                    "Primary": true,
                    "PrivateDnsName": "ip-10-10-10-160.ec2.internal",
                    "PrivateIpAddress": "10.10.10.160"
                }
            ],
            "Ipv4Prefixes": [
                {
                    "Ipv4Prefix": "10.10.10.208/28"
                }
            ],
            "Ipv6Prefixes": [],
            "RequesterId": "396074869647",
            "RequesterManaged": true,
            "SourceDestCheck": true,
            "Status": "in-use",
            "SubnetId": "subnet-0ccd753a9867e9f72",
            "TagSet": [
                {
                    "Key": "VpcLatticeManaged",
                    "Value": "true"
                }
            ],
            "VpcId": "vpc-0d54cbe88a44ffd04",
            "DenyAllIgwTraffic": true,
            "Operator": {
                "Managed": false
            }
        },
        {
            "Attachment": {
                "AttachmentId": "ela-attach-003db07b168dc5d00",
                "DeleteOnTermination": false,
                "DeviceIndex": 1,
                "InstanceOwnerId": "amazon-aws",
                "Status": "attached"
            },
            "AvailabilityZone": "us-east-1a",
            "Description": "VPC Endpoint Interface: vpce-001aec494db35f597",
            "Groups": [
                {
                    "GroupId": "sg-0e2239cc74c5c84f9",
                    "GroupName": "default"
                }
            ],
            "InterfaceType": "interface",
            "Ipv6Addresses": [],
            "MacAddress": "0e:55:36:14:92:e1",
            "NetworkInterfaceId": "eni-05423bae1b0e404c7",
            "OwnerId": "<AWSアカウントID>",
            "PrivateDnsName": "ip-10-10-10-253.ec2.internal",
            "PrivateIpAddress": "10.10.10.253",
            "PrivateIpAddresses": [
                {
                    "Primary": true,
                    "PrivateDnsName": "ip-10-10-10-253.ec2.internal",
                    "PrivateIpAddress": "10.10.10.253"
                }
            ],
            "Ipv4Prefixes": [
                {
                    "Ipv4Prefix": "10.10.10.192/28"
                }
            ],
            "Ipv6Prefixes": [],
            "RequesterId": "396074869647",
            "RequesterManaged": true,
            "SourceDestCheck": true,
            "Status": "in-use",
            "SubnetId": "subnet-0ccd753a9867e9f72",
            "TagSet": [
                {
                    "Key": "VpcLatticeManaged",
                    "Value": "true"
                }
            ],
            "VpcId": "vpc-0d54cbe88a44ffd04",
            "DenyAllIgwTraffic": true,
            "Operator": {
                "Managed": false
            }
        }
    ]
}

ENIが2つ存在し、それぞれIpv4Prefixesとして10.10.10.192/2810.10.10.208/28が設定されています。

/28は16個のIPアドレスが含まれます。(割り当てできないネットワークアドレスとブロードキャストアドレス含む)

ENIのプライマリIPv4アドレスはIpv4Prefixesの範囲外から使用しているので、ENIあたり1つ消費しています。

そのため、

(Ipv4Prefixes/28の16個のIPアドレス + プライマリIPv4アドレスは1個) × 2 ENI = 34 IPアドレス

を使用していることが分かります。

かなりIPアドレス消費するようですね。

Service Networkが細かく分けている場合だとあっという間にIPアドレスが枯渇しそうです。

Service Network型VPCエンドポイントを介してSSHできるか確認

Service Network型VPCエンドポイントを介してSSHできるか確認します。

まず、名前解決です。

$ dig vpce-0a24ed2de86d21e73-snra-08e6b95e785a5ce29.rcfg-052f0211d381fbcfc.4232ccc.vpc-lattice-rsc.us-east-1.on.aws

; <<>> DiG 9.18.28 <<>> vpce-0a24ed2de86d21e73-snra-08e6b95e785a5ce29.rcfg-052f0211d381fbcfc.4232ccc.vpc-lattice-rsc.us-east-1.on.aws
.
.
(中略)
.
.
;; QUESTION SECTION:
;vpce-0a24ed2de86d21e73-snra-08e6b95e785a5ce29.rcfg-052f0211d381fbcfc.4232ccc.vpc-lattice-rsc.us-east-1.on.aws. IN A

;; ANSWER SECTION:
vpce-0a24ed2de86d21e73-snra-08e6b95e785a5ce29.rcfg-052f0211d381fbcfc.4232ccc.vpc-lattice-rsc.us-east-1.on.aws. 60 IN A 10.10.10.238

;; Query time: 9 msec
;; SERVER: 10.10.10.2#53(10.10.10.2) (UDP)
;; WHEN: Mon Dec 16 11:24:02 UTC 2024
;; MSG SIZE  rcvd: 154

問題なくできました。

SSHします。

$ ssh ec2-user@vpce-0a24ed2de86d21e73-snra-08e6b95e785a5ce29.rcfg-052f0211d381fbcfc.4232ccc.vpc-lattice-rsc.us-east-1.on.aws -i ~/.ssh/non-97-test.pem
The authenticity of host 'vpce-0a24ed2de86d21e73-snra-08e6b95e785a5ce29.rcfg-052f0211d381fbcfc.4232ccc.vpc-lattice-rsc.us-east-1.on.aws (10.10.10.238)' can't be established.
ED25519 key fingerprint is SHA256:a/RyD++RyG8Eq939VoLuUzqMonQGgnUZx2KrlqseAX4.
.
.
(中略)
.
.
Warning: Permanently added 'vpce-0a24ed2de86d21e73-snra-08e6b95e785a5ce29.rcfg-052f0211d381fbcfc.4232ccc.vpc-lattice-rsc.us-east-1.on.aws' (ED25519) to the list of known hosts.
   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
Last login: Mon Dec 16 09:49:51 2024 from 10.10.10.22

$ hostname -i
10.10.10.7

$ TOKEN=$(
  curl -X PUT "http://169.254.169.254/latest/api/token" \
    -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" \
    -s
  )

$ curl \
  -H "X-aws-ec2-metadata-token: $TOKEN" \
  http://169.254.169.254/latest/meta-data/instance-id
i-0356f8e0e11769b84

問題なくできました。

Service Network型VPCエンドポイントとService Network型VPC Associationが共存できるか

検証の中でVPCとService Networkの関連付けを解除しました。

再度関連付けを行い、Service Network型VPCエンドポイントとService Network型VPC Associationが共存できるか確認します。

関連付けを行います。

>  aws vpc-lattice create-service-network-vpc-association \
         --service-network-identifier sn-0fc4c78a8f94d8f09 \
         --vpc-identifier vpc-0d54cbe88a44ffd04 \
         --security-group-ids sg-0e2239cc74c5c84f9
{
    "arn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetworkvpcassociation/snva-0e318467c5c204b08",
    "createdBy": "<AWSアカウントID>",
    "id": "snva-0e318467c5c204b08",
    "securityGroupIds": [
        "sg-0e2239cc74c5c84f9"
    ],
    "status": "CREATE_IN_PROGRESS"
}

>  aws vpc-lattice list-service-network-vpc-associations \
         --service-network-identifier sn-0fc4c78a8f94d8f09
{
    "items": [
        {
            "arn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetworkvpcassociation/snva-0e318467c5c204b08",
            "createdAt": "2024-12-16T11:27:31.177000+00:00",
            "createdBy": "<AWSアカウントID>",
            "id": "snva-0e318467c5c204b08",
            "lastUpdatedAt": "2024-12-16T11:28:41.331000+00:00",
            "serviceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09",
            "serviceNetworkId": "sn-0fc4c78a8f94d8f09",
            "serviceNetworkName": "test-service-network-a",
            "status": "ACTIVE",
            "vpcId": "vpc-0d54cbe88a44ffd04"
        }
    ]
}

正常に行えました。

SSHもできることを確認します。

$ ssh ec2-user@snra-08e6b95e785a5ce29.rcfg-052f0211d381fbcfc.4232ccc.vpc-lattice-rsc.us-east-1.on.aws -i ~/.ssh/non-97-test.pem
   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
Last login: Mon Dec 16 11:24:33 2024 from 10.10.10.18
$ 

はい、ということでService Network型VPCエンドポイントとService Network型VPC Associationが共存できます。

Service Network型VPCエンドポイントを作り直す

Service Network型VPCエンドポイントが失敗となる原因が気になりすぎるので、Service Network型VPCエンドポイントを作り直してみます。

Service Network型VPCエンドポイントは後からサブネットを追加、変更することはできないようです。

18.後からサブネットを変更することはできない.png

そのため、一度削除して再度作り直す必要があります。

サブネットは/26のサブネットです。

利用可能なIPv4 アドレスは57個です。

17.VPCと関連付け後も利用可能な IPv4 アドレス  57のまま.png

VPCエンドポイントを削除して、再度VPCエンドポイントを作成します。

> aws ec2 create-vpc-endpoint \
         --vpc-endpoint-type ServiceNetwork \
         --service-network-arn arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09 \
         --vpc-id vpc-0d54cbe88a44ffd04 \
         --subnet-ids subnet-0a84d8f4554925b16 subnet-0f6a1ce53b9fd9793 \
         --security-group-ids sg-0e2239cc74c5c84f9 \
         --private-dns-enabled
{
    "VpcEndpoint": {
        "VpcEndpointId": "vpce-08614f58ef7c76c92",
        "VpcEndpointType": "ServiceNetwork",
        "VpcId": "vpc-0d54cbe88a44ffd04",
        "State": "Pending",
        "SubnetIds": [
            "subnet-0a84d8f4554925b16",
            "subnet-0f6a1ce53b9fd9793"
        ],
        "Groups": [
            {
                "GroupId": "sg-0e2239cc74c5c84f9",
                "GroupName": "default"
            }
        ],
        "IpAddressType": "IPV4",
        "PrivateDnsEnabled": true,
        "CreationTimestamp": "2024-12-16T11:35:39.877000+00:00",
        "Tags": [],
        "OwnerId": "<AWSアカウントID>",
        "ServiceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09"
    }
}

> aws ec2 describe-vpc-endpoints --vpc-endpoint-ids vpce-08614f58ef7c76c92
{
    "VpcEndpoints": [
        {
            "VpcEndpointId": "vpce-08614f58ef7c76c92",
            "VpcEndpointType": "ServiceNetwork",
            "VpcId": "vpc-0d54cbe88a44ffd04",
            "State": "Failed",
            "SubnetIds": [
                "subnet-0a84d8f4554925b16",
                "subnet-0f6a1ce53b9fd9793"
            ],
            "Groups": [
                {
                    "GroupId": "sg-0e2239cc74c5c84f9",
                    "GroupName": "default"
                }
            ],
            "IpAddressType": "IPV4",
            "PrivateDnsEnabled": true,
            "NetworkInterfaceIds": [
                "eni-0e567c647a9f9dd39",
                "eni-0854e4c323b16c706"
            ],
            "CreationTimestamp": "2024-12-16T11:35:39.877000+00:00",
            "Tags": [],
            "OwnerId": "<AWSアカウントID>",
            "ServiceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09"
        }
    ]
}

> aws ec2 describe-vpc-endpoint-associations --vpc-endpoint-ids vpce-08614f58ef7c76c92
{
    "VpcEndpointAssociations": [
        {
            "Id": "vpce-rsc-asc-082a1836b247ccf7c",
            "VpcEndpointId": "vpce-08614f58ef7c76c92",
            "ServiceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09",
            "ServiceNetworkName": "test-service-network-a",
            "AssociatedResourceAccessibility": "Accessible",
            "DnsEntry": {
                "DnsName": "vpce-08614f58ef7c76c92-snra-02edb58563f73e5e5.rcfg-0f8b3049b4a9710e0.4232ccc.vpc-lattice-rsc.us-east-1.on.aws",
                "HostedZoneId": "Z08285483B41F6ASEM5U1"
            },
            "AssociatedResourceArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:resourceconfiguration/rcfg-0f8b3049b4a9710e0"
        },
        {
            "Id": "vpce-rsc-asc-0d38f8c33ec4380af",
            "VpcEndpointId": "vpce-08614f58ef7c76c92",
            "ServiceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09",
            "ServiceNetworkName": "test-service-network-a",
            "AssociatedResourceAccessibility": "Accessible",
            "DnsEntry": {
                "DnsName": "vpce-08614f58ef7c76c92-snra-08e6b95e785a5ce29.rcfg-052f0211d381fbcfc.4232ccc.vpc-lattice-rsc.us-east-1.on.aws",
                "HostedZoneId": "Z08285483B41F6ASEM5U1"
            },
            "AssociatedResourceArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:resourceconfiguration/rcfg-052f0211d381fbcfc"
        },
        {
            "Id": "vpce-rsc-asc-0fb1f356131985fa5",
            "VpcEndpointId": "vpce-08614f58ef7c76c92",
            "ServiceNetworkArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:servicenetwork/sn-0fc4c78a8f94d8f09",
            "ServiceNetworkName": "test-service-network-a",
            "AssociatedResourceAccessibility": "Accessible",
            "DnsEntry": {
                "DnsName": "vpce-08614f58ef7c76c92-snra-03933dc55a22e41c2.rcfg-0b39a245f47c880f8.4232ccc.vpc-lattice-rsc.us-east-1.on.aws",
                "HostedZoneId": "Z08285483B41F6ASEM5U1"
            },
            "AssociatedResourceArn": "arn:aws:vpc-lattice:us-east-1:<AWSアカウントID>:resourceconfiguration/rcfg-0b39a245f47c880f8"
        }
    ]
}

Failedとなりました。謎です。

ちなみにサブネットの利用可能なIPv4アドレスが40になりました。(Ipv4Prefixes/28の16個のIPアドレス + プライマリIPv4アドレスは1個) × 1 ENI = 17 IPアドレス なので妥当です。

Failedではありますが、関連付けは正常に行えているようです。

名前解決も正常にできました。

> dig vpce-08614f58ef7c76c92-snra-08e6b95e785a5ce29.rcfg-052f0211d381fbcfc.4232ccc.vpc-lattice-rsc.us-east-1.on.aws @1.1.1.1

; <<>> DiG 9.10.6 <<>> vpce-08614f58ef7c76c92-snra-08e6b95e785a5ce29.rcfg-052f0211d381fbcfc.4232ccc.vpc-lattice-rsc.us-east-1.on.aws @1.1.1.1
.
.
(中略)
.
.
;; QUESTION SECTION:
;vpce-08614f58ef7c76c92-snra-08e6b95e785a5ce29.rcfg-052f0211d381fbcfc.4232ccc.vpc-lattice-rsc.us-east-1.on.aws. IN A

;; ANSWER SECTION:
vpce-08614f58ef7c76c92-snra-08e6b95e785a5ce29.rcfg-052f0211d381fbcfc.4232ccc.vpc-lattice-rsc.us-east-1.on.aws. 60 IN A 10.10.10.90

;; Query time: 255 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Mon Dec 16 20:41:23 JST 2024
;; MSG SIZE  rcvd: 154

試しにSSHしてみましょう。

$ ssh ec2-user@vpce-08614f58ef7c76c92-snra-02edb58563f73e5e5.rcfg-0f8b3049b4a9710e0.4232ccc.vpc-lattice-rsc.us-east-1.on.aws -i ~/.ssh/non-97-test.pem
The authenticity of host 'vpce-08614f58ef7c76c92-snra-02edb58563f73e5e5.rcfg-0f8b3049b4a9710e0.4232ccc.vpc-lattice-rsc.us-east-1.on.aws (10.10.10.25)' can't be established.
.
.
(中略)
.
.
Warning: Permanently added 'vpce-08614f58ef7c76c92-snra-02edb58563f73e5e5.rcfg-0f8b3049b4a9710e0.4232ccc.vpc-lattice-rsc.us-east-1.on.aws' (ED25519) to the list of known hosts.
   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
Last login: Mon Dec 16 09:40:47 2024 from 10.10.10.33
$ hostname -i
10.10.10.53

できてしまいました。

何が失敗なのでしょうか。

沼になりそうなのでこれ以上の深掘りはやめておきます。

VPC LatticeでもSSHできる。が

VPC Lattice経由でSSH接続してみました。

Service Network型VPC Associationの場合、管理が楽で良いですね。VPCエンドポイントの料金もかかりません。ログ出力できるのも嬉しいポイントです。

一方でコスト的にSSHする経路を作成するためだけにVPC LatticeでTCP接続するのはメリットは薄いような気がしています。

TCP接続に必要なService NetworkにVPCリソースを追加にかかる料金は 0.10USD/h です。1リソース接続するのに毎月73USDほどかかるのはコストインパクトが大きいと感じています。

とはいえ、AWS PrivateLinkの場合はVPCエンドポイントとリソースを1:1で紐づけるような形で設定するので、こちらは管理が大変です。運用の人的コストと金銭的コストのバランスですね。

VPC LatticeのService Network型VPCエンドポイントとVPC Associationの比較は以下動画の34:15ごろが参考になります。

https://youtu.be/SRgwjU18nvk?si=VWn0JC39_Jxston_&t=2055

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

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

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.