昨年のre:Invent2022で発表された、Amazon VPC Latticeが一般提供されたので試してみました。
アップデート概要
- 異なるVPCにあるアプリケーション間の通信を簡易に実現できる
検証内容
今回は以下の構成を作成して検証してみました。
- IPレンジが同じVPC「client-vpc」と「target-vpc」を用意し、それぞれにプライベートサブネットを配置する
- 図には明記していないが、「target-vpc」にはALB「target-alb」を配置するため、プライベートサブネットは以下のように2つ配置する
EC2インスタンス「target-ec2」を配置するのは一方のみ
それぞれのプライベートサブネットにEC2インスタンス「client-ec2」と「target-ec2」を配置する
- VPC外にLambda関数「target-lambda」を配置する
- 「client-ec2」から「target-alb」経由で「target-ec2」にHTTP通信を行う
- 「client-ec2」から「target-lambda」にHTTP通信を行う
VPC Latticeの構築
サービスネットワークとサービスの作成
「VPC」→「VPC格子」から、「サービスネットワークを作成する」を押下します。
サービスネットワーク名を入力します。
サービスネットワーク名:testservicenetwotk01
サービスの関連付けを行いますが、まだサービスを作成していないので、「Amazon VPC Latticeサービスを作成」を押下します。
サービス名を入力します。
サービス名:testservice01
その他はデフォルトのまま次へ進みます。
最後に「VPC Latticeサービスを作成」を押下します。
サービス「testservice01」が作成されました。
サービスネットワーク作成の画面に戻り、サービスの関連付けで先ほど作成したサービス「testservice01」を選択します。
VPCの関連付けで、VPC「client-vpc」を選択します。
セキュリティグループは、インバウンドでHTTPが許可されているものを作成し、選択します。
その他はデフォルトのまま「サービスネットワークの作成」を押下します。
サービスネットワーク「testservicenetwork01」が作成されました。
ターゲットグループの作成
「ターゲットグループの作成」を押下します。
ターゲットタイプはALBを選択します。
ターゲットグループ名を入力し、プロトコルとポートをHTTPと80に設定します。
ターゲットグループ名:targetgroup01
VPCは「target-vpc」を選択し、その他はデフォルトのまま次へ進みます。
ターゲットの登録で、事前に作成しておいた「ta-get-alb」を選択し、「ターゲットグループの作成」を押下します。
ターゲットグループ「targetgroup01」が作成されました。
リスナーの作成
サービス「testservice01」から「ルーティング」タブを選択し、「リスナーの追加」を押下します。
リスナーの追加で、プロトコルとポートをHTTPと80に設定します。
デフォルトアクションで、ターゲットグループ「targetgroup01」を選択し、「追加」を押下します。
リスナーが作成されました。
異なるVPC間におけるEC2インスタンスの疎通確認
「target-ec2」にはApacheをインストールして実行させています。
注意点として、Apacheはデフォルトでは403応答によりヘルスチェックが失敗するため、以下のようにindex.htmlを作成しておくとよいでしょう。
$echo "<html><head><title>Test Page</title></head><body>Hello world</body></html>" > /var/www/html/index.html
「client-ec2」から、サービスのドメイン名に対してcurlを実行します。
以下のレスポンスが返ってきたため、「target-ec2」と疎通が取れていることを確認できました。
$ curl -v http://testservice01-XXXXXXXXXX.vpc-lattice-svcs.ap-northeast-1.on.aws * Trying 169.254.171.96:80... * Connected to testservice01-XXXXXXXXXX.vpc-lattice-svcs.ap-northeast-1.on.aws (169.254.171.96) port 80 (#0) > GET / HTTP/1.1 > Host: testservice01-XXXXXXXXXX.vpc-lattice-svcs.ap-northeast-1.on.aws > User-Agent: curl/7.88.1 > Accept: */* > < HTTP/1.1 200 OK < date: Sat, 15 Apr 2023 14:39:44 GMT < content-type: text/html; charset=UTF-8 < content-length: 75 < server: Apache/2.4.56 (Amazon Linux) < last-modified: Sat, 15 Apr 2023 14:20:03 GMT < etag: "4b-5f960a761f614" < accept-ranges: bytes < <html><head><title>Test Page</title></head><body>Hello world</body></html> * Connection #0 to host testservice01-XXXXXXXXXX.vpc-lattice-svcs.ap-northeast-1.on.aws left intact
VPC内EC2インスタンスとVPC外Lambdaの疎通確認
ターゲットグループをLambdaに変更してみます。 ターゲットグループ名:targetgroup02
Lambda関数で「target-lambda」を選択し、「ターゲットグループの作成」を押下します。
ターゲットグループ「targetgroup02」が作成されました。
サービス「testservice01」のリスナーで、ターゲットグループを「targetgroup02」に変更します。
「client-ec2」から、サービスのドメイン名に対してcurlを実行します。
以下のレスポンスが返ってきたため、「target-lambda」と疎通が取れていることを確認できました。
$ curl -v http://testservice01-XXXXXXXXXX.vpc-lattice-svcs.ap-northeast-1.on.aws * Trying 169.254.171.96:80... * Connected to testservice01-XXXXXXXXXX.vpc-lattice-svcs.ap-northeast-1.on.aws (169.254.171.96) port 80 (#0) > GET / HTTP/1.1 > Host: testservice01-XXXXXXXXXX.vpc-lattice-svcs.ap-northeast-1.on.aws > User-Agent: curl/7.88.1 > Accept: */* > < HTTP/1.1 200 OK < date: Sat, 15 Apr 2023 14:52:03 GMT < content-type: application/json < content-length: 20 < x-amzn-requestid: XXXXXXXXXX < x-amzn-remapped-content-length: 0 < x-amz-executed-version: $LATEST < x-amzn-trace-id: root=XXXXXXXXXX;sampled=0;lineage=0c55971e:0 < * Connection #0 to host testservice01-XXXXXXXXXX.vpc-lattice-svcs.ap-northeast-1.on.aws left intact "Hello from Lambda!"
まとめ
細かなルーティングを意識することなく、L7の世界で異なるVPC間の通信ができました。
VPC Latticeがネットワークを抽象化してくれることで、インスタンスやコンテナ、サーバレスといったサービスの通信を同等に管理することが可能です。
また、VPCのCIDRが重複していても通信が可能なことは嬉しい点です。
マイクロサービスの設計に大いに活躍するサービスだと思います。