AWS Transit Gatewayに接続したShared VPCにAWS PrivateLinkを集約してみた

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

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

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

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

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

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

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

いきなりまとめ

  • Shared VPCにあるPrivateLinkにアクセスするためには、Route 53 Private Hosted Zoneが必須
    • 共有したいPrivateLinkの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アドレスが返ってくる
  • PrivateLinkにアクセスしたいVPC及びPrivateLinkの数が多くなれば多くなるほど、PrivateLinkを集約した方がお得になっていく傾向がある
  • Transit GatewayとVPCピアリングのどちらでShared VPCに接続するかでコストが大きく変わる
    • 以下に当てはまる場合はTransit Gatewayでの接続を考える
      • 複数のVPC間でメッシュ状にピア接続を行う必要がある
      • オンプレミス環境と接続したいVPCの数が多い (目安は11個以上)
      • コストをかけてでもネットワーク管理や制御を簡素化したい
    • 以下に当てはまる場合はVPCピアリングでの接続を考える
      • ピア接続が必要なVPCが限られる
      • オンプレミス環境と接続したいVPCの数が少ない (目安は10個以下)
      • Transit VIFを用意できない
      • とにかくコストを安くしたい

検証の環境と進め方

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

検証環境構成図

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

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

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

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

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

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

SSMのPrivateLinkの確認

試しにサービス名が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名は、あるリージョンのサービスエンドポイントであり、PrivateLinkと関連付いていないためです。

vpce-から始まるDNS名はグローバルに一意なDNS名です。そのため、名前解決したときに、service-code.region-code.amazonaws.comドメインはサブドメインであるvpc-xxxxがどこのVPC上で作成されたPrivateLinkかを一意に特定できます。結果として、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のPrivateLink(vpce-07f12be0f999f2576-0mz5lmwo.ssm.us-east-1.vpce.amazonaws.com)と認識できるようになれば、名前解決したときに、そのPrivateLinkのプライベートIPアドレスを返してくれるようになります。

このような動作をするように、「PrivateLink毎のRoute53 Private Hosted Zoneの作成と、作成したRoute53 Private Hosted ZoneのVPC Aへの関連付け」を行います。

PrivateLink毎のRoute53 Private Hosted Zoneの作成とVPC Aへの関連付け

それでは、PrivateLink毎のRoute53 Private Hosted Zoneの作成とVPC Aへの関連付けを行います。

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

Route53 Private Hosted Zoneの作成

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

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

Route53 Private Hosted Zoneの設定

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

Route53 Private Hosted Zoneの作成完了

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

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

レコードの作成

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

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

レコードのクイック作成

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

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

他のPrivateLinkについても、Private Hosted Zone作成とレコードの追加をします。

作成したPrivate Hosted Zoneの確認

この状態で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上のPrivateLinkに正常にアクセスできていそうですね。

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

PrivateLinkをShared VPCに集約することによる課金額への影響

PrivateLinkへの接続パターン

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

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

課金額計算の前提

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

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

参考情報

1. PrivateLinkをShared VPCに集約するパターン(Transit Gatewayで接続)

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

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

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

1ヶ月あたりのPrivateLinkの課金額

= (PrivateLinkの1時間あたりの課金額 * AZ数) * 1ヶ月あたりの利用時間 + Route53 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あたりの課金額

= PrivateLinkの処理データ1GBあたりの課金額 + Transit Gatewayの処理データ1GBあたりの課金額
= 0.01 USD/GB + 0.02 USD/GB
= 0.03 USD/GB

3つのPrivateLinkをShared VPCに集約する場合の1ヶ月あたりの課金額

[固定費]
= 1ヶ月あたりのPrivateLinkの課金額 * PrivateLinkの数 + 1ヶ月あたりのTransit Gateway Attachmentの課金額 * VPC数
= 14.9 USD/m * 3 PrivateLink + 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数, PrivateLink数を変更すると固定費は以下のように変化します。

  • VPC数, PrivateLink数 = 3, 3 : 246.3 USD
  • VPC数, PrivateLink数 = 3, 5 : 276.1 USD
  • VPC数, PrivateLink数 = 3, 10 : 350.6 USD
  • VPC数, PrivateLink数 = 5, 3 : 347.1 USD
  • VPC数, PrivateLink数 = 5, 5 : 376.9 USD
  • VPC数, PrivateLink数 = 5, 10 : 451.4 USD
  • VPC数, PrivateLink数 = 10, 3 : 599.1 USD
  • VPC数, PrivateLink数 = 10, 5 : 628.9 USD
  • VPC数, PrivateLink数 = 10, 10 : 703.4 USD

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

2. PrivateLinkをShared VPCに集約するパターン(VPCピアリングで接続)

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

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

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

1ヶ月あたりのPrivateLinkの課金額

= (PrivateLinkの1時間あたりの課金額 * AZ数) * 1ヶ月あたりの利用時間 + Route53 Private Hosted Zoneの1ヶ月あたりの課金額
= (0.01 USD/h * 2 AZ ) * 720 h + 0.5 USD/m
= 14.9 USD/m

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

= PrivateLinkの処理データ1GBあたりの課金額
= 0.01 USD/GB

3つのPrivateLinkをShared VPCに集約する場合の1ヶ月あたりの課金額

[固定費]
= 1ヶ月あたりのPrivateLinkの課金額 * PrivateLinkの数
= 14.9 USD/m * 3 PrivateLink
= 44.7 USD/m

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

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

また、VPC数, PrivateLink数を変更すると固定費は以下のように変化します。

  • VPC数, PrivateLink数 = 3, 3 : 44.7 USD
  • VPC数, PrivateLink数 = 3, 5 : 74.5 USD
  • VPC数, PrivateLink数 = 3, 10 : 149.0 USD
  • VPC数, PrivateLink数 = 5, 3 : 44.7 USD
  • VPC数, PrivateLink数 = 5, 4 : 74.5 USD
  • VPC数, PrivateLink数 = 5, 10 : 149.0 USD
  • VPC数, PrivateLink数 = 10, 3 : 44.7 USD
  • VPC数, PrivateLink数 = 10, 4 : 74.5 USD
  • VPC数, PrivateLink数 = 10, 10 : 149.0 USD

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

3. VPC毎にPrivateLinkを作成するパターン(Transit Gatewayで接続)

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

3. VPC毎にPrivateLinkを作成するパターン(Transit Gatewayで接続)構成図

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

1ヶ月あたりのPrivateLinkの課金額

= (PrivateLinkの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あたりの課金額

= PrivateLinkの処理データ1GBあたりの課金額
= 0.01 USD

3つのPrivateLinkをVPC毎に作成する場合の1ヶ月あたりの課金額

[固定費]
= 1ヶ月あたりのPrivateLinkの課金額 * PrivateLinkの数 * VPC数 + 1ヶ月あたりのTransit Gateway Attachmentの課金額 * VPC数
= 14.9 USD/m * 3 PrivateLink * 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数, PrivateLink数を変更すると固定費は以下のように変化します。

  • VPC数, PrivateLink数 = 3, 3 : 285.3 USD
  • VPC数, PrivateLink数 = 3, 5 : 374.7 USD
  • VPC数, PrivateLink数 = 3, 10 : 598.2 USD
  • VPC数, PrivateLink数 = 5, 3 : 475.5 USD
  • VPC数, PrivateLink数 = 5, 5 : 624.5 USD
  • VPC数, PrivateLink数 = 5, 10 : 997.0 USD
  • VPC数, PrivateLink数 = 10, 3 : 951.0 USD
  • VPC数, PrivateLink数 = 10, 5 : 1249.0 USD
  • VPC数, PrivateLink数 = 10, 10 : 1994.0 USD

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

4. VPC毎にPrivateLinkを作成するパターン(VPC間の接続なし)

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

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

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

1ヶ月あたりのPrivateLinkの課金額

= (PrivateLinkの1時間あたりの課金額 * AZ数) * 1ヶ月あたりの利用時間
= (0.01 USD/h * 2 AZ ) * 720 h
= 14.4 USD/m

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

= PrivateLinkの処理データ1GBあたりの課金額
= 0.01 USD

3つのPrivateLinkをVPC毎に作成する場合の1ヶ月あたりの課金額

[固定費]
= 1ヶ月あたりのPrivateLinkの課金額 * PrivateLinkの数 * VPC数
= 14.9 USD/m * 3 PrivateLink * 3 VPC
= 134.1 USD/m

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

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

また、VPC数, PrivateLink数を変更すると固定費は以下のように変化します。

  • VPC数, PrivateLink数 = 3, 3 : 134.1 USD
  • VPC数, PrivateLink数 = 3, 5 : 223.5 USD
  • VPC数, PrivateLink数 = 3, 10 : 447.0 USD
  • VPC数, PrivateLink数 = 5, 3 : 223.5 USD
  • VPC数, PrivateLink数 = 5, 5 : 372.5 USD
  • VPC数, PrivateLink数 = 5, 10 : 745.0 USD
  • VPC数, PrivateLink数 = 10, 3 : 447.0 USD
  • VPC数, PrivateLink数 = 10, 5 : 745.0 USD
  • VPC数, PrivateLink数 = 10, 10 : 1490.0 USD

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

課金額の比較

PrivateLinkへの接続パターン毎の課金額をまとめると以下の通りです。

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

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

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

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

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

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

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

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

AWS Transit Gatewayに接続したShared VPCにAWS PrivateLinkを集約してみました。

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

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

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

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