

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# VPC Lattice のターゲットとしての Lambda 関数
<a name="lambda-functions"></a>

Lambda 関数を VPC Lattice ターゲットグループのターゲットとして登録し、Lambda 関数のターゲットグループにリクエストを転送するリスナールールを設定できます。サービスが Lambda 関数をターゲットとしてターゲットグループにリクエストを転送すると、Lambda 関数を呼び出し、リクエストのコンテンツを JSON 形式で Lambda 関数に渡します。

**制限事項**
+ Lambda 関数とターゲットグループは、同じアカウントおよび同じリージョンにある必要があります。
+ Lambda 関数に送信できるリクエストボディの最大サイズは 6 MB です。
+ Lambda 関数が送信できるレスポンス JSON の最大サイズは 6 MB です。
+ プロトコルは HTTP または HTTPS である必要があります。

## Lambda 関数の準備
<a name="prepare-lambda-function"></a>

VPC Lattice サービスで Lambda 関数を使用している場合は、以下の推奨事項が適用されます。

**Lambda 関数を呼び出すアクセス許可**  
ターゲットグループを作成し、 AWS マネジメントコンソール または を使用して Lambda 関数を登録すると AWS CLI、VPC Lattice はユーザーに代わって Lambda 関数ポリシーに必要なアクセス許可を追加します。

また、次の API 呼び出しを使用すると、自分で権限を追加できます。

```
aws lambda add-permission \
  --function-name {{lambda-function-arn-with-alias-name}} \ 
  --statement-id {{vpc-lattice}} \
  --principal vpc-lattice.amazonaws.com \
  --action lambda:InvokeFunction \
  --source-arn {{target-group-arn}}
```

**Lambda 関数のバージョニング**  
ターゲットグループごとに 1 つの Lambda 関数を登録できます。Lambda 関数を変更し、VPC Lattice サービスが常に現行バージョンの Lambda 関数を呼び出せるようにするには、関数のエイリアスを作成し、VPC Lattice サービスに Lambda 関数を登録するときに関数 ARN にエイリアスを含めます。詳細については、「 *AWS Lambda デベロッパーガイド*」の[「Lambda 関数のバージョン](https://docs.aws.amazon.com/lambda/latest/dg/configuration-versions.html)」および[「Lambda 関数のエイリア](https://docs.aws.amazon.com/lambda/latest/dg/configuration-aliases.html)スを作成する」を参照してください。

## Lambda 関数のターゲットグループの作成
<a name="register-lambda-function"></a>

リクエストルーティングで使用されるターゲットグループを作成します。リクエストのコンテンツが、コンテンツをこのターゲットグループに転送するアクションを含むリスナールールと一致する場合、VPC Lattice サービスは登録された Lambda 関数を呼び出します。

**コンソールを使用してターゲットグループを作成し、Lambda 関数を登録するには**

1. Amazon VPC コンソールの [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) を開いてください。

1. ナビゲーションペインの **[VPC Lattice]** で **[ターゲットグループ]** を選択します。

1. **[ターゲットグループの作成]** を選択します。

1. [**ターゲットタイプの選択**] で [**Lambda 関数**] を選択します。

1. [**ターゲットグループ名**] に、ターゲットグループの名前を入力します。

1. **[Lambda イベント構造バージョン]** でバージョンを選択します。詳細については、「[VPC Lattice サービスからのイベントを受け取る](#receive-event-from-service)」を参照してください。

1. (オプション) タグを追加するには、**[タグ]** を展開し、**[新しいタグを追加]** を選択して、タグキーとタグ値を入力します。

1. [**次へ**] を選択します。

1. [**Lambda 関数**] で、次のいずれかを実行します。
   + 既存の Lambda 関数を選択します。
   + 新しい Lambda 関数を作成し、その関数を選択します。
   + Lambda 関数は後ほど登録します。

1. **[ターゲットグループの作成]** を選択します。

**を使用してターゲットグループを作成し、Lambda 関数を登録するには AWS CLI**  
[create-target-group](https://docs.aws.amazon.com/cli/latest/reference/vpc-lattice/create-target-group.html) と [register-targets](https://docs.aws.amazon.com/cli/latest/reference/vpc-lattice/register-targets.html) コマンドを使用します。

## VPC Lattice サービスからのイベントを受け取る
<a name="receive-event-from-service"></a>

VPC Lattice サービスは、HTTP と HTTPS の両方を経由するリクエストの Lambda 呼び出しをサポートします。このサービスは JSON 形式でイベントを送信し、すべてのリクエストに `X-Forwarded-For` ヘッダーを追加します。

**Base64 エンコード**  
`content-encoding` ヘッダーが存在し、コンテンツタイプが以下のいずれでもない場合、サービス Base64 は本文をエンコードします。
+ `text/*`
+ `application/json`
+ `application/xml`
+ `application/javascript`

`content-encoding` ヘッダーが存在しない場合、Base64 エンコーディングはコンテンツタイプによって異なります。上述のコンテンツタイプの場合、サービスは Base64 エンコーディングせずに本文をそのまま送信します。

**イベント構造の形式**  
`LAMBDA` タイプのターゲットグループを作成または更新するときには、Lambda 関数が受け取るイベント構造のバージョンを指定できます。指定できるバージョンは `V1` と `V2` です。<a name="event-structure-v2"></a>

**Example サンプルイベント: V2**  

```
{
    "version": "2.0",
    "path": "/?query1=value1&query2=value2",
    "method": "GET|POST|HEAD|...",
    "headers": {
        "{{header-key}}": ["{{header-value}}", ...],
        ...
    },    
    "queryStringParameters": {
        "{{key}}": ["{{value}}", ...]
    },
    "body": "{{request-body}}",
    "isBase64Encoded": true|false,
    "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:iam::{{123456789012}}:assumed-role/{{my-role}}/{{my-session}}",
            "principalOrgID": "{{o-50dc6c495c0c9188}}",
            "sessionName": "{{i-0c7de02a688bde9f7}}",
            "x509IssuerOu": "{{string}}",
            "x509SanDns": "{{string}}",
            "x509SanNameCn": "{{string}}",
            "x509SanUri": "{{string}}",
            "x509SubjectCn": "{{string}}"
        },
        "region": "{{region}}",
        "timeEpoch": "{{1690497599177430}}"
    }
}
```  
`body`  
リクエスト本文。プロトコルが HTTP、HTTPS、gRPC の場合にのみ存在します。  
`headers`  
リクエストの HTTP ヘッダー。プロトコルが HTTP、HTTPS、gRPC の場合にのみ存在します。  
`identity`  
ID 情報。有効なフィールドには以下のものがあります。  
+ `principal` — 認証されたプリンシパル。 AWS 認証が成功した場合にのみ表示されます。
+ `principalOrgID` — 認証されたプリンシパルの組織の ID。 AWS 認証が成功した場合にのみ表示されます。
+ `sessionName` - 認証されたセッションの名前。 AWS 認証が成功した場合にのみ表示されます。
+ `sourceVpcArn` — リクエストが発生した VPC の ARN。ソース VPC が特定できる場合にのみ表示されます。
+ `type` – 認証ポリシーが使用され、 AWS 認証が成功`AWS_IAM`した場合、値は です。
Roles Anywhere の認証情報が使用され、認証が成功すると、以下のフィールドが表示される場合があります。  
+ `x509IssuerOu` — 発行者 (OU)。
+ `x509SanDns` — サブジェクト代替名 (DNS)。
+ `x509SanNameCn` — 発行者代替名 (名前/CN)。
+ `x509SanUri` — サブジェクト代替名 (URI)。
+ `x509SubjectCn` — サブジェクト名 (CN)。  
`isBase64Encoded`  
本文が base64 エンコードされているかどうかを示します。プロトコルが HTTP、HTTPS、gRPC であり、リクエスト本文がまだ文字列でない場合にのみ表示されます。  
`method`  
リクエストの HTTP メソッド。プロトコルが HTTP、HTTPS、gRPC の場合にのみ存在します。  
`path`  
クエリ文字列パラメータを含むクライアントからのリクエストのパス。プロトコルが HTTP、HTTPS、gRPC の場合にのみ存在します。  
`queryStringParameters`  
HTTP クエリ文字列パラメータ。プロトコルが HTTP、HTTPS、gRPC の場合にのみ存在します。  
`serviceArn`  
リクエストを受け取るサービスの ARN。  
`serviceNetworkArn`  
リクエストを配信するサービスネットワークの ARN。  
`targetGroupArn`  
リクエストを受け取るターゲットグループの ARN。  
`timeEpoch`  
時間 (秒単位)。<a name="event-structure-v1"></a>

**Example サンプルイベント: V1**  

```
{
    "raw_path": "{{/path/to/resource?query1=value1&query2=value2}}",
    "method": "GET|POST|HEAD|...",
    "headers": {"{{header-key}}": "{{header-value}}", ... },
    "query_string_parameters": {"{{key}}": "{{value}}", ...},
    "body": "{{request-body}}",
    "is_base64_encoded": true|false
}
```

## VPC Lattice サービスへのレスポンス
<a name="respond-to-service"></a>

Lambda 関数からのレスポンスには、Base64 エンコーディングのステータス、ステータスコード、およびヘッダーが含まれます。本文は省略できます。

レスポンス本文にバイナリコンテンツを含めるには、コンテンツを Base64 でエンコードし、`isBase64Encoded` を `true` に設定する必要があります。サービスはコンテンツをデコードしてバイナリコンテンツを取得し、そのコンテンツを HTTP レスポンスの本文でクライアントに送信します。

VPC Lattice サービスでは、`Connection` や `Transfer-Encoding` などのホップバイホップ方式のヘッダーは受け付けません。サービスがクライアントにレスポンスを送信する前に計算するため、`Content-Length` ヘッダーは省略できます。

Lambda 関数からのレスポンスの例を次に示します。

```
{
    "isBase64Encoded": {{false}},
    "statusCode": {{200}},
    "headers": {
        "Set-cookie": "{{cookies}}",
        "Content-Type": "application/json"
    },
    "body": "Hello from Lambda (optional)"
}
```

## 複数値ヘッダー
<a name="multi-value-headers"></a>

VPC Lattice は、クライアントからのリクエスト、または複数の値を持つヘッダーを含むか、同じヘッダーを複数回含む Lambda 関数からのレスポンスをサポートします。VPC Lattice はすべての値をターゲットに渡します。

次の例では、異なる値header1を持つ という名前の 2 つのヘッダーがあります。

```
header1 = value1
header1 = value2
```

V2 イベント構造では、VPC Lattice はリスト内の値を送信します。例えば、次のようになります。

```
"header1": ["value1", "value2"]
```

V1 イベント構造では、VPC Lattice は値を 1 つの文字列に結合します。例えば、次のようになります。

```
"header1": "value1, value2"
```

## 複数値クエリ文字列パラメータ
<a name="multi-value-string-parameters"></a>

VPC Lattice は、同じキーに対して複数の値を持つクエリパラメータをサポートします。

次の例では、異なる値QS1を持つ という名前の 2 つのパラメータがあります。

```
http://www.example.com?&QS1=value1&QS1=value2
```

V2 イベント構造では、VPC Lattice はリスト内の値を送信します。例えば、次のようになります。

```
"QS1": ["value1", "value2"]
```

V1 イベント構造では、VPC Lattice は最後に渡された値を使用します。例えば、次のようになります。

```
"QS1": "value2"
```

## Lambda 関数の登録解除
<a name="deregister-lambda-function"></a>

トラフィックを Lambda 関数に送信する必要がなくなった場合は、登録を解除できます。Lambda 関数の登録を解除すると、未処理のリクエストは HTTP 5XX エラーで失敗します。

Lambda 関数を置き換えるには、新しいターゲットグループを作成し、新しい関数を新しいターゲットグループに登録し、リスナールールを更新して既存のターゲットグループではなく新しいターゲットグループを使用することをお勧めします。

**コンソールを使用して Lambda 関数を登録解除するには**

1. Amazon VPC コンソールの [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) を開いてください。

1. ナビゲーションペインの **[VPC Lattice]** で **[ターゲットグループ]** を選択します。

1. ターゲットグループの名前を選択して、その詳細ページを開きます。

1. [**ターゲット**] タブで、[**登録解除**] を選択します。

1. 確認を求められたら、「**confirm**」と入力し、**[登録解除]** を選択します。

**を使用して Lambda 関数の登録を解除するには AWS CLI**  
[deregister-targets](https://docs.aws.amazon.com/cli/latest/reference/vpc-lattice/deregister-targets.html) コマンドを使用します。