VPC Latticeを使ってクロスアカウントでVPC Lambdaを利用してみた

2023.05.18

こんにちは。AWS事業本部の木村です。
VPC LatticeはVPC向けのリバースプロキシサービスで、とてもシンプルな設定でVPCをまたぐ接続を行うことができるサービスです。
GAされたばかりで触ってみたかったので、試してみました!

サービスの概要に関しては以下の記事が参考になりましたので、こちらをご参照ください。

Amazon VPC Latticeが一般利用可能になりました

今回はクロスアカウントでLambdaを実行していきたいと思います。

今回作成する構成

今回はクロスアカウントということで2つのアカウントを使って検証します。
今後の説明の中ではLambdaを呼び出し元のアカウントをアカウントA、呼び出し先のアカウントをアカウントBと呼称したいと思います。

以下のイメージで構成します。アカウントAのLambdaからアカウントBにあるLambdaを実行し、結果の取得を行います。

クロスアカウントで利用する場合、AWS Resource Access Manager(RAM)でVPC Lattice Service NetworkかVPC Lattice Serviceの共有をする必要があるのですが、今回はVPC Lattice Service Networkを共有する形で作成していきたいと思います。
VPC Lattice Serviceを共有するパターンに関しては、以下の記事をご参照ください。

VPC Lattice の VPC Lattice Service を Resource Access Manager で共有してクロスアカウント接続をやってみた

以下のような手順で進めていきます。今回Lambdaは疎通程度の確認しか行いませんので、Lambdaの作成手順については割愛させていただきます。

1.アカウントAでサービスネットワークを作成し、対象のVPCと紐づける
2.RAMを使って、アカウントBにサービスネットワークを共有する
3.アカウントBでターゲットグループを作成する
4.アカウントBでサービスを作成し、共有されたサービスネットワークに関連付ける

1.アカウントAでサービスネットワークを作成し、対象のVPCと紐づける

まずは呼び出し元のアカウントAでサービスネットワークを作成します。

VPCのコンソール画面から[サービスネットワーク]を選択して、[Create service network]を選択します。

名前は任意の名前をつけていきます。

サービスは後ほど呼び出し先のアカウントBで作成したものを関連付けていきますので、この時点では関連付けを行いません。

呼び出しを行うVPC Lambdaが配置されているVPCを関連づけていきます。セキュリティグループは今回の検証用のみの用途としてインバウンドルールでLambdaに設定したSGからの80番ポートのみ許可したものを指定しています。

複数のVPCから呼び出しを行いたい際はこちらで複数のVPCを関連づけることで、呼び出し先にアクセスが可能となります。

今回認証は設定せず、ログはS3に格納できるように設定します。

最後にCreateのボタンを選択して作成が完了させます。
このような画面が出れば作成完了です。

2.RAMを使って、アカウントBにサービスネットワークを共有する

共有を作成する

AWS Resource Access Manager(RAM)のコンソールから[自分共有]の[リソースの共有]を選択し、[リソースの共有を作成]を選択します。

任意の名前を設定して、リソースの箇所で、VPC Lattice Service Networksを選択し先ほど作成したものを選択します。

マネージド型アクセス許可を関連付けるのページはデフォルトのまま進みます。

プリンシパルに呼び出し先であるアカウントBのアカウントIDを入力して追加します。

呼び出し元であるアカウントAでの作業は、ここまでで一旦完了となります。

共有を許可する

ここからは呼び出し先であるアカウントBで作業を行なっていきます。

先ほどと同じくRAMのコンソールを開くと以下のように表示されますので、リソースの共有を承諾します。

これにて呼び出し先のアカウントBでもサービスネットワークを確認できるようになりました。

3.アカウントBでターゲットグループを作成する

引き続き呼び出し先のアカウントBで設定を行います。

VPCのコンソールからVPC Latticeの[ターゲットグループ]を選択して、[Create target group]を選択します。

今回はLambdaを呼び出すのでLambdaを選択し任意の名前を設定して、次に進みます。

あらかじめ作成しておいた、実行時に「Lattice test success」と表示するだけのLambdaを選択しターゲットグループを作成します。

これにてターゲットグループの作成が完了しました。

4.アカウントBでサービスを作成し、共有されたサービスネットワークに関連付ける

引き続き呼び出し先のアカウントBで設定を行います。

先ほどと同様VPCのコンソールからVPC Latticeの[サービス]を選択して、[Create service]を選択します。

名前は任意で設定をします。カスタムドメインの設定ですが、今回はデフォルトのドメインを利用するため設定を行いません。

認証に関しても今回は利用しないため設定を行いません。

ログはS3に保存されるように設定し、次に進みます。

リスナーの設定を追加し、80番ポートのアクセスに対して先ほど設定した、ターゲットグループにフォワードするように設定します。

サービスネットワークの関連付けは先ほどアカウントAと共有した、サービスネットワークを選択し関連付けを行います。

最後に設定内容に問題ないかを確認して作成を行います。

疎通確認

では通信を行うことができるか、呼び出し元のアカウントAからLambdaを実行させてみましょう。

この際Lambdaを実行するように設定するのではなく、サービスのドメインにアクセスをするようにする必要がありますので、その点注意してください。

今回疎通のみですので、以下のようなアクセスを行うだけのコードで実行していきます。

import requests

def lambda_handler(event, context):
    url = 'http://sample-service-XXXXXXX.XXXX.vpc-lattice-svcs.ap-northeast-1.on.aws'
    res = requests.get(url)
    print(res.text)

テスト実行してみると無事「Lattice test success」と表示させることができました。

まとめ

触ってみた感想としては、とてもシンプルで簡単に設定できてとても良いなと感じました。同じようなサービスとしてPrivate Linkがあるので、次回はPrivate Linkと比較してどのようなメリットデメリットがあるのかについて調査できたらと思っています。

この記事がどなたかの参考になれば幸いです。

以上、AWS事業本部の木村でした。