VPC Lattice の VPC Lattice Service を Resource Access Manager で共有してクロスアカウント接続をやってみた
以前こちらのブログで紹介した VPC Lattice を利用したクロスアカウント接続の検証環境の作成手順を紹介します。VPC Lattice Service を AWS Resource Access Manager で他方のアカウントへ共有する構成を取っています。
VPC Lattice を利用して NAT Gateway もなくインターネットへのアクセスが閉じられた2つのアカウントの通信を試してみました。
VPC Lattice 以外の VPC などのリソースは作成済みの環境として作成手順は省略します。
VPC Lattice クロスアカウント設定をやってみた
検証環境
VPC Lattice を利用して別アカウントにある Internal ALB へリクエストして、Internal ALB配下にある VPC Lambda からのレスポンスを受け取れるか検証しました。NAT Gateway は配置せず、インターネットから閉じられた環境にしています。EC2 から Internal ALB へテストでリクエストを送るために、VPC エンドポイントを利用してセッションマネージャーでリモート接続する構成です。
今回の検証環境でクロスアカウント接続する場合、VPC Lattice Service Networkか、VPC Lattice Service をどちらを共有しても実現できます。今回は VPC Lattice Service を共有するかたちで動作確認を行いました。
設定後に必要になった各種サービスを図解するとこの様な構成になりました。
この図ですと「クロスアカウント接続だとなんか複雑そうだな...」と思いそうですが VPC Lattice の設定自体はシンプルでした。
サービスネットワークの作成
接続元のアカウントで設定を行います。まず、VPC Lattice サービス画面からサービスネットワークを作成します。
サービスネットワーク名を任意で入力します。
サービスの関連付けはあとで行いますので入力を省略します。ここで指定するサービスというものは、このあとの手順で接続先のアカウント側でサービスを作成・共有後、ここのサービスネットワークへ関連付けを行うためこのタイミングではできません。
接続先のアカウントへアクセスしたい VPC を指定します。セキュリティグループは新規作成し指定しました。
セキュリティグループのインバウンドルールの設定は HTTP アクセスを VPC の CIDR から許可しています。VPC の特定リソースからアクセスに制限する場合はここの VPC Lattice Network Service のセキュリティグループで制限するのが良いように思えました。
アクセスログは S3 バケットへ保存する設定を追加しています。サービスネットワークを作成をクリックすれば設定完了です。
サービスネットワークが作成できました。ポイントは VPC Lattice を利用してアクセスする VPC を関連付けしておくことです。
VPC Lattice ターゲットグループの作成
次は接続先のアカウントで設定を行います。VPC Lattice サービス画面からターゲットグループを作成します。
Internal ALB をターゲットにするために Application Load Balancer を選択しています。
任意のターゲットグループ名を入力します。VPC は Internal ALB のある VPC を指定します。
既存の ALB を指定します。既存の ALB のセキュリティグループにインバウンドルールの追加が必要になります。セキュリティグループの設定変更は最後に行います。
VPC Lattice サービスの作成
引き続き接続先のアカウントで設定を行います。VPC Lattice サービス画面からサービスを作成します。
任意のサービス名を入力します。
VPC Lattice から払い出されるデフォルトのドメインでアクセスする予定のためデフォルトのままです。ここではアクセスログの設定を追加しました。
既存の Internal ALB が 80 ポートで受け付ける設定のため、サービスのリスナーも同じ設定としました。デフォルトアクションのターゲットグループは先ほど作成した VPC Lattice ターゲットグループのことです。
サービスネットワークの関連付けの設定はスキップします。接続元のサービスネットワークに関連付けする必要があるため後ほど設定を行います。
サービスの作成完了です。ここで作成した VPC Latice のサービスは接続元のアカウントへ共有して、サービスネットワークに関連付けを行って利用可能な状態となります。
RAM で VPC Lattice サービスを共有
引き続き接続先のアカウントで設定を行います。AWS Resource Access Manager(RAM)のサービス画面から VPC Lattice サービスを接続元のアカウントへ共有します。一般的な RAM を利用したリソースの共有手順と同じです。
リソースタイプはVPC Lattice Services
を選択します。すると先ほど作成したサービスが表示されます。
許可を関連付けるはデフォルトのまま次へ進めます。
プリンシパルに共有先のアカウント ID を入力します。序盤に VPC Lattice サービスネットワークを作成したアカウント IDです。
VPC Lattice サービスの共有は完了です。
RAM で共有された VPC Lattice サービスを承諾
次は接続元のアカウントに戻り設定を行います。AWS Resource Access Manager(RAM)のサービス画面から共有されたリソースを確認できます。リソースの共有を承諾します。
これで接続先のアカウントで作成した VPC Lattice サービスを、序盤に作成したサービスネットワークへ関連付けができるようになりました。
VPC Lattice サービスネットワークにサービスを関連付け
引き続き接続元のアカウントで設定を行います。VPC Lattice サービス画面から序盤に作成したサービスネットワークの設定を変更します。対象のサービスネットワークを選択してサービスの関連付けを作成します。
サービスに共有された別アカウントにある VPC Lattice サービス名が表示されるようになっていますので選択します。
これでサービスネットワークにサービスの関連付けまで終了しました。VPC Lattice クロスアカウント設定という意味では設定完了です。ですが残作業が少しあります。
ALB のセキュリティグループにルール追加
既存の ALB のセキュリティグループに VPC Lattice からの通信を許可を追加する必要があります。VPC Lattice ソース IP はというと、マネージドプレフィックリストに用意されています。
詳しくは以下のリンクも参考にしてください。
ALB のセキュリティグループには VPC Lattice マネージドプレフィックリスト ID から HTTP or HTTPS の許可を追加します。今回は HTTP アクセスのためこのような感じになりました。
これで VPC Lattice を利用したクロスアカウントアクセスの設定は完了です。
VPC Lattice 設定振り返り
接続元アカウントの VPC Lattice サービス画面から確認しています。
最初に作成した VPC Lattice サービスネットワークには、接続先のアカウントから共有された VPC Lattice サービスが関連付けられています。
VPC の関連付けは、接続元アカウント(同アカウント)にある VPC が関連付けられています。
サービスと、VPC がサービスネットワークに関連付いていることにより、接続元のアカウントにある VPC から、アカウントをまたいだ先にある ALB へアクセスできる状況となっています。VPC 内のリソースからアクセスするには VPC Lattice サービスから確認できるドメイン名に対してリクエストを送ります。
Internal ALB へアクセスしてみる
EC2 へセッションマネージャで接続して、VPC Lattice サービスのドメイン名に対してリクエスト投げてみました。VPC Lambda からのレスポンスが返ってきました。
$ curl http://destination-account-service-09fe69e50925916fa.7d67968.vpc-lattice-svcs.ap-northeast-1.on.aws "Hello from Destination Account"
ALB のセキュリティグループで VPC Lattice のマネージドプレフィックリストからのアクセスを許可していないと以下のメッセージが返ってきます。
$ curl http://destination-account-service-09fe69e50925916fa.7d67968.vpc-lattice-svcs.ap-northeast-1.on.aws Service Unavailable
まとめ
VPC Lattice を使ったクロスアカウント接続で VPC Lattice サービスを共有するパターンだとこの様な構成となりました。
- RAM(Resource Access Manager)を利用して VPC Lattice のコンポーネントの一部を共有する必要がある
- セキュリティグループは VPC Lattice と、アクセス先(Internal ALB)のセキュリティグループの両方で許可する
おわりに
今回 VPC Lattice サービスを共有したのですが、VPC Lattice サービスネットワークを共有した方が管理しやすい場面も見えてきたため改めて検証しようと思います。ひとまず触ってみると必要な要素がわかったので興味がある方は手を動かしてみてください。