VPCピアリングを試す
Terraformを使ってプライベートサブネット同士のVPCピアリングを構築し、承認作業とルート設定を行うだけで相互通信を実現。セッションマネージャを使ったサーバ疎通確認やNATインスタンスを採用する手順など、必要なポイントを簡潔にまとめてみました。
目次
はじめに
- さんざん試験でいろいろ見てきたVPCピアリングを試してみた
- VPCピアリングとは、2つのVPC間をインターネットを経由せずに接続するもので、EC2間の接続に使える
- ピアリング方法は簡単で、VPCを2個作ったらピアリングを確立して、各ルートテーブルを編集するだけ
- ただピアリングの確立にはマネジメントコンソールからの手動承認がいるので注意
作るもの
割と適当に構成してみた。
- VPCピアリングの簡単な実装として、2個のVPCのそろぞれのプライベートサブネットに1個EC2を作る。最低限このEC2だけ必要
- EC2では疎通テスト用にnginxを設置する。これは相手のEC2のプラベートIPをcurlで指定して取得できるかどうかを確認するため
- EC2へのアクセスはSession Managerを使う。ぶっちゃけEC2をパブリックサブネットにおいてもいいが、キーペアの管理がだるいため、Session Manager前提とした
- Session Managerの利用には、VPCエンドポイントかNATゲートウェイが必要。わかりやすいようにNATとした。ただコストを抑えるためにfck-nat(NATインスタンス)を使っている。
- 例によってChatGPTのo1-miniによって書かせたTerraformで実装する
VPCのモジュール化
VPCが再利用しやすいようにモジュール化する。以下のようなソース構成。
モジュール以下に格納することで、VPCコンポーネントが再利用しやすくなる。以下のようにした。
modules/vpc/main.tf
- fck-natの扱いについては公式参照。基本的にはNATインスタンスで、Terraformのプロバイダーも用意されている
- 複数(東京リージョンは3つ)のサブネットにまたがるVPCを作る
- IPv4の数は、パブリックサブネットが256、プライベートサブネットが512
- ルートテーブルはパブリックはIGWにそのままつけて、プライベートは外部に何も通信できない(アイソレート状態)で定義して、fck-natのモジュール側でルーティング変更する
modules/vpc/variable.tf
- ユーザーから入力として受け取る部分。VPCの名前やCIDRブロックの指定を行う
modules/vpc/outputs.tf
外部から参照するために必要。もうちょっとうまいやり方があるかもしれない
VPCピアリングの構築(vpc_cluster.tf)
モジュールの外のvpc_cluster.tf
で、作成したモジュールを活用してVPCを2個作成し、ピアリングを構築する。ルートテーブルの更新が必要。
terraform apply
するとピアリングがすぐに構築されるのではなく、VPC側で承認が必要。マネジメントコンソールの、VPCのダッシュボードから「ピアリング接続」→「アクション」から承認
承認終わるとルートテーブルに飛べる。ステータスがすぐに「アクティブ」になるはず。承認をしないとピアリングの送信先のステータスは「ブラックホール」になっている。
EC2のnginxの作成(ec2.tf)
- Amazon Linux 2023のインスタンスを各VPCに1個ずつ作り、ユーザースクリプトでnginxを起動すればいい
- ピアリングの接続を許可するために、対象のEC2がいるサブネットのCIDRからのポート80のInboundを許可している
- またSession Managerのために、Outbandは全許可にしている
- Session Manager用のインスタンスプロファイル(ロール)も用意している
接続確認
erraform apply
すると、以下のようにnginxのローカルIPが出てくるはず。
VPC1->VPC2への接続
マネジメントコンソールからSession Managerに接続し、VPC2のインスタンスにcurlを飛ばしてみる。nginxのデフォルトのメッセージが出てくるはず。(rootへの切り替えは必須ではなく、コンソールにIPが表示されてわかりやすいのでそうしている。sudo su -
で切り替えられる)
VPC2→VPC1への接続
同様にVPC2のEC2にもSession Managerで接続し、VPC1のEC2にもcurlを飛ばす
いずれの場合もcurlが想定された結果となった。
ポイント
- これらのEC2はプライベートサブネットに配置されており、インターネットから直接アクセスできない。また、セキュリティグループの設定もインターネットからのアクセス(パブリックIPからのアクセス)を許可していない
- したがって、curlはVPCピアリングの接続から飛んできたものである
所感
- 思ったより簡単にVPCピアリングできた
- 承認がいるってのがちょっと面倒くさいところかもしれない
Shikoan's ML Blogの中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内
技術書コーナー