

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

# 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) コマンドを使用します。