すこぶる.net

技術系備忘録など

VPC VPC Endpoint VPC Peering

VPCピアリングで他VPCのVPCエンドポイント(インターフェイス)を利用する方法

投稿日:2024年3月8日 更新日:

現状と課題

AWSのコストカットをしたいと思い、Cost Exploer で確認したところ、VPCエンドポイントの利用料金が高額になっていることに気づきました。
2024年3月時点で、VPCエンドポイント(インターフェイスエンドポイント)の料金は東京リージョンで1時間あたり USD 0.014 となっています。

アプリケーションの実行環境には Fargate を利用しており、8つのVPCエンドポイントを、開発環境(dev)、ステージング環境(stg)、本番環境(prd)ごとにそれぞれ作成している状態でしたので、$0.014/hour * 24 hour * 30 days * 8 endpoint * 3 environment * 150(1ドル150円) = ¥36,288/month となっていました。
そこで、今回は shread 環境の VPC (以下 shared VPC)を作成し、それぞれの環境からそれを利用し、VPCエンドポイントを集約してみることにしました。そうすることで、コストを 1/3 に抑えることができ幸せになるはずです。

イメージは以下のような感じになります。

実施内容

1. VPCピアリングを dev VPC から shared VPC に向けて設定する。

  • リクエスタ VPC: dev VPC (IPv4 CIDR: 10.2.0.0/16)
  • アクセプタ VPC: shared VPC (IPv4 CIDR: 10.255.0.0/16)

Terraform のコードも載せておきます。

そして、dev, shared のルートテーブルの設定も行います。 (ターゲット pcx-xxxxx)
ちなみに、Transit Gateway(TGW) でも可能ですので、そのあたりはユースケースやコストを比較して検討してください。

2. shared 側で VPCエンドポイントを作成する

まず、VPCエンドポイントにアタッチするセキュリティグループを作成します。
dev VPC からの接続を許可するために、CIDR、もしくはセキュリティグループを許可する設定をしてください。
※ 許可するポートは 443 番ポートだけで問題ありません
作成したセキュリティグループを用いて 今回は Amazon ECR インターフェース VPCエンドポイントを作成します。
注意点は、コンソールで確認できる設定項目「プライベート DNS名を有効にする」を”無効”にしておく必要があることです。(private_dns_enabled を false にする)
後ほど使用するため、作成されたエンドポイントのDNS名をメモしておきます。
ゾーンごとにDNS名が存在しますが、 ap-northeast-“1” のものだけメモしておいてください。
vpce-xxxxxxxxxxx-yyyyyyy.dkr.ecr.ap-northeast-1.vpce.amazonaws.com

3. Route53 でプライベートホストゾーンを作成する

Route53 で以下の設定のプライベートホストゾーンを作成してください。

  • Domain: dkr.ecr.ap-northeast-1.amazonaws.com
  • Comment: 任意
  • Type: Private Host Zone
  • VPC ID: shared (エンドポイントを持つ側のVPC) ※後述してますが、この時点で dev VPC も追加して構いません

次に、以下の設定のエイリアスレコードを作成したホストゾーンに追加してください。

  • Host: なし
  • Type: A (エイリアス)
  • Value: 作成したエンドポイント (メモした vpce-xxxxxxxxxxx-yyyyyyy.dkr.ecr.ap-northeast-1.vpce.amazonaws.com になります。)
最後に、作成した Route53 のプライベートホストゾーンに dev VPC を関連付けます。
以下、コマンド例ですが、先程のプライベートホストゾーンを作成する際にdev VPC も追加して関連付けさせておいても問題ありませんし、後からコンソール上で編集して追加も可能です。

もしコンソールから実行して関連付けが失敗した場合や、コマンドで実行して以下のようなエラーが出る場合は、dev で先に存在していたエンドポイントのプライベートDNS名を無効、もしくは削除してください。
An error occurred (ConflictingDomainExists) when calling the AssociateVPCWithHostedZone operation: The VPC vpc-0aaaaaaaaaaa in region ap-northeast-1 has already been associated with the hosted zone Z0XXXXXXXXXXX with the same domain name.
無効にした場合、以下のDNS名が設定から消えていることが確認できると思います。
  • dkr.ecr.ap-northeast-1.amazonaws.com
  • *.dkr.ecr.ap-northeast-1.amazonaws.com
この状態ですと、以下のように同 dev VPC 内にあるインスタンスから dkr.ecr.ap-northeast-1.amazonaws.com が引けなくなっていることが確認できると思います。

作成したプライベートホストゾーンに dev VPCの関連付けが可能になり関連付けが完了したらようやく、 shared VPC のIP(10.255.0.0/16)を持つ結果を得ることができるようになっていると思います。つまりこの時点で、 dev VPC から shared VPC のVPCエンドポイントを利用できるようになりました。

最後に、不要になった dev VPC の VPCエンドポイントを削除して完了となります。
サービスの要件に合わせて、ステージング環境や本番環境も同様に進めることで VPCエンドポイントを集約し、コストカットが可能となります。

補足

ssm.ap-northeast-1.amazonaws.com, ec2messages.ap-northeast-1.amazonaws.com, ssmmessages.ap-northeast-1.amazonaws.com も対応したにも関わらず、セッションマネージャーを立ち上げ時に以下のようなエラーが出る、もしくはそもそもセッションマネージャーでの接続ができないようなことがあれば、1. の shared側のルートテーブルを見直してください。

dev 側のルートテーブルで 10.255.0.0./16 をピアリング接続させる設定を追加したように、shared側でも逆の設定が必要となります。VPCエンドポイントだけの利用であれば、インターネットゲートウェイや NAT Gateway など public サブネットも不要です。

また、Fargateなどでイメージを引っ張ってくる際は、 “account-id”.dkr.ecr.ap-northeast-1.amazonaws.com に対して、リクエストが飛ぶため、 dkr.ecr.ap-northeast-1.amazonaws.com 同様にレコードの追加が必要です。デプロイに失敗した際は以下のようなエラーがコンソールなどで確認できるはずです。

-VPC, VPC Endpoint, VPC Peering
-,

執筆者:

関連記事

VPCエンドポイントのゲートウェイエンドポイントとは

概要 前回 VPCエンドポイントのインターフェイスエンドポイントを VPCピアリングを用いることで集約し、コストを削減する記事を上げました。 今回はゲートウェイタイプを利用するメリットや、利用するとど …