マルチアカウントのVPCエンドポイント(インターフェイス型)を1つに集約させる

2020.07.10

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

やりたいこと

img

コスト削減のため、 マルチアカウントのVPCエンドポイントの集約 を行う構成を考えます。

各ユーザー User VPC内インスタンス(AWSリソース)が 共有サービス Shared Service のVPCエンドポイント(PrivateLink)を利用できるようにします。

前提条件としては以下のとおりです。

  • 「複数のユーザー(User)VPC」と「共通サービス(Shared Service)VPC」がTGWにより IP到達可能な状態

※上図は Transit Gateway(TGW) によって通信可能な状態を想定したものですが、 ここの部分は VPCピアリング に置き換えてもらっても大丈夫です。

手順概要

img

今回は User Account#1 のみ、検証で確かめます。 User Account#1Shared Service Account のお互い VPCが通信可能な状態です。

大まかな流れは以下のとおりです。

  1. VPCエンドポイントの作成
  2. プライベートホストゾーンとエイリアスレコードの作成
  3. プライベートホストゾーンの関連付け

img

例として Systems Manager 関連の VPCエンドポイントを実際に作成、関連付けまで行ってみます。

手順1. VPCエンドポイントの作成

img

VPCエンドポイントを作成します。 作成の際の設定として [プライベート DNS名を有効にする] のチェックを外して 作成しましょう。

img

CloudFormation テンプレートで作成する場合は以下のように PrivateDnsEnabled: false を入れましょう。

SomeEndpoint:
  Type: AWS::EC2::VPCEndpoint
  Properties:
    PrivateDnsEnabled: false
    ︙

VPCエンドポイントのセキュリティグループには、 接続元のIPアドレス(or CIDR)もしくはセキュリティグループからの HTTPS(ポート443)を許可するルールを入れておきます。

作成が完了したら DNS名 vpce-01234567abcdefg.xxxxxx.ap-northeast-1.vpce.amazonaws.com をメモしておきましょう。

img

手順2. プライベートホストゾーンとエイリアスレコードの作成

img

プライベートホストゾーンを作成します。 以下、 ssmmessages エンドポイントの例です。

  • ドメイン名: ssmmessages.ap-northeast-1.amazonaws.com
  • コメント: (任意)
  • タイプ: Amazon VPCのプライベートホストゾーン
  • VPC ID: VPCエンドポイントを作成した VPC ID

img

作成したホストゾーンに エイリアスレコード を作成します。

  • 名前: (空白)
  • タイプ/エイリアス: A/はい
  • エイリアス先: (先程メモした VPCエンドポイントのDNS名)

img

作成後のホストゾーンは以下のような構成かと思います。赤枠が追加したエイリアスレコードです。

img

手順3. プライベートホストゾーンの関連付け

img

作成したプライベートホストゾーンを他アカウント( User Account#1 ) へ共有します。 この作業は AWS CLI(もしくは SDK)しか対応していません。AWS CLIの手順を説明します。

※実行時の AWS CLIバージョン … 2.0.29

ホストゾーンIDの取得

aws route53 list-hosted-zones コマンドで確認します。 Id 部分をメモしましょう。

img

ホストゾーンの「関連付けの承認」作成

aws route53 create-vpc-association-authorization コマンドで関連付けの承認を行います。 コマンドの --vpc には 関連付け先のVPC ID を入力します。

aws route53 create-vpc-association-authorization\
 --hosted-zone-id (先程メモしたホストゾーンID)\
 --vpc VPCRegion=ap-northeast-1,VPCId=(関連付け先のVPC ID)

img

ホストゾーンの「関連付け」作成

aws route53 associate-vpc-with-hosted-zone コマンドで関連付けを行います。 これは 共有先のアカウント(User Account#1)で実行します

aws route53 associate-vpc-with-hosted-zone\
 --hosted-zone-id (先程メモしたホストゾーンID)\
 --vpc VPCRegion=ap-northeast-1,VPCId=(関連付け先のVPC ID)

img

上図のように "ChangeInfo" が返されます。

マルチアカウントへの適用

マルチアカウントで VPCエンドポイントを集約させる場合、 今までの関連付け作成のプロセスを同じように別のアカウントに対して実施していきます。

img

動作確認

今までの手順を ssm, ec2messages, ssmmessages の3つ(Session Managerに必要なエンドポイント)分実施しました。 User Account#1 のインスタンスに Session Manager 接続してみます。

img

Session Manager で確認

Session Manager にてターゲットインスタンスに表示がありました。 (インスタンスはプライベートサブネット上にあるので、この時点で意図通りの構成になっていること確認できます)

img

接続してみます。 各エンドポイントの名前解決を行います。

img

それぞれ DNS名に対する AddressローカルIP (共通サービスにあるVPCエンドポイント)を指していることが分かりました。

aws route53 list-hosted-zones-by-vpc で確認

最近のアップデートでVPCに関連付けられたプライベートホストゾーンを一覧表示出来るようになっています。

以下コマンドを実行して確認しました。

aws route53 list-hosted-zones-by-vpc\
  --vpc-id (関連付け先のVPC ID) --vpc-region ap-northeast-1

img

それぞれ 3つのホストゾーンが共有されていること、確認できました。

おわりに

マルチアカウントのVPCエンドポイント集約の検証をしてみました。 アカウントそれぞれに同じVPCエンドポイントを置くと、結構料金がかかります。

CLIによるプライベートホストゾーン関連付け作業が必要ですが、コスト削減のためにも検討してみると良いと思います。

なお、このアーキテクチャは re:Invent 2019のネットワークセッションでも紹介されています。

img

以下そのセッションのレポートです。ご参考ください。

少しでもどなたかのお役に立てば幸いです。

参考