AWS Transit Gatewayに接続したShared VPCにVPCエンドポイントを集約してみた

AWS Transit Gatewayに接続したShared VPCにVPCエンドポイントを集約してみました。Shared VPCにあるVPCエンドポイントにアクセスするためには、Route 53 Private Hosted Zoneが必要ですが、VPCエンドポイントにアクセスしたいVPC及びVPCエンドポイントの数が多くなれば多くなるほど、VPCエンドポイントを集約した方がお得になっていく傾向があります。
2021.10.18

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

各VPC毎にVPCエンドポイントを作成するのは何だかイケていない気がする

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

皆さんはShare VPCを作成したことありますか? 私はあります。

Shared VPCはNAT GatewayやVPCエンドポイントなどのネットワークリソースの中央監視と制御をするためのアーキテクチャーです。複数のVPCで必要なリソースをShared VPCに集約することで、リソースの管理をしやすくしたり、トータルの課金額を抑えたりできます。

個人的にShared VPCにNAT Gatewayの集約はよくするのですが、VPCエンドポイントの集約はやったことがなかったので、今回チャレンジしてみようと思います。

ちなみに、この記事をほぼ書き終えたタイミングで気づきましたが、同じ内容が既に投稿されていました。

こちらの記事とはRoute 53のコンソールのUIが変わっているので許してください。それだけだとまだ物足りない方もいらっしゃると思うので、VPCエンドポイントを集約することで、どの程度課金額がお得になるのかも計算してみます。

いきなりまとめ

  • Shared VPCにあるVPCエンドポイントにアクセスするためには、Route 53 Private Hosted Zoneが必須
    • 共有したいVPCエンドポイントのDNS名毎にRoute 53 Private Hosted Zoneを作成する
    • Route 53 Private Hosted Zoneが作成されていない状態でも、vpce-から始まるDNS名は名前解決するとプライベートIPアドレスが返ってくる
    • 一方、各サービスのエンドポイント(service-code.region-code.amazonaws.com)は名前解決しても、作成したRoute 53 Private Hosted Zoneを問い合わせ元VPCに関連付けないとグローバルIPアドレスが返ってくる
  • VPCエンドポイントにアクセスしたいVPC及びVPCエンドポイントの数が多くなれば多くなるほど、VPCエンドポイントを集約した方がお得になっていく傾向がある
  • Transit GatewayとVPCピアリングのどちらでShared VPCに接続するかでコストが大きく変わる
    • 以下に当てはまる場合はTransit Gatewayでの接続を考える
      • 複数のVPC間でメッシュ状にピア接続を行う必要がある
      • オンプレミス環境と接続したいVPCの数が多い (目安は11個以上)
      • コストをかけてでもネットワーク管理や制御を簡素化したい
    • 以下に当てはまる場合はVPCピアリングでの接続を考える
      • ピア接続が必要なVPCが限られる
      • オンプレミス環境と接続したいVPCの数が少ない (目安は10個以下)
      • Transit VIFを用意できない
      • とにかくコストを安くしたい

検証の環境と進め方

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

検証環境構成図

VPC AとVPC Bが存在しており、VPC BにSSMを使用するために必要なVPCエンドポイントを集約します。

検証の流れは以下の通りです。

  1. VPC AのEC2インスタンスからVPC BのVPCエンドポイントに対して名前解決 (1回目)
  2. VPCエンドポイント毎のRoute 53 Private Hosted Zoneの作成とVPC Aへの関連付け
  3. VPC AのEC2インスタンスからVPC BのVPCエンドポイントに対して名前解決 (2回目)
  4. NAT Gatewayへのルートを削除しても、SSMセッションマネージャーでEC2インスタンスに接続できるか確認

VPC AのEC2インスタンスからVPC BのVPCエンドポイントに対して名前解決 (1回目)

まず、VPC AのEC2インスタンスからVPC BのVPCエンドポイントに対して名前解決をします。

VPCのコンソールからエンドポイントを選択します。以下のVPCエンドポイントがあることを確認します。

  • com.amazonaws.us-east-1.ssm
  • com.amazonaws.us-east-1.ssmmessages
  • com.amazonaws.us-east-1.ec2messages

SSMのVPCエンドポイントの確認

試しにサービス名がcom.amazonaws.us-east-1.ssmの以下DNS名について、VPC AのEC2インスタンスから名前解決を行います。

  • vpce-07f12be0f999f2576-0mz5lmwo.ssm.us-east-1.vpce.amazonaws.com
  • vpce-07f12be0f999f2576-0mz5lmwo-us-east-1a.ssm.us-east-1.vpce.amazonaws.com
  • vpce-07f12be0f999f2576-0mz5lmwo-us-east-1b.ssm.us-east-1.vpce.amazonaws.com
  • ssm.us-east-1.amazonaws.com

名前解決を行うと、vpce-から始まるDNS名は名前解決するとプライベートIPアドレスが返ってきました。一方でssm.us-east-1.amazonaws.comについてはグローバルIPアドレスが返ってきました。

$ dig vpce-07f12be0f999f2576-0mz5lmwo.ssm.us-east-1.vpce.amazonaws.com

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

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;vpce-07f12be0f999f2576-0mz5lmwo.ssm.us-east-1.vpce.amazonaws.com. IN A

;; ANSWER SECTION:
vpce-07f12be0f999f2576-0mz5lmwo.ssm.us-east-1.vpce.amazonaws.com. 60 IN A 10.0.1.104
vpce-07f12be0f999f2576-0mz5lmwo.ssm.us-east-1.vpce.amazonaws.com. 60 IN A 10.0.1.79

;; Query time: 2 msec
;; SERVER: 10.0.0.2#53(10.0.0.2)
;; WHEN: Thu Oct 14 05:51:22 UTC 2021
;; MSG SIZE  rcvd: 125


$ dig vpce-07f12be0f999f2576-0mz5lmwo-us-east-1a.ssm.us-east-1.vpce.amazonaws.com

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

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;vpce-07f12be0f999f2576-0mz5lmwo-us-east-1a.ssm.us-east-1.vpce.amazonaws.com. IN        A

;; ANSWER SECTION:
vpce-07f12be0f999f2576-0mz5lmwo-us-east-1a.ssm.us-east-1.vpce.amazonaws.com. 60 IN A 10.0.1.79

;; Query time: 2 msec
;; SERVER: 10.0.0.2#53(10.0.0.2)
;; WHEN: Thu Oct 14 05:51:33 UTC 2021
;; MSG SIZE  rcvd: 120


$ dig vpce-07f12be0f999f2576-0mz5lmwo-us-east-1b.ssm.us-east-1.vpce.amazonaws.com

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

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;vpce-07f12be0f999f2576-0mz5lmwo-us-east-1b.ssm.us-east-1.vpce.amazonaws.com. IN        A

;; ANSWER SECTION:
vpce-07f12be0f999f2576-0mz5lmwo-us-east-1b.ssm.us-east-1.vpce.amazonaws.com. 60 IN A 10.0.1.104

;; Query time: 39 msec
;; SERVER: 10.0.0.2#53(10.0.0.2)
;; WHEN: Thu Oct 14 05:51:42 UTC 2021
;; MSG SIZE  rcvd: 120


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

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

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

;; ANSWER SECTION:
ssm.us-east-1.amazonaws.com. 25 IN      A       52.46.141.158

;; Query time: 1 msec
;; SERVER: 10.0.0.2#53(10.0.0.2)
;; WHEN: Thu Oct 14 05:52:01 UTC 2021
;; MSG SIZE  rcvd: 72

実際にSSMエージェントがSSMのサービスエンドポイントにアクセスする際は、ssm.us-east-1.amazonaws.comに対してアクセスを行おうとします。そのためssm.us-east-1.amazonaws.comを名前解決した時にグローバルIPアドレスが返ってくると、インターネットに接続できる環境が必要になります。

service-code.region-code.amazonaws.com形式のDNS名を名前解決したときにグローバルIPアドレスが返ってくる理由は、service-code.region-code.amazonaws.com形式のDNS名は、あるリージョンのサービスエンドポイントであり、VPCエンドポイントと関連付いていないためです。

vpce-から始まるDNS名はグローバルに一意なDNS名です。そのため、名前解決したときに、service-code.region-code.amazonaws.comドメインはサブドメインであるvpc-xxxxがどこのVPC上で作成されたVPCエンドポイントかを一意に特定できます。結果として、VPC A上のEC2インスタンスや手元のMacやWindowsマシンなどからvpce-から始まるDNS名を名前解決をするとプライベートIPアドレスが返ってきます。

一方でservice-code.region-code.amazonaws.com形式のDNS名は、あるリージョンのサービスエンドポイントであるため、プライベートIPアドレスを返すようにするためには工夫が必要です。

具体的には、EC2インスタンスのデフォルトのDNSサーバーであるAmazonProvidedDNSがservice-code.region-code.amazonaws.com形式のDNS名への名前解決を受け付けたときに、vpce-から始まるDNS名の名前解決結果を回答するようにします。

今回の場合は、AmazonProvidedDNSがssm.us-east-1.amazonaws.comをVPC B上のSSMのVPCエンドポイント(vpce-07f12be0f999f2576-0mz5lmwo.ssm.us-east-1.vpce.amazonaws.com)と認識できるようになれば、名前解決したときに、そのVPCエンドポイントのプライベートIPアドレスを返してくれるようになります。

このような動作をするように、「VPCエンドポイント毎のRoute 53 Private Hosted Zoneの作成と、作成したRoute 53 Private Hosted ZoneのVPC Aへの関連付け」を行います。

VPCエンドポイント毎のRoute 53 Private Hosted Zoneの作成とVPC Aへの関連付け

それでは、VPCエンドポイント毎のRoute 53 Private Hosted Zoneの作成とVPC Aへの関連付けを行います。

Route 53のコンソールからホストゾーン - ホストゾーンの作成をクリックします。

Route 53 Private Hosted Zoneの作成

以下のように設定して、ホストゾーンの作成をクリックします。

  • ドメイン名: ssm.us-east-1.amazonaws.comのようなVPCエンドポイントのPrivate DNS names
  • タイプ: プライベートホストゾーン
  • リージョン: 関連付けたいVPCが存在するリージョン
  • VPC ID: 関連付けたいVPCのID

Route 53 Private Hosted Zoneの設定

Private Hosted Zoneの作成が完了すると、登録されているレコード一覧を確認できます。

Route 53 Private Hosted Zoneの作成完了

次にレコードを作成します。

作成したPrivate Hosted Zoneのレコード一覧からレコードを作成をクリックします。

レコードの作成

以下のようにZone APEXに対してVPCエンドポイントのDNS名のエイリアスレコードを設定し、レコードを作成をクリックします。

  • レコード名: (空欄)
  • レコードタイプ: A
  • トラフィックのルーティング先:
    • エイリアス
    • VPCエンドポイントのエイリアス
    • VPCエンドポイントを作成したリージョン
    • VPCエンドポイントのID

レコードのクイック作成

エイリアスレコードが追加されていることを確認します。これで、VPC A上でssm.us-east-1.amazonaws.comを名前解決すると、プライベートIPアドレスが返ってくるようになります。

エイリアスレコードが追加されていることを確認

他のVPCエンドポイントについても、Private Hosted Zone作成とレコードの追加をします。

作成したPrivate Hosted Zoneの確認

VPC AのEC2インスタンスからVPC BのVPCエンドポイントに対して名前解決 (2回目)

この状態でservice-code.region-code.amazonaws.com形式の以下DNS名について、VPC AのEC2インスタンスから名前解決をします。

  • ssm.us-east-1.amazonaws.com
  • ssmmessages.us-east-1.amazonaws.com
  • ec2messages.us-east-1.amazonaws.com.

名前解決を行うと、全てのDNS名でプライベートIPアドレスが返ってきました。成功ですね。

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

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

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

;; ANSWER SECTION:
ssm.us-east-1.amazonaws.com. 60 IN      A       10.0.1.104
ssm.us-east-1.amazonaws.com. 60 IN      A       10.0.1.79

;; Query time: 2 msec
;; SERVER: 10.0.0.2#53(10.0.0.2)
;; WHEN: Thu Oct 14 07:26:41 UTC 2021
;; MSG SIZE  rcvd: 88


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

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

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

;; ANSWER SECTION:
ssmmessages.us-east-1.amazonaws.com. 60 IN A    10.0.1.80
ssmmessages.us-east-1.amazonaws.com. 60 IN A    10.0.1.102

;; Query time: 3 msec
;; SERVER: 10.0.0.2#53(10.0.0.2)
;; WHEN: Thu Oct 14 07:27:00 UTC 2021
;; MSG SIZE  rcvd: 96


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

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

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

;; ANSWER SECTION:
ec2messages.us-east-1.amazonaws.com. 45 IN A    10.0.1.86
ec2messages.us-east-1.amazonaws.com. 45 IN A    10.0.1.123

;; Query time: 0 msec
;; SERVER: 10.0.0.2#53(10.0.0.2)
;; WHEN: Thu Oct 14 07:27:16 UTC 2021
;; MSG SIZE  rcvd: 96

NAT Gatewayへのルートを削除しても、SSMセッションマネージャーでEC2インスタンスに接続できるか確認

最後に動作確認ということで、VPC AのEC2インスタンスからNAT Gatewayへのルートを削除しても、SSMセッションマネージャーでEC2インスタンスに接続できるかを確認します。

EC2のコンソールから、VCP AのEC2インスタンスのサブネット、ルートテーブルをたどっていきます。ルートテーブルにターゲットがNAT Gatewayのルートがあるので、こちらを削除します。

EC2インスタンスのサブネット選択

サブネットのルートテーブル

サブネットのルートテーブル(NAT Gatewayへのルート削除後)

これでEC2インスタンスがインターネットに出ていく経路がなくなりました。この状態でSSMセッションマネージャーを使ってEC2インスタンスに接続します。

SSMセッションマネージャーでEC2インスタンスに接続

すると、SSMセッションマネージャーを使ってEC2インスタンスに接続することを確認できました。VPC B上のVPCエンドポイントに正常にアクセスできていそうですね。

SSMセッションマネージャーを使ったEC2インスタンスへの接続確認

SSMエージェントのログも確認しておきます。ログは以下の通りで、特にエラーは発生していませんでした。

$ sudo tail -n 100 /var/log/amazon/ssm/amazon-ssm-agent.log
2021-10-14 07:31:38 INFO [amazon-ssm-agent] OS: linux, Arch: amd64
2021-10-14 07:31:39 INFO [amazon-ssm-agent] [LongRunningWorkerContainer] [WorkerProvider] Worker ssm-agent-worker is not running, starting worker process
2021-10-14 07:31:39 INFO [amazon-ssm-agent] [LongRunningWorkerContainer] [WorkerProvider] Worker ssm-agent-worker (pid:2290) started
2021-10-14 07:31:39 INFO [amazon-ssm-agent] [LongRunningWorkerContainer] Monitor long running worker health every 60 seconds
2021-10-14 07:31:40 INFO [ssm-agent-worker] Agent will take identity from EC2
2021-10-14 07:31:40 INFO [ssm-agent-worker] using named pipe channel for IPC
2021-10-14 07:31:40 INFO [ssm-agent-worker] Dial to Core Agent broadcast channel
2021-10-14 07:31:40 INFO [ssm-agent-worker] using named pipe channel for IPC
2021-10-14 07:31:40 INFO [ssm-agent-worker] Dial to Core Agent broadcast channel
2021-10-14 07:31:40 INFO [ssm-agent-worker] using named pipe channel for IPC
2021-10-14 07:31:40 INFO [ssm-agent-worker] Create new startup processor
2021-10-14 07:31:40 INFO [ssm-agent-worker] Start to listen to Core Agent health channel
2021-10-14 07:31:40 INFO [ssm-agent-worker] Start to listen to Core Agent termination channel
2021-10-14 07:31:40 INFO [ssm-agent-worker] [StartupProcessor] Executing startup processor tasks
2021-10-14 07:31:40 INFO [ssm-agent-worker] [StartupProcessor] Write to serial port: Amazon SSM Agent v3.0.1124.0 is running
2021-10-14 07:31:40 INFO [ssm-agent-worker] [StartupProcessor] Write to serial port: OsProductName: Amazon Linux
2021-10-14 07:31:40 INFO [ssm-agent-worker] [StartupProcessor] Write to serial port: OsVersion: 2
2021-10-14 07:31:40 INFO [ssm-agent-worker] [LongRunningPluginsManager] registered plugins: {}
2021-10-14 07:31:40 INFO [ssm-agent-worker] Initializing bookkeeping folders
2021-10-14 07:31:40 INFO [ssm-agent-worker] removing the completed state files
2021-10-14 07:31:40 INFO [ssm-agent-worker] Initializing bookkeeping folders for long running plugins
2021-10-14 07:31:40 INFO [ssm-agent-worker] Initializing replies folder for MDS reply requests that couldn't reach the service
2021-10-14 07:31:40 INFO [ssm-agent-worker] Initializing healthcheck folders for long running plugins
2021-10-14 07:31:40 INFO [ssm-agent-worker] Initializing locations for inventory plugin
2021-10-14 07:31:40 INFO [ssm-agent-worker] Initializing default location for custom inventory
2021-10-14 07:31:40 INFO [ssm-agent-worker] Initializing default location for file inventory
2021-10-14 07:31:40 INFO [ssm-agent-worker] Initializing default location for role inventory
2021-10-14 07:31:40 INFO [ssm-agent-worker] Init the cloudwatchlogs publisher
2021-10-14 07:31:40 INFO [ssm-agent-worker] [instanceID=i-08ddde217f064e3b6] Successfully loaded platform independent plugin aws:runDockerAction
2021-10-14 07:31:40 INFO [ssm-agent-worker] [instanceID=i-08ddde217f064e3b6] Successfully loaded platform independent plugin aws:downloadContent
2021-10-14 07:31:40 INFO [ssm-agent-worker] [instanceID=i-08ddde217f064e3b6] Successfully loaded platform independent plugin aws:runDocument
2021-10-14 07:31:40 INFO [ssm-agent-worker] [instanceID=i-08ddde217f064e3b6] Successfully loaded platform independent plugin aws:softwareInventory
2021-10-14 07:31:40 INFO [ssm-agent-worker] [instanceID=i-08ddde217f064e3b6] Successfully loaded platform independent plugin aws:runPowerShellScript
2021-10-14 07:31:40 INFO [ssm-agent-worker] [instanceID=i-08ddde217f064e3b6] Successfully loaded platform independent plugin aws:configureDocker
2021-10-14 07:31:40 INFO [ssm-agent-worker] [instanceID=i-08ddde217f064e3b6] Successfully loaded platform independent plugin aws:updateSsmAgent
2021-10-14 07:31:40 INFO [ssm-agent-worker] [instanceID=i-08ddde217f064e3b6] Successfully loaded platform independent plugin aws:refreshAssociation
2021-10-14 07:31:40 INFO [ssm-agent-worker] [instanceID=i-08ddde217f064e3b6] Successfully loaded platform independent plugin aws:configurePackage
2021-10-14 07:31:40 INFO [ssm-agent-worker] [instanceID=i-08ddde217f064e3b6] Successfully loaded platform dependent plugin aws:runShellScript
2021-10-14 07:31:40 INFO [ssm-agent-worker] [instanceID=i-08ddde217f064e3b6] Successfully loaded platform dependent plugin aws:domainJoin
2021-10-14 07:31:40 INFO [ssm-agent-worker] ssm-agent-worker - v3.0.1124.0
2021-10-14 07:31:40 INFO [ssm-agent-worker] OS: linux, Arch: amd64
2021-10-14 07:31:40 INFO [ssm-agent-worker] [MessagingDeliveryService] Starting document processing engine...
2021-10-14 07:31:40 INFO [ssm-agent-worker] [MessagingDeliveryService] [EngineProcessor] Starting
2021-10-14 07:31:40 INFO [ssm-agent-worker] [MessagingDeliveryService] [EngineProcessor] Initial processing
2021-10-14 07:31:40 INFO [ssm-agent-worker] [MessagingDeliveryService] Starting message polling
2021-10-14 07:31:40 INFO [ssm-agent-worker] [MessagingDeliveryService] Starting send replies to MDS
2021-10-14 07:31:40 INFO [ssm-agent-worker] [MessagingDeliveryService] [Association] Starting association polling
2021-10-14 07:31:40 INFO [ssm-agent-worker] [MessagingDeliveryService] [Association] [EngineProcessor] Starting
2021-10-14 07:31:40 INFO [ssm-agent-worker] [MessagingDeliveryService] [Association] Launching response handler
2021-10-14 07:31:40 INFO [ssm-agent-worker] [MessagingDeliveryService] [Association] [EngineProcessor] Initial processing
2021-10-14 07:31:40 INFO [ssm-agent-worker] [MessagingDeliveryService] [Association] Initializing association scheduling service
2021-10-14 07:31:40 INFO [ssm-agent-worker] [MessagingDeliveryService] [Association] Association scheduling service initialized
2021-10-14 07:31:40 INFO [ssm-agent-worker] [OfflineService] Starting document processing engine...
2021-10-14 07:31:40 INFO [ssm-agent-worker] [OfflineService] [EngineProcessor] Starting
2021-10-14 07:31:40 INFO [ssm-agent-worker] [OfflineService] [EngineProcessor] Initial processing
2021-10-14 07:31:40 INFO [ssm-agent-worker] [OfflineService] Starting message polling
2021-10-14 07:31:40 INFO [ssm-agent-worker] [OfflineService] Starting send replies to MDS
2021-10-14 07:31:40 INFO [ssm-agent-worker] [LongRunningPluginsManager] starting long running plugin manager
2021-10-14 07:31:40 INFO [ssm-agent-worker] [LongRunningPluginsManager] there aren't any long running plugin to execute
2021-10-14 07:31:40 INFO [ssm-agent-worker] [LongRunningPluginsManager] There are no long running plugins currently getting executed - skipping their healthcheck
2021-10-14 07:31:40 INFO [ssm-agent-worker] [MessageGatewayService] Starting session document processing engine...
2021-10-14 07:31:40 INFO [ssm-agent-worker] [MessageGatewayService] [EngineProcessor] Starting
2021-10-14 07:31:40 INFO [ssm-agent-worker] [MessageGatewayService] SSM Agent is trying to setup control channel for Session Manager module.
2021-10-14 07:31:40 INFO [ssm-agent-worker] [HealthCheck] HealthCheck reporting agent health.
2021-10-14 07:31:40 INFO [ssm-agent-worker] [MessageGatewayService] listening reply.
2021-10-14 07:31:40 INFO [ssm-agent-worker] [MessageGatewayService] listening task acknowledge.
2021-10-14 07:31:40 INFO [ssm-agent-worker] [MessageGatewayService] agent telemetry cloudwatch metrics disabled
2021-10-14 07:31:40 INFO [ssm-agent-worker] [MessageGatewayService] Setting up websocket for controlchannel for instance: i-08ddde217f064e3b6, requestId: 7484fcb7-6b39-4341-b0a3-35f4d5b55335
2021-10-14 07:31:40 INFO [ssm-agent-worker] [MessageGatewayService] Opening websocket connection to: wss://ssmmessages.us-east-1.amazonaws.com/v1/control-channel/i-08ddde217f064e3b6?role=subscribe&stream=input
2021-10-14 07:31:40 INFO [ssm-agent-worker] [MessageGatewayService] Successfully opened websocket connection to: wss://ssmmessages.us-east-1.amazonaws.com/v1/control-channel/i-08ddde217f064e3b6?role=subscribe&stream=input
2021-10-14 07:31:40 INFO [ssm-agent-worker] [MessageGatewayService] Starting websocket pinger
2021-10-14 07:31:40 INFO [ssm-agent-worker] [MessageGatewayService] Setting up agent telemetry scheduler
2021-10-14 07:31:40 INFO [ssm-agent-worker] [MessageGatewayService] Starting websocket listener
2021-10-14 07:31:40 INFO [ssm-agent-worker] [MessageGatewayService] Starting receiving message from control channel
2021-10-14 07:31:40 INFO [ssm-agent-worker] [MessageGatewayService] [EngineProcessor] Initial processing
2021-10-14 07:31:51 INFO [ssm-agent-worker] [MessagingDeliveryService] [Association] No associations on boot. Requerying for associations after 30 seconds.
2021-10-14 07:32:21 INFO [ssm-agent-worker] [MessagingDeliveryService] [Association] Schedule manager refreshed with 0 associations, 0 new associations associated
2021-10-14 07:32:26 INFO [ssm-agent-worker] [HealthCheck] HealthCheck reporting agent health.
2021-10-14 07:34:51 INFO [ssm-agent-worker] [MessageGatewayService] Validating SSM parameters
2021-10-14 07:34:51 INFO [ssm-agent-worker] [MessageGatewayService] [EngineProcessor] [BasicExecuter] [<IAMロール名>-0e415a031bdce7766] channel: <IAMロール名>-0e415a031bdce7766 not found, creating a new file channel...
2021-10-14 07:34:51 INFO Agent will take identity from EC2
2021-10-14 07:34:51 INFO [ssm-agent-worker] [MessageGatewayService] [EngineProcessor] [BasicExecuter] [<IAMロール名>-0e415a031bdce7766] master listener started on path: /var/lib/amazon/ssm/i-08ddde217f064e3b6/channels/<IAMロール名>-0e415a031bdce7766
2021-10-14 07:34:51 INFO [ssm-session-worker] [<IAMロール名>-0e415a031bdce7766] ssm-session-worker - v3.0.1124.0
2021-10-14 07:34:51 INFO [ssm-agent-worker] [MessageGatewayService] [EngineProcessor] [BasicExecuter] [<IAMロール名>-0e415a031bdce7766] inter process communication started at /var/lib/amazon/ssm/i-08ddde217f064e3b6/channels/<IAMロール名>-0e415a031bdce7766
2021-10-14 07:34:51 INFO [ssm-session-worker] [<IAMロール名>-0e415a031bdce7766] document: <IAMロール名>-0e415a031bdce7766 worker started
2021-10-14 07:34:51 INFO [ssm-session-worker] [<IAMロール名>-0e415a031bdce7766] channel: <IAMロール名>-0e415a031bdce7766 found
2021-10-14 07:34:51 INFO [ssm-session-worker] [<IAMロール名>-0e415a031bdce7766] inter process communication started at /var/lib/amazon/ssm/i-08ddde217f064e3b6/channels/<IAMロール名>-0e415a031bdce7766
2021-10-14 07:34:51 INFO [ssm-session-worker] [<IAMロール名>-0e415a031bdce7766] worker listener started on path: /var/lib/amazon/ssm/i-08ddde217f064e3b6/channels/<IAMロール名>-0e415a031bdce7766
2021-10-14 07:34:51 INFO [ssm-session-worker] [<IAMロール名>-0e415a031bdce7766] [DataBackend] received plugin config message
2021-10-14 07:34:51 INFO [ssm-session-worker] [<IAMロール名>-0e415a031bdce7766] [DataBackend] {"DocumentInformation":{"DocumentID":"<IAMロール名>-0e415a031bdce7766","CommandID":"<IAMロール名>-0e415a031bdce7766","AssociationID":"","InstanceID":"i-08ddde217f064e3b6","MessageID":"<IAMロール名>-0e415a031bdce7766","RunID":"2021-10-14T07-34-51.557Z","CreatedDate":"53755-08-21 20:59:16 +0000 UTC","DocumentName":"","DocumentVersion":"","DocumentStatus":"InProgress","RunCount":0,"ProcInfo":{"Pid":2329,"StartTime":"2021-10-14T07:34:51.56010895Z"},"ClientId":"","RunAsUser":"","SessionOwner":"arn:aws:sts::984900217833:assumed-role/<IAMロール名>/<IAMロール名>"},"DocumentType":"StartSession","SchemaVersion":"1.0","InstancePluginsInformation":[{"Configuration":{"Settings":null,"Properties":null,"OutputS3KeyPrefix":"","OutputS3BucketName":"","S3EncryptionEnabled":true,"CloudWatchLogGroup":"","CloudWatchEncryptionEnabled":true,"CloudWatchStreamingEnabled":true,"OrchestrationDirectory":"/var/lib/amazon/ssm/i-08ddde217f064e3b6/session/orchestration/<IAMロール名>-0e415a031bdce7766/Standard_Stream","MessageId":"<IAMロール名>-0e415a031bdce7766","BookKeepingFileName":"<IAMロール名>-0e415a031bdce7766","PluginName":"Standard_Stream","PluginID":"Standard_Stream","DefaultWorkingDirectory":"","Preconditions":null,"IsPreconditionEnabled":false,"CurrentAssociations":null,"SessionId":"<IAMロール名>-0e415a031bdce7766","ClientId":"","KmsKeyId":"","RunAsEnabled":false,"RunAsUser":"","ShellProfile":{"windows":"","linux":""},"SessionOwner":"arn:aws:sts::984900217833:assumed-role/<IAMロール名>/<IAMロール名>"},"Name":"Standard_Stream","Result":{"pluginID":"","pluginName":"","status":"","code":0,"output":null,"startDateTime":"0001-01-01T00:00:00Z","endDateTime":"0001-01-01T00:00:00Z","outputS3BucketName":"","outputS3KeyPrefix":"","stepName":"","error":"","standardOutput":"","standardError":""},"Id":"Standard_Stream"}],"CancelInformation":{"CancelMessageID":"","CancelCommandID":"","Payload":"","DebugInfo":""},"IOConfig":{"OrchestrationDirectory":"/var/lib/amazon/ssm/i-08ddde217f064e3b6/session/orchestration/<IAMロール名>-0e415a031bdce7766","OutputS3BucketName":"","OutputS3KeyPrefix":"","CloudWatchConfig":{"LogGroupName":"","LogStreamPrefix":"","LogGroupEncryptionEnabled":false}}}
2021-10-14 07:34:51 INFO [ssm-session-worker] [<IAMロール名>-0e415a031bdce7766] [DataBackend] Running plugin Standard_Stream Standard_Stream
2021-10-14 07:34:51 INFO [ssm-session-worker] [<IAMロール名>-0e415a031bdce7766] [DataBackend] [pluginName=Standard_Stream] Setting up datachannel for session: <IAMロール名>-0e415a031bdce7766, requestId: 4c7bbe64-da2c-4a32-867a-72c4411c2911, clientId: 
2021-10-14 07:34:51 INFO [ssm-session-worker] [<IAMロール名>-0e415a031bdce7766] [DataBackend] [pluginName=Standard_Stream] Opening websocket connection to: wss://ssmmessages.us-east-1.amazonaws.com/v1/data-channel/<IAMロール名>-0e415a031bdce7766?role=publish_subscribe
2021-10-14 07:34:51 INFO [ssm-session-worker] [<IAMロール名>-0e415a031bdce7766] [DataBackend] [pluginName=Standard_Stream] Successfully opened websocket connection to: wss://ssmmessages.us-east-1.amazonaws.com/v1/data-channel/<IAMロール名>-0e415a031bdce7766?role=publish_subscribe
2021-10-14 07:34:51 INFO [ssm-session-worker] [<IAMロール名>-0e415a031bdce7766] [DataBackend] [pluginName=Standard_Stream] Starting websocket pinger
2021-10-14 07:34:51 INFO [ssm-session-worker] [<IAMロール名>-0e415a031bdce7766] [DataBackend] [pluginName=Standard_Stream] Starting websocket listener
2021-10-14 07:34:51 INFO [ssm-session-worker] [<IAMロール名>-0e415a031bdce7766] [DataBackend] [pluginName=Standard_Stream] Skipping handshake.
2021-10-14 07:34:51 INFO [ssm-session-worker] [<IAMロール名>-0e415a031bdce7766] [DataBackend] [pluginName=Standard_Stream] Starting command executor
2021-10-14 07:34:51 INFO [ssm-session-worker] [<IAMロール名>-0e415a031bdce7766] [DataBackend] [pluginName=Standard_Stream] ssm-user already exists.
2021-10-14 07:34:51 INFO [ssm-session-worker] [<IAMロール名>-0e415a031bdce7766] [DataBackend] [pluginName=Standard_Stream] Plugin Standard_Stream started

VPCエンドポイントをShared VPCに集約することによる課金額への影響

VPCエンドポイントへの接続パターン

おまけでVPCエンドポイントをShared VPCに集約することによる課金額への影響を確認します。具体的には、以下VPCエンドポイントへの接続パターン毎に課金額がどのようになるのかを算出します。

  1. VPCエンドポイントをShared VPCに集約するパターン(Transit Gatewayで接続)
  2. VPCエンドポイントをShared VPCに集約するパターン(VPCピアリングで接続)
  3. VPC毎にVPCエンドポイントを作成するパターン(Transit Gatewayで接続)
  4. VPC毎にVPCエンドポイントを作成するパターン(VPC間の接続なし)

課金額計算の前提

課金額を算出するにあたっての前提条件は以下の通りです。

  • 2021年10月時点の東京リージョンの料金を参照
  • 1ヶ月あたりの課金額を計算
  • 1ヶ月は720時間として計算
  • VPCエンドポイントは2AZに配置
  • VPCエンドポイントは3サービス分作成
  • VPCエンドポイントが処理するデータ量は1ヶ月に1PB未満
  • VPCエンドポイントをShared VPCに集約する場合、Shared VPCに接続するVPCは3つで計算
  • VPCエンドポイントをShared VPCに集約しない場合はVPCを3つで計算
  • 以下に関する課金は計算に含めない
    • AZ間の通信
    • 各VPCとオンプレミス環境間の通信
    • Shaed VPC以外のVPC間通信

参考情報

1. VPCエンドポイントをShared VPCに集約するパターン(Transit Gatewayで接続)

構成図は以下のようになります。

1.VPCエンドポイントをShared VPCに集約するパターン(Transit Gatewayで接続)構成図

1ヶ月あたりの課金額の計算結果は以下の通りです。

1ヶ月あたりのVPCエンドポイントの課金額

= (VPCエンドポイントの1時間あたりの課金額 * AZ数) * 1ヶ月あたりの利用時間 + Route 53 Private Hosted Zoneの1ヶ月あたりの課金額
= (0.01 USD/h * 2 AZ ) * 720 h + 0.5 USD/m
= 14.9 USD/m

1ヶ月あたりのTransit Gateway Attachmentの課金額

= Transit Gateway Attachmentごとの1時間あたりの課金額 * 1ヶ月あたりの利用時間
= 0.07 USD * 720 h
= 50.4 USD/m

処理データ1GBあたりの課金額

= VPCエンドポイントの処理データ1GBあたりの課金額 + Transit Gatewayの処理データ1GBあたりの課金額
= 0.01 USD/GB + 0.02 USD/GB
= 0.03 USD/GB

3つのVPCエンドポイントをShared VPCに集約する場合の1ヶ月あたりの課金額

[固定費]
= 1ヶ月あたりのVPCエンドポイントの課金額 * VPCエンドポイントの数 + 1ヶ月あたりのTransit Gateway Attachmentの課金額 * VPC数
= 14.9 USD/m * 3 VPCエンドポイント + 50.4 USD/m * 4 VPC
= 44.7 USD/m + 201.6 USD/m
= 246.3 USD/m

[変動費]
= 処理データ1GBあたりの課金額
= 0.03 USD/GB

[総課金額]
= 246.3 USD/m + 0.03 USD/GB

また、VPC数, VPCエンドポイント数を変更すると固定費は以下のように変化します。

  • VPC数, VPCエンドポイント数 = 3, 3 : 246.3 USD
  • VPC数, VPCエンドポイント数 = 3, 5 : 276.1 USD
  • VPC数, VPCエンドポイント数 = 3, 10 : 350.6 USD
  • VPC数, VPCエンドポイント数 = 5, 3 : 347.1 USD
  • VPC数, VPCエンドポイント数 = 5, 5 : 376.9 USD
  • VPC数, VPCエンドポイント数 = 5, 10 : 451.4 USD
  • VPC数, VPCエンドポイント数 = 10, 3 : 599.1 USD
  • VPC数, VPCエンドポイント数 = 10, 5 : 628.9 USD
  • VPC数, VPCエンドポイント数 = 10, 10 : 703.4 USD

1. VPCエンドポイントをShared VPCに集約するパターン(Transit Gatewayで接続)_VPC数, VPCエンドポイント数の組み合わせ毎の固定費

2. VPCエンドポイントをShared VPCに集約するパターン(VPCピアリングで接続)

構成図は以下のようになります。

2. VPCエンドポイントをShared VPCに集約するパターン(VPCピアリングで接続)構成図

1ヶ月あたりの課金額の計算結果は以下の通りです。

1ヶ月あたりのVPCエンドポイントの課金額

= (VPCエンドポイントの1時間あたりの課金額 * AZ数) * 1ヶ月あたりの利用時間 + Route 53 Private Hosted Zoneの1ヶ月あたりの課金額
= (0.01 USD/h * 2 AZ ) * 720 h + 0.5 USD/m
= 14.9 USD/m

処理データ1GBあたりの課金額

= VPCエンドポイントの処理データ1GBあたりの課金額
= 0.01 USD/GB

3つのVPCエンドポイントをShared VPCに集約する場合の1ヶ月あたりの課金額

[固定費]
= 1ヶ月あたりのVPCエンドポイントの課金額 * VPCエンドポイントの数
= 14.9 USD/m * 3 VPCエンドポイント
= 44.7 USD/m

[変動費]
= 処理データ1GBあたりの課金額
= 0.01 USD/GB

[総課金額]
= 44.7 USD/m + 0.01 USD/GB

また、VPC数, VPCエンドポイント数を変更すると固定費は以下のように変化します。

  • VPC数, VPCエンドポイント数 = 3, 3 : 44.7 USD
  • VPC数, VPCエンドポイント数 = 3, 5 : 74.5 USD
  • VPC数, VPCエンドポイント数 = 3, 10 : 149.0 USD
  • VPC数, VPCエンドポイント数 = 5, 3 : 44.7 USD
  • VPC数, VPCエンドポイント数 = 5, 4 : 74.5 USD
  • VPC数, VPCエンドポイント数 = 5, 10 : 149.0 USD
  • VPC数, VPCエンドポイント数 = 10, 3 : 44.7 USD
  • VPC数, VPCエンドポイント数 = 10, 4 : 74.5 USD
  • VPC数, VPCエンドポイント数 = 10, 10 : 149.0 USD

2. VPCエンドポイントをShared VPCに集約するパターン(VPCピアリングで接続)_VPC数, VPCエンドポイント数の組み合わせ毎の固定費

3. VPC毎にVPCエンドポイントを作成するパターン(Transit Gatewayで接続)

構成図は以下のようになります。

3. VPC毎にVPCエンドポイントを作成するパターン(Transit Gatewayで接続)構成図

1ヶ月あたりの課金額の計算結果は以下の通りです。

1ヶ月あたりのVPCエンドポイントの課金額

= (VPCエンドポイントの1時間あたりの課金額 * AZ数) * 1ヶ月あたりの利用時間
= (0.01 USD/h * 2 AZ ) * 720 h
= 14.4 USD/m

1ヶ月あたりのTransit Gateway Attachmentの課金額

= Transit Gateway Attachmentごとの1時間あたりの課金額 * 1ヶ月あたりの利用時間
= 0.07 USD * 720 h
= 50.4 USD/m

処理データ1GBあたりの課金額

= VPCエンドポイントの処理データ1GBあたりの課金額
= 0.01 USD

3つのVPCエンドポイントをVPC毎に作成する場合の1ヶ月あたりの課金額

[固定費]
= 1ヶ月あたりのVPCエンドポイントの課金額 * VPCエンドポイントの数 * VPC数 + 1ヶ月あたりのTransit Gateway Attachmentの課金額 * VPC数
= 14.9 USD/m * 3 VPCエンドポイント * 3 VPC + 50.4 USD/m * 3 VPC
= 134.1 USD/m + 151.2 USD/m
= 285.3 USD/m

[変動費]
= 処理データ1GBあたりの課金額
= 0.01 USD/GB

[総課金額]
= 285.3 USD/m + 0.01 USD/GB

また、VPC数, VPCエンドポイント数を変更すると固定費は以下のように変化します。

  • VPC数, VPCエンドポイント数 = 3, 3 : 285.3 USD
  • VPC数, VPCエンドポイント数 = 3, 5 : 374.7 USD
  • VPC数, VPCエンドポイント数 = 3, 10 : 598.2 USD
  • VPC数, VPCエンドポイント数 = 5, 3 : 475.5 USD
  • VPC数, VPCエンドポイント数 = 5, 5 : 624.5 USD
  • VPC数, VPCエンドポイント数 = 5, 10 : 997.0 USD
  • VPC数, VPCエンドポイント数 = 10, 3 : 951.0 USD
  • VPC数, VPCエンドポイント数 = 10, 5 : 1249.0 USD
  • VPC数, VPCエンドポイント数 = 10, 10 : 1994.0 USD

3. VPC毎にVPCエンドポイントを作成するパターン(Transit Gatewayで接続)_VPC数, VPCエンドポイント数の組み合わせ毎の固定費

4. VPC毎にVPCエンドポイントを作成するパターン(VPC間の接続なし)

構成図は以下のようになります。

4. VPC毎にVPCエンドポインを作成するパターン(VPC間の接続はなし)構成図

1ヶ月あたりの課金額の計算結果は以下の通りです。

1ヶ月あたりのVPCエンドポイントの課金額

= (VPCエンドポイントの1時間あたりの課金額 * AZ数) * 1ヶ月あたりの利用時間
= (0.01 USD/h * 2 AZ ) * 720 h
= 14.4 USD/m

処理データ1GBあたりの課金額

= VPCエンドポイントの処理データ1GBあたりの課金額
= 0.01 USD

3つのVPCエンドポイントをVPC毎に作成する場合の1ヶ月あたりの課金額

[固定費]
= 1ヶ月あたりのVPCエンドポイントの課金額 * VPCエンドポイントの数 * VPC数
= 14.9 USD/m * 3 VPCエンドポイント * 3 VPC
= 134.1 USD/m

[変動費]
= 処理データ1GBあたりの課金額
= 0.01 USD/GB

[総課金額]
= 134.1 USD/m + 0.01 USD/GB

また、VPC数, VPCエンドポイント数を変更すると固定費は以下のように変化します。

  • VPC数, VPCエンドポイント数 = 3, 3 : 134.1 USD
  • VPC数, VPCエンドポイント数 = 3, 5 : 223.5 USD
  • VPC数, VPCエンドポイント数 = 3, 10 : 447.0 USD
  • VPC数, VPCエンドポイント数 = 5, 3 : 223.5 USD
  • VPC数, VPCエンドポイント数 = 5, 5 : 372.5 USD
  • VPC数, VPCエンドポイント数 = 5, 10 : 745.0 USD
  • VPC数, VPCエンドポイント数 = 10, 3 : 447.0 USD
  • VPC数, VPCエンドポイント数 = 10, 5 : 745.0 USD
  • VPC数, VPCエンドポイント数 = 10, 10 : 1490.0 USD

4. VPC毎にVPCエンドポイントを作成するパターン(VPC間の接続なし)_VPC数, VPCエンドポイント数の組み合わせ毎の固定費

課金額の比較

VPCエンドポイントへの接続パターン毎の課金額をまとめると以下の通りです。

  • 246.3 USD/m + 0.03 USD/GB : 1. VPCエンドポイントをShared VPCに集約するパターン(Transit Gatewayで接続)
  • 44.7 USD/m + 0.01 USD/GB : 2. VPCエンドポイントをShared VPCに集約するパターン(VPCピアリングで接続)
  • 285.3 USD/m + 0.01 USD/GB : 3. VPC毎にVPCエンドポイントを作成するパターン(Transit Gatewayで接続)
  • 134.1 USD/m + 0.01 USD/GB : 4. VPC毎にVPCエンドポイントを作成するパターン(VPC間の接続なし)

固定費が課金額全体の中で大きなウェイトとなるので、VPCエンドポイントの集約の有無で、どの程度固定費に差が出るのかを比較してみました。

比較結果は以下の通りです。

  • 1. VPCエンドポイントをShared VPCに集約するパターン(Transit Gatewayで接続)の固定費」 と 「3. VPC毎にVPCエンドポイントを作成するパターン(Transit Gatewayで接続)の固定費」の比較
VPC数, VPCエンドポイント数の組み合わせ 1. VPCエンドポイントをShared VPCに集約するパターン(Transit Gatewayで接続)の固定費 3. VPC毎にVPCエンドポイントを作成するパターン(Transit Gatewayで接続)の固定費 VPCエンドポイントの集約の有無による課金額の差
VPC数, VPCエンドポイント数 = 3, 3 246.3 USD 285.3 USD 13.67%
VPC数, VPCエンドポイント数 = 3, 5 276.1 USD 374.7 USD 26.31%
VPC数, VPCエンドポイント数 = 3, 10 350.6 USD 598.2 USD 41.39%
VPC数, VPCエンドポイント数 = 5, 3 347.1 USD 475.5 USD 27.00%
VPC数, VPCエンドポイント数 = 5, 5 376.9 USD 624.5 USD 39.65%
VPC数, VPCエンドポイント数 = 5, 10 451.4 USD 997.0 USD 54.72%
VPC数, VPCエンドポイント数 = 10, 3 599.1 USD 951.0 USD 37.00%
VPC数, VPCエンドポイント数 = 10, 5 628.9 USD 1249.0 USD 49.65%
VPC数, VPCエンドポイント数 = 10, 10 703.4 USD 1994.0 USD 64.72%
  • 1. VPCエンドポイントをShared VPCに集約するパターン(Transit Gatewayで接続)の固定費」 と 「4. VPC毎にVPCエンドポイントを作成するパターン(VPC間の接続はなし)の固定費」の比較
VPC数, VPCエンドポイント数の組み合わせ 1. VPCエンドポイントをShared VPCに集約するパターン(Transit Gatewayで接続)の固定費 4. VPC毎にVPCエンドポイントを作成するパターン(VPC間の接続はなし)の固定費 VPCエンドポイントの集約の有無による課金額の差
VPC数, VPCエンドポイント数 = 3, 3 246.3 USD 134.1 USD -83.67%
VPC数, VPCエンドポイント数 = 3, 5 276.1 USD 223.5 USD -23.53%
VPC数, VPCエンドポイント数 = 3, 10 350.6 USD 447.0 USD 21.57%
VPC数, VPCエンドポイント数 = 5, 3 347.1 USD 223.5 USD -55.30%
VPC数, VPCエンドポイント数 = 5, 5 376.9 USD 372.5 USD -1.18%
VPC数, VPCエンドポイント数 = 5, 10 451.4 USD 745.0 USD 39.41%
VPC数, VPCエンドポイント数 = 10, 3 599.1 USD 447.0 USD -34.03%
VPC数, VPCエンドポイント数 = 10, 5 628.9 USD 745.0 USD 15.58%
VPC数, VPCエンドポイント数 = 10, 10 703.4 USD 1490.0 USD 52.79%
  • 2. VPCエンドポイントをShared VPCに集約するパターン(VPCピアリングで接続)」 と 「4. VPC毎にVPCエンドポイントを作成するパターン(VPC間の接続はなし)の固定費」の比較
VPC数, VPCエンドポイント数の組み合わせ 2. VPCエンドポイントをShared VPCに集約するパターン(VPCピアリングで接続)の固定費 4. VPC毎にVPCエンドポイントを作成するパターン(VPC間の接続はなし)の固定費 VPCエンドポイントの集約の有無による課金額の差
VPC数, VPCエンドポイント数 = 3, 3 44.7 USD 134.1 USD 66.67%
VPC数, VPCエンドポイント数 = 3, 5 74.5 USD 223.5 USD 66.67%
VPC数, VPCエンドポイント数 = 3, 10 149.0 USD 447.0 USD 66.67%
VPC数, VPCエンドポイント数 = 5, 3 44.7 USD 223.5 USD 80.00%
VPC数, VPCエンドポイント数 = 5, 5 74.5 USD 372.5 USD 80.00%
VPC数, VPCエンドポイント数 = 5, 10 149.0 USD 745.0 USD 80.00%
VPC数, VPCエンドポイント数 = 10, 3 44.7 USD 447.0 USD 90.00%
VPC数, VPCエンドポイント数 = 10, 5 74.5 USD 745.0 USD 90.00%
VPC数, VPCエンドポイント数 = 10, 10 149.0 USD 1490.0 USD 90.00%

VPCエンドポイントにアクセスしたいVPC及び、VPCエンドポイントの数が多くなれば多くなるほど、VPCエンドポイントを集約した方がお得になっていく傾向があることが分かります。

変動費は「1ヶ月あたりの処理データ量」がありますが、例え100GBの通信が発生したとしても最大3 USDしか影響しないため、課金額全体への影響は微々たるものだと考えます。

また、Transit GatewayとVPCピアリングのどちらでShared VPCに接続するかでコストが大きく変わります。Transit Gatewayで接続するか、VPCピアリングで接続するかは、以下を目安に考えると良いかと思います。

  • 以下に当てはまる場合はTransit Gatewayでの接続を考える
    • 複数のVPC間でメッシュ状にピア接続を行う必要がある
    • オンプレミス環境と接続したいVPCの数が多い (目安は11個以上)
    • コストをかけてでもネットワーク管理や制御を簡素化したい
  • 以下に当てはまる場合はVPCピアリングでの接続を考える
    • ピア接続が必要なVPCが限られる
    • オンプレミス環境と接続したいVPCの数が少ない (目安は10個以下)
    • Transit VIFを用意できない
    • とにかくコストを安くしたい

基本はVPCエンドポイントを集約してもいいかも

AWS Transit Gatewayに接続したShared VPCにAWS VPCエンドポイントを集約してみました。

課金額に注目すると、VPCエンドポイントの集約は確かにメリットがあることを確認できました。

一方で、VPCエンドポイントを共有して使用するため、リソース変更の柔軟性は失ってしまいます。また、Transit GatewayでShared VPCに接続すると、VPCエンドポイントへ通信する際に追加で課金が発生してしまうので要注意です。

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

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