yuj1osm's tech blog

クラウドやセキュリティなど

Amazon VPC Latticeが一般提供されたので試してみた

昨年のre:Invent2022で発表された、Amazon VPC Latticeが一般提供されたので試してみました。

aws.amazon.com

アップデート概要

  • 異なる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が重複していても通信が可能なことは嬉しい点です。
マイクロサービスの設計に大いに活躍するサービスだと思います。