Amazon VPC Lattice と AWS Lambda の併用
Lambda 関数を Amazon VPC Lattice サービスネットワーク内のターゲットとして登録できます。これにより、Lambda 関数はネットワーク内のサービスになり、VPC Lattice サービスネットワークにアクセスできるクライアントはサービスを呼び出せるようになります。Lambda 関数がサービスネットワーク内のサービスにアクセスする必要がある場合は、その関数をサービスネットワークに既に関連付けられている VPC に接続します。サービスを VPC Lattice ネットワーク内に配置すると、サービスの検出、接続、監視とサービスへのアクセスがより簡単になります。
トピック
VPC Lattice の概念
このガイドでは、以下の VPC Lattice 用語を何度でも参照してください。
-
サービス — サービスとは、インスタンス、コンテナ、またはサーバーレス関数内で実行できるソフトウェアアプリケーションすべてを指します。このトピックでは、Lambda 関数を使用して構築されたサービスのみを対象としています。
-
サービスネットワーク — サービスネットワークは、サービスのネットワークを含む論理的な境界です。このトピックでは、Lambda 関数を VPC Lattice サービスネットワーク内のサービスとして設定する方法について説明します。
-
ターゲットグループ — ターゲットグループは、サービスを実行するコンピュートタイプの宛先のコレクションです。Lambda のターゲットグループには、ターゲットとして 1 つの Lambda 関数しか含めることができません。複数の関数を持つターゲットグループをターゲットにすることはできません。
-
リスナー — リスナーは、トラフィックを受信し、サービスネットワーク内のさまざまなターゲットグループにルーティングするプロセスです。
-
リスナールール — リスナールールには、リスナーがトラフィックのルーティング先を決定するために使用する優先度、アクション、および条件が含まれます。各リスナーにはデフォルトのリスナールールがあり、1 つのリスナーに複数のリスナールールを設定できます。リスナールールには次のものを含めることができます。
-
プロトコル — リスナーがリクエストを宛先に送信するために使用するプロトコル。HTTP または HTTPS のいずれか。
-
ポート — リスナーが受信リクエストをポーリングするポート。1~65535 の範囲を使用できます。
-
パス — ターゲットリソースへのパス。デフォルトリスナールールでは、パスは
/
のデフォルトパスです。リスナールールには、デフォルトパスを含めて最大 6 つのパスを含めることができます。 -
優先度 — リスナーはパスの優先度を使用して、トラフィックをルーティングするパスを決定します。数字が小さいほど、優先順位が高くなります。デフォルトパスの優先度は最も低くなります。新しいパスを追加すると、VPC Lattice はデフォルトで 2 番目に低い優先度でそのパスを割り当てます。これはデフォルトパスの優先度を少し上回りますが、他のすべてのデフォルト以外のパスよりは優先度が低くなります。
-
さらに、以下のAWS Identity and Access Management (IAM) エンティティについても覚えておきましょう。
-
ネットワークオーナー — VPC Lattice サービスネットワークを所有する IAM ロールです。
-
サービスオーナー Lambda 関数を使用して構築されたサービスを所有する IAM ロールです。サービスオーナーとネットワークオーナーは同じエンティティである必要はありません。
VPC Lattice および VPC 対応関数で Lambda を使用する
デフォルトでは、Lambda 関数は VPC のプライベートリソースにアクセスできません。VPC のプライベートサブネットに接続するように Lambda 関数を設定すると、VPC 対応の関数がその VPC 内のリソースにアクセスできるようになります。言い換えると、1 つの VPC の範囲にのみ焦点を当てているということです。
VPC Lattice ネットワークにサービスとして登録された Lambda 関数は VPC 対応の関数とは異なりますが、互いに補完し合うことができます。Lambda 関数を VPC Lattice ネットワークのサービスとして登録すると、1 つまたは複数の VPC から関数への進入パスを作成することになります。また、関数が別の VPC へのオプションの下りパスを有する場合があります。
Lambda 関数をサービスとして登録するときは、進入シナリオに焦点を当てます。これには、リスナーがトラフィックをサービスにルーティングするために使用する特定のリスナールール設定が含まれます。そこから、Lambda 関数は Hyperplane ENI (elastic network interface) を介して VPC 内の他の AWS サービスと通信できます。以下の図は、Lambda 関数が VPC Lattice ネットワーク内のサービスであることを示しています。

前提条件とアクセス許可
このトピックでは、VPC Lattice サービスネットワークと Lambda 関数の両方があることを前提としています。VPC Lattice サービスネットワークをまだ作成していない場合は、VPC Lattice ユーザーガイドを参照し、作成してください。
Lambda コンソールまたは AWS Command Line Interface (AWS CLI) を使用して、Lambda 関数をターゲットとして登録すると、Lambda は必要な権限を自動的に追加します。
Lambda が自動的にアクセス権限を追加して、Lambda 関数を Lambda サービスのターゲットとして正常に作成できるようにするには、ロールに次の IAM 権限が必要です。
-
CreateListener
-
CreateService
-
CreateServiceNetworkServiceAssociation
-
CreateTargetGroup
-
ListServiceNetworks (コンソールワークフローにのみ必要)
-
RegisterTargets
VPC Lattice ネットワークの既存のサービスを Lambda 関数を参照するように更新するには、ロールに次の IAM 権限が必要です。
-
CreateService
-
ListListeners (コンソールワークフローにのみ必要)
-
ListServices (コンソールワークフローにのみ必要)
-
RegisterTargets
次の AWS CLI コマンドを使用して権限を手動で追加することもできます。
aws lambda add-permission --function-name
my-function
\ --action lambda:InvokeFunction \ --statement-id allow-vpc-lattice \ --principal vpc-lattice.amazonaws.com --source-arntarget-group-arn
制限事項
VPC Lattice ネットワークで Lambda 関数を使用するときは、以下の制限事項に注意してください。
-
Lambda 関数とターゲットグループは、同じアカウントかつ、同じリージョンにある必要があります。
-
Lambda 関数を使用して作成したサービスに転送できるリクエスト本文の最大サイズは 6 MB です。
-
Lambda 関数が返すことができるレスポンス JSON の最大サイズは 6 MB です。
-
選択できるのは、HTTP プロトコルと HTTPS プロトコルのみです。
Lambda 関数を VPC Lattice ネットワークに登録する
AWS コンソールまたは AWS CLI を使用して、既存の Lambda 関数を VPC Lattice ネットワークに登録できます。関数をサービスとして登録すると、すぐにリクエストの受信を開始できます。
Lambda 関数を VPC Lattice ネットワーク (コンソール) に登録するには
-
Lambda コンソールの [関数]
ページを開きます。 -
登録する関数の名前を選択します。
-
[関数の概要] で [トリガーを追加] をクリックします。
-
ドロップダウンメニューで [VPC Lattice アプリケーションネットワーク] を選択します。
-
[インテント] で [新規作成] を選択します。
-
[Service name] (サービス名) でサービスの名前を入力します。
-
[VPC Lattice ネットワーク] では、この Lambda 関数を関連付けるサービスネットワークを選択します。サービスネットワークの完全な Amazon リソースネーム (ARN) を入力することもできます。既存のサービスネットワークがない場合は、説明にあるリンクを選択すると、VPC Lattice ネットワークを作成できる Amazon VPC コンソールに移動できます。
注記
トリガーの設定を完了するために VPC Lattice ネットワークを選択する必要はありません。ただし、ネットワークを選択せずにトリガーを作成した場合、サービスを VPC Lattice ネットワークに関連付けるまで、クライアントはサービスにアクセスできません。
-
[リスナー] では、次の設定を行います。
-
[リスナー名] — リスナーの名前を入力します
-
プロトコル — リスナーがリクエストを宛先に送信するために使用するプロトコル。HTTP または HTTPS のいずれか。
-
ポート — リスナーが受信リクエストをポーリングするポート。1~65535 の範囲を使用できます。
-
[リスナーの追加] を選択します。VPC Lattice はデフォルトパス
/
でデフォルトのルーティングを作成します。サービスの作成後に、名前、プロトコル、およびポート設定を変更することはできませんが、新しいルーティングパスを定義することはできます。
-
-
[Add] (追加) を選択します。
Lambda 関数を VPC Lattice ネットワークに登録するには (AWS CLI)
-
create-service
コマンドを使用してサービスを作成します。レスポンス内のサービスの ARN を書き留めます。これは次のステップで必要になります。aws vpc-lattice create-service --name my-vpc-lattice-service
-
create-target-group
コマンドを使用してターゲットグループを作成します。レスポンス内のターゲットグループの ARN を書き留めます。これは次のステップで必要になります。aws vpc-lattice create-target-group \ --name my-vpc-lattice-target-group \ --type LAMBDA
-
create-listener
コマンドを使用して、サービスネットワーク内にリスナーを作成します。新しいリスナーは自動的に/
のデフォルトパスを使用します。service
パラメータの値を、ステップ 1 で取得したサービスの ARN で置き換えます。default-action
パラメータのTargetGroupArn
の値を、ステップ 2 で取得したターゲットグループの ARN で置き換えます。aws vpc-lattice create-listener \ --name https --service-identifier svc-0e2f2665e1cebb720 \ --protocol HTTPS \ --default-action forward='{targetGroups={targetGroupIdentifier=tg-0e2f2665e1cebb720}}'
-
register-targets
コマンドを使用して Lambda 関数をターゲットとして登録します。target-group-arn
パラメータの値を、ステップ 2 で取得したターゲットグループの ARN で置き換えます。targets
パラメータのId
の値を Lambda 関数の ARN で置き換えます。aws vpc-lattice register-targets \ --target-group-identifier arn:aws:vpc-lattice:us-west-2:123456789012:targetgroup/tg-0e2f2665e1cebb720 \ --targets id=arn:aws:lambda:us-west-2:123456789012:function:my-function
注記
前の
register-targets
コマンドで、Lambda 関数が VPC Lattice による呼び出しをまだ明示的に許可していない場合、VPC Lattice は必要な権限を関数の実行ロールに自動的にアタッチします。VPC Lattice が自動的に権限をアタッチできるようにするには、ロールに AddPermission 権限が必要です。 -
create-service-network-service-association
コマンドを使用して、サービスをサービスネットワークに関連付けます。service
パラメータの値を、ステップ 1 で取得したサービスの ARN で置き換えます。service-network
パラメータの値を VPC Lattice サービスネットワークの ARN で置き換えます。aws vpc-lattice create-service-network-service-association \ --service-identifier arn:aws:vpc-lattice:us-west-2:123456789012:service/svc-0b9b89d907bc8668c \ --service-network-identifier arn:aws:vpc-lattice:us-west-2:123456789012:servicenetwork/03d622a31e5154247
VPC Lattice ネットワーク内のサービスのターゲットの更新
VPC Lattice ネットワーク内の既存のサービスを Lambda 関数のターゲットを参照するように更新できます。これを行うには、AWS コンソールまたは AWS CLI を使用して新しいルーティングパスを追加します。新しいパスを追加すると、VPC Lattice はそのパスにデフォルトパス (最も低い優先度) のすぐ上の 2 番目に低い優先度を割り当てます。
Lambda 関数を参照するようにサービスのターゲットを更新するには (コンソール)
-
Lambda コンソールの [関数]
ページを開きます。 -
登録する関数の名前を選択します。
-
[関数の概要] で [トリガーを追加] をクリックします。
-
ドロップダウンメニューで [VPC Lattice アプリケーションネットワーク] を選択します。
-
[インテント] には、[既存の選択] を選択します。
-
[サービス名] には、既存のサービスを選択します。
-
[リスナー] には、既存のリスナーを選択します。
-
[ルール名] には、新しいルールの名前を入力します。
-
[パス] には、リスナーの新しいルーティングパスを定義します。
-
[Add] (追加) を選択します。
次のステップでは、サービスの ARN と、新しいルールを追加するリスナーの ARN が必要になります。
-
create-target-group
コマンドを使用して新しいターゲットグループを作成します。先のステップで必要になるため、レスポンス内のターゲットグループの ARN を書き留めてください。aws vpc-lattice create-target-group \ --name my-vpc-lattice-target-group \ --type LAMBDA
-
create-rule
コマンドを使用して、既存のリスナー用の新しいルールを作成します。このコマンドは、条件が現在のディレクトリ内のconditions-pattern.json
というファイルにあることを前提としています。listener-arn
パラメータの値をリスナーの ARN で置き換えます。actions
パラメータのTargetGroupArn
の値を、ステップ 1 で取得したターゲットグループ ARN で置き換えます。aws vpc-lattice create-rule \ --name my-rule --priority 1 \ --listener-identifier listener-0e9af499f72e5251b \ --service-identifier svc-01755f67d3a427803 --match httpMatch='{pathMatch={match={prefix="/test"}}}' --default action forward='{targetGroups=[{targetGroupIdentifier=tg-042d5b70f1e743940}]}'
-
register-targets
コマンドを使用して Lambda 関数をターゲットとして登録します。target-group-arn
パラメータの値を、ステップ 2 で取得したターゲットグループの ARN で置き換えます。targets
パラメータのId
の値を Lambda 関数の ARN で置き換えます。aws vpc-lattice register-targets \ --target-group-identifier arn:aws:vpc-lattice:us-west-2:123456789012:targetgroup/tg-0e2f2665e1cebb720 \ --targets id=arn:aws:lambda:us-west-2:123456789012:function:my-new-function
Lambda 関数のターゲットを登録解除する
VPC Lattice ネットワークの Lambda 関数ターゲットを登録解除するには、VPC コンソールを使用します。詳細については、「VPC Lattice ユーザーガイド」を参照してください。
または、以下の AWS CLI コマンドを使用することもできます。
aws vpc-lattice deregister-targets \ --target-group-identifier arn:aws:vpc-lattice:us-west-2:123456789012:targetgroup/tg-0e2f2665e1cebb720 \ --targets id=arn:aws:lambda:us-west-2:123456789012:function:my-new-function
Lambda 関数を使用して構築したサービスを Lambda コンソールから登録解除することはできません。
クロスアカウントネットワーク設定
VPC Lattice サービスネットワーク内のサービスは、すべて同じ AWS アカウントにある必要はありません。また、VPC Lattice サービスネットワーク自体を別のアカウントに置くこともできます。つまり、Lambda 関数を使用して構築したサービスを、別の AWS アカウントのサービスネットワークに関連付けることができます。これらのサービス関連付けを作成するには、ネットワークオーナーからの特定の権限が必要です。必要な権限の詳細については、Amazon VPC Lattice ユーザーガイドの「VPC Lattice API を呼び出す準備をする」を参照してください。
AWS コンソールを使用して、Lambda 関数と別のアカウントのサービスネットワークとの関連付けを作成できます。そのためには、アカウント内のネットワークのみが表示されるドロップダウンメニューから [VPC Lattice ネットワーク] を選択するのではなく、ネットワークの完全な ARN を貼り付けます。
一般に、create-service-network-service-association
AWS CLIコマンドを使用して、任意のサービスと任意のサービスネットワーク間の関連付けを作成できます。つまり、サービスネットワークを中央アカウントで管理し、AWS 組織全体の他のアカウントで Lambda 関数を使用してサービスを構築することができます。次の例では、service
および service-network
が 2 つの異なるアカウントにあることに注意してください。
aws vpc-lattice create-service-network-service-association \ --service arn:aws:vpc-lattice:us-west-2:123456789012:service/svc-0b9b89d907bc8668c \ --service-network arn:aws:vpc-lattice:us-west-2:444455556666:servicenetwork/03d622a31e5154247
VPC Lattice からのイベントの受信
VPC Lattice サービスは、Lambda 呼び出しリクエストを HTTP と HTTPS 経由でルーティングします。関数が受け取るイベント構造のバージョンは、ターゲットグループを作成した時の LambdaEventStructureVersion
設定によって異なります。
V1 イベント構造の例
以下は、Lambda 関数が VPC Lattice から JSON 形式で受け取る可能性のある V1 イベントの例です。
{
"raw_path": "/path/to/resource
",
"method": "GET|POST|HEAD|...",
"headers": {"header-key
": "header-value
", ... },
"query_string_parameters": {"key
": "value
", ...},
"body": "request-body
",
"is_base64_encoded": true|false
}
content-encoding
ヘッダーが存在しない場合、Base64 エンコーディングはコンテンツタイプによって異なります。コンテンツタイプが text/*
、application/json
、application/xml
、および application/javascript
の場合、サービスは本文をそのまま送信し、isBase64Encoded
を false
に設定します。
注記
リクエスト本文の最大サイズは、プレーンテキストで送信する場合は 1023 KiB、base64 エンコードの場合は 767 KiB です。リクエストヘッダーのリストには、最大 50 個のキーと値のペアを含めることができます。
V2 イベント構造の例
以下は、Lambda 関数が VPC Lattice から JSON 形式で受け取る可能性のある V2 イベントの例です。
{
"version": "2.0",
"path": "/",
"method": "GET|POST|HEAD|...",
"headers": {"header-key
": "header-value
", ... },
"requestContext": {
"serviceNetworkArn": "arn:aws:vpc-lattice:region
:123456789012
:servicenetwork/sn-0bf3f2882e9cc805a
",
"serviceArn": "arn:aws:vpc-lattice:region
:123456789012
:service/svc-0a40eebed65f8d69c
",
"targetGroupArn": "arn:aws:vpc-lattice:region
:123456789012
:targetgroup/tg-6d0ecf831eec9f09
",
"identity": {
"sourceVpcArn": "arn:aws:ec2:region
:123456789012
:vpc/vpc-0b8276c84697e7339
",
"type" : "AWS_IAM",
"principal": "arn:aws:sts::123456789012:assumed-role/example-role/057d00f8b51257ba3c853a0f248943cf",
"sessionName": "057d00f8b51257ba3c853a0f248943cf",
"x509SanDns": "example.com"
},
"region": "region
",
"timeEpoch": "1690497599177430"
}
}
VPC Lattice へのレスポンスの送信
Lambda 関数から VPC Lattice にレスポンスを送り返すとき、レスポンスには Base64 エンコーディングのステータス、ステータスコード、および関連するヘッダーが含まれます。本文はオプションです。以下は、JSON 形式のレスポンスの例です。
{
"isBase64Encoded": false,
"statusCode": 200,
"statusDescription": "200 OK",
"headers": {
"Set-Cookie": "cookies",
"Content-Type": "application/json"
},
"body": "Hello from Lambda (optional)"
}
レスポンス本文にバイナリコンテンツを含めるには、コンテンツを Base64 でエンコードし、isBase64Encoded
を true
に設定する必要があります。これによって、クライアントにレスポンスを送信する前にコンテンツをデコードするように VPC Lattice に指示します。
VPC Lattice では、Connection
や Transfer-Encoding
などのホップバイホップ方式のヘッダーは受け付けません。また、VPC Lattice はクライアントにレスポンスを送信する前に Content-Length
ヘッダーを自動的に計算するため、このヘッダーは省略できます。
注記
レスポンス本文の最大サイズは、プレーンテキストで送信する場合は 1023 KiB、base64 エンコードの場合は 767 KiB です。レスポンスヘッダーのリストには、最大 50 個のキーと値のペアを含めることができます。
VPC Lattice ネットワークでのサービスの監視
VPC Lattice ネットワークで Lambda 関数を使用して構築したサービスを監視するために、VPC Lattice は Amazon CloudWatch のメトリクス、AWS CloudTrail ログ、およびアクセスログを提供します。これらのツールは、サービスへのリクエストの総数や接続タイムアウトの回数など、主要なパフォーマンス指標を追跡するのに役立ちます。
デフォルトでは、Lambda はメトリクスを CloudWatch に、イベント履歴ログを CloudTrail に自動的に送信します。アクセスログはオプションであり、Lambda ではデフォルトで無効です。モニタリングの詳細については、VPC Lattice ユーザーガイドの「Amazon VPC Lattice のモニタリング」を参照してください。