VPCエンドポイントを他アカウントのVPCに共有する手順

この記事を書いたメンバー:

榊原慶太

VPCエンドポイントを他アカウントのVPCに共有する手順

目次

BeeXの榊原です。主にコスト面を考慮して、VPCエンドポイントを他VPCと共有したいケースはたくさんあることでしょう。今回はその手順について解説します。

前提

構成は以下のものを想定しています。

スポークアカウント内のEC2インスタンスに対し、ハブアカウント内の3つのVPCエンドポイントを通じて、各サービスエンドポイントにアクセスし、セッションマネージャでインスタンスに接続できるところがゴールです。セッションマネージャは下記三つのサービスに接続する為のエンドポイントが必要です。東京リージョンと仮定します。

  • com.amazonaws.ap-northeast-1.ssmmessages
  • com.amazonaws.ap-northeast-1.ssm
  • com.amazonaws.ap-northeast-1.ec2messages

加えて、下記構成は作成済とします。各VPCの名前解決先はRoute53 Resolverとします。

VPCエンドポイントのプライベートDNSの無効化は忘れやすいのでご注意ください。これを有効化すると裏でAWS管轄のプライベートホストゾーンが作成されるのですが、エンドポイントのあるVPC外では機能しません。よって、
1.プライベートDNSは無効化
2.自分でプライベートホストゾーンを作成
3.他のVPCとプライベートホストゾーンを共有
という手順を踏む必要があります。この部分はAWS公式ブログの記載がわかりやすかったので一部引用します。

When you create a VPC endpoint to an AWS service or AWS PrivateLink SaaS, you can enable Private DNS. When enabled, the setting creates an AWS managed Route 53 private hosted zone (PHZ) for you. The managed PHZ works great for resolving the DNS name within a VPC however, it does not work outside of the VPC. This is where PHZ sharing and Route 53 Resolver come into play to help us get unified name resolution for shared VPC endpoints. (引用元:Integrating AWS Transit Gateway with AWS PrivateLink and Amazon Route 53 Resolver

【機械翻訳】
AWS サービスまたは AWS PrivateLink SaaS への VPC エンドポイントを作成するときに、プライベート DNS を有効にすることができます。有効にすると、この設定により AWS 管理の Route 53 プライベートホストゾーン (PHZ) が作成されます。マネージド PHZ は、VPC 内での DNS 名の解決にはうまく機能しますが、VPC の外では機能しません。ここで、共有 VPC エンドポイントの統一された名前解決を実現するために、PHZ 共有と Route 53 リゾルバーが機能します。

構築手順

プライベートホストゾーンの作成

まずは各エンドポイントに対し、個別のプライベートホストゾーンを作成します。今回は合計3つ作成します。下は「com.amazonaws.ap-northeast-1.ssmmessages」用のホストゾーンの作成例です。

ホストゾーンを作成したら、中にレコードも作成しましょう。ルーティング先にはVPCエンドポイント作成時に自動作成されるリージョン毎のパブリックDNS名を追記します。

ここまでの操作を「com.amazonaws.ap-northeast-1.ec2messages」、「com.amazonaws.ap-northeast-1.ssm」に対しても実施してください

プライベートホストゾーンを異なるAWSアカウントに紐づける

このパートの操作は執筆時点でコンソールから実施できません。よって、今回はCloudshellから実施しました。コマンドの種類によってはホストゾーンの数だけ実施が必要ですのでご注意ください。

# ハブ側の操作。ホストゾーンの一覧を確認
$ aws route53 list-hosted-zones --no-cli-pager

# 出力結果
{
    "HostedZones": [
        {
            "Id": "/hostedzone/Z0294473K5EVJHMX2P4P",
            "Name": "ssm.ap-northeast-1.amazonaws.com.",
            "CallerReference": "88be7f4c-7135-4d2c-8a63-c64d2fe9e7b6",
            "Config": {
                "Comment": "",
                "PrivateZone": true
            },
            "ResourceRecordSetCount": 3
        },
# 以下省略

下記コマンドは共有したいプライベートホストゾーンの個数分実施します。

# ハブ側の操作。プライベートホストゾーンをスポーク側のVPCと関連付けできるよう許可。
# 共有先が別リージョンの場合は --regionコマンドを使用すること。
$ aws route53 create-vpc-association-authorization 
  --hosted-zone-id <プライベートホストゾーンID> 
  --vpc VPCRegion=ap-northeast-1,VPCId=<スポーク側のVPCのID>

# 出力結果
{
    "HostedZoneId": "Z0294473K5EVJHMX2P4P",
    "VPC": {
        "VPCRegion": "ap-northeast-1",
        "VPCId": "vpc-0b0c2f0f9bd1f90f4"
    }
}

# 他の2つのプライベートホストゾーンでも実施すること!

下記コマンドも共有したいプライベートホストゾーンの個数分実施します。こちらはスポーク側アカウントのCloudshellで実行しているのでご注意ください。

# スポーク側の操作。プライベートホストゾーンとスポーク側VPCとの関連付けを作成。
# 共有先が別リージョンの場合は --regionコマンドを使用すること。
$ aws route53 associate-vpc-with-hosted-zone 
  --hosted-zone-id <プライベートホストゾーンID>
  --vpc VPCRegion=ap-northeast-1,VPCId=<スポーク側のVPCのID>

# 出力結果
{
    "ChangeInfo": {
        "Id": "/change/C03300396BNT7Q0UE4SE",
        "Status": "PENDING",
        "SubmittedAt": "2024-07-11T12:42:18.065000+00:00",
        "Comment": ""
    }
}

# 他の2つのプライベートホストゾーンでも実施すること!

少し時間をおいてから、digコマンドで名前解決できるか試してみましょう。

# スポーク側の操作。ハブ側のVPCエンドポイントに紐づいたENIのプライベートIPが返るか確認。
$ dig ssm.ap-northeast-1.amazonaws.com

# 出力結果。ハブ側のVPCエンドポイントに紐づいたENIのプライベートIPが返る。
#(略)
;; ANSWER SECTION:
ssm.ap-northeast-1.amazonaws.com. 58 IN A       172.20.144.169
ssm.ap-northeast-1.amazonaws.com. 58 IN A       172.20.128.22


;; Query time: 0 msec
;; SERVER: 172.30.0.2#53(172.30.0.2)
;; WHEN: Thu Jul 11 13:28:08 UTC 2024
;; MSG SIZE  rcvd: 93

これでスポーク側のEC2もハブ側のVPCエンドポイントを用いて、Sessions Managerが使えるようになりました。もしうまくいかない場合はサブネットやトランジットゲートウェイのルートテーブル、EC2やVPCエンドポイントのセキュリティグループ等を見直しましょう。

ハブ側のコンソールでもホストゾーンの「関連付けられたVPC」から、スポーク側のVPCのIDを確認することができます。

逆にスポーク側のコンソールではホストゾーンは確認できないのでご注意ください。

無事にVPCエンドポイントの共有が完了したら、最後にアソシエーション権限を削除しましょう。これもホストゾーンの数だけ実行します。

# ハブ側の操作。アソシエーション権限を削除する。
$ aws route53 delete-vpc-association-authorization 
  --hosted-zone-id Z0294473K5EVJHMX2P4P 
  --vpc VPCRegion=ap-northeast-1,VPCId=vpc-0b0c2f0f9bd1f90f4

以上でアカウントをまたいだVPCエンドポイントの共有手順の解説は終わりです。ここまでお読みいただきありがとうございました。

参考URL

VPC プライベートエンドポイントへの一元化されたアクセス
AWS Transit Gateway with AWS PrivateLink and Amazon Route 53 Resolver
Amazon VPC と、作成したプライベートホストゾーンを異なる AWS アカウントに関連付ける
複数の VPC から中央のAWS のサービスエンドポイントにプライベートにアクセスする
Route 53 プライベートホストゾーンを別の AWS アカウントの VPC に関連付けるにはどうすればよいですか?

カテゴリー
タグ

この記事を書いたメンバー

榊原慶太
榊原慶太

技術検証、re:Invent参加、AWS資格全冠のための勉強教材等、幅広く記事にしています。皆様のお役に立てば幸いです。最近は会社ブログメインで記事投稿しています。

SAPシステムや基幹システムのクラウド移行・構築・保守、
DXに関して
お気軽にご相談ください

03-6260-6240 (受付時間 平日9:30〜18:00)