

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

# Lambda のAWS AppSync JavaScript リゾルバー関数リファレンス
<a name="resolver-reference-lambda-js"></a>

 AWS AppSync 関数とリゾルバーを使用して、 アカウントにある Lambda 関数を呼び出すことができます。クライアントに返す前に、リクエストペイロードと Lambda 関数からのレスポンスを調整することができます。実行する操作のタイプをリクエストオブジェクトで指定することもできます。このセクションでは、サポートされる Lambda 操作に対するリクエストについて説明します。

## オブジェクトをリクエストする
<a name="request-object-js"></a>

Lambda リクエストオブジェクトは、Lambda 関数に関連するフィールドを処理します。

```
export type LambdaRequest = {
  operation: 'Invoke' | 'BatchInvoke';
  invocationType?: 'RequestResponse' | 'Event';
  payload: unknown;
};
```

以下は、ペイロードデータが GraphQL スキーマの `getPost` フィールドであり、コンテキストの引数を含む `invoke` オペレーションを使用する例です。

```
export function request(ctx) {
  return {
    operation: 'Invoke',
    payload: { field: 'getPost', arguments: ctx.args },
  };
}
```

マッピングドキュメント全体は、使用する Lambda 関数に入力として渡されます。これにより、先ほどのサンプルは以下のようになります。

```
{
  "operation": "Invoke",
  "payload": {
    "field": "getPost",
    "arguments": {
      "input": {
        "id": "postId1",
      }
    }
  }
}
```

### 運用
<a name="operation-js"></a>

Lambda データソースでは、`operation` フィールドで 2 つのオペレーションである `Invoke` と `BatchInvoke` を定義できます。`Invoke` オペレーションは、GraphQL フィールドリゾルバーごとに Lambda 関数を呼び出すことを AWS AppSync に知らせます。 `BatchInvoke` は、現在の GraphQL フィールドのリクエストをバッチ処理するように AWS AppSync に指示します。`operation` フィールドは必須です。

`Invoke` では、解決されたリクエストは Lambda 関数の入力ペイロードと一致します。上記の例を変更してみましょう。

```
export function request(ctx) {
  return {
    operation: 'Invoke',
    payload: { field: 'getPost', arguments: ctx.args },
  };
}
```

これは解決され、Lambda 関数に渡されます。この関数は次のようになります。

```
{
  "operation": "Invoke",
  "payload": {
    "arguments": {
      "id": "postId1"
    }
  }
}
```

`BatchInvoke` では、リクエストはバッチ内のすべてのフィールドリゾルバーに適用されます。簡潔にするために、 AWS AppSync はすべてのリクエスト`payload`値を、リクエストオブジェクトに一致する単一のオブジェクトのリストにマージします。以下のリクエストハンドラーの例ではマージを示しています。

```
export function request(ctx) {
  return {
    operation: 'Invoke',
    payload: ctx,
  };
}
```

このリクエストは評価され、次のマッピングドキュメントに解決されます。

```
{
  "operation": "BatchInvoke",
  "payload": [
    {...}, // context for batch item 1
    {...}, // context for batch item 2
    {...}  // context for batch item 3
  ]
}
```

`payload` リストの各要素は、1 回のバッチ項目に対応しています。また、Lambda 関数はリスト形式のレスポンスを返すことが予期され、次のように、各項目はリクエストで送信された順序になります。

```
[
  { "data": {...}, "errorMessage": null, "errorType": null }, // result for batch item 1
  { "data": {...}, "errorMessage": null, "errorType": null }, // result for batch item 2
  { "data": {...}, "errorMessage": null, "errorType": null }  // result for batch item 3
]
```

### ペイロード
<a name="payload-js"></a>

`payload` フィールドは、任意のデータを Lambda 関数に渡す際に使用されるコンテナです。`operation` フィールドが `BatchInvoke` に設定されている場合、 AWS AppSync は既存の `payload` 値をリストにまとめます。`payload` フィールドはオプションです。

### 呼び出しタイプ
<a name="async-invocation-type-js"></a>

Lambda データソースでは、2 つの呼び出しタイプ `RequestResponse` と `Event` を定義できます。呼び出しタイプは、[Lambda API](https://docs.aws.amazon.com//lambda/latest/api/API_Invoke.html) で定義されている呼び出しタイプと同義です。`RequestResponse` 呼び出しタイプ lets AWS AppSync は Lambda 関数を同期的に呼び出してレスポンスを待ちます。`Event` 呼び出しにより、Lambda 関数を非同期的に呼び出すことができます。Lambda が `Event` 呼び出しタイプのリクエストを処理する方法の詳細については、「[非同期呼び出し](https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html)」を参照してください。`invocationType` フィールドはオプションです。このフィールドがリクエストに含まれていない場合、 AWS AppSync はデフォルトで`RequestResponse`呼び出しタイプになります。

`invocationType` フィールドでは、解決されたリクエストは Lambda 関数の入力ペイロードと一致します。上記の例を変更してみましょう。

```
export function request(ctx) {
  return {
    operation: 'Invoke',
    invocationType: 'Event',
    payload: { field: 'getPost', arguments: ctx.args },
  };
}
```

これは解決され、Lambda 関数に渡されます。この関数は次のようになります。

```
{
  "operation": "Invoke",
  "invocationType": "Event",
  "payload": {
    "arguments": {
      "id": "postId1"
    }
  }
}
```

`BatchInvoke` オペレーションを`Event`呼び出しタイプフィールドと組み合わせて使用すると、 AWS AppSync は上記の同じ方法でフィールドリゾルバーをマージし、リクエストは を値`payload`のリストとする非同期イベントとして Lambda 関数に渡されます。`Event` 呼び出しタイプのリクエストからのレスポンスは、レスポンスハンドラーのない `null` 値になります。

```
{
  "data": {
    "field": null
  }
}
```

`Event` 呼び出しタイプのリゾルバーのリゾルバーキャッシュは、キャッシュヒットがあった場合に Lambda に送信されないため、無効にすることをお勧めします。

## レスポンスオブジェクト
<a name="response-object-js"></a>

他のデータソースと同様に、Lambda 関数は GraphQL タイプに変換する必要があるレスポンスを AWS AppSync に送信します。Lambda 関数の結果は、`context` result プロパティに含まれます (`context.result`)。

Lambda 関数のレスポンスの形状と GraphQL タイプの形状が正確に一致する場合は、以下の関数レスポンスハンドラーを使用して、レスポンスを転送できます。

```
export function response(ctx) {
  return ctx.result
}
```

レスポンスオブジェクトに適用される形状の制限や必須フィールドはありません。ただし、GraphQL が厳密に型指定されているので、解決されたレスポンスは予想される GraphQL タイプに一致する必要があります。

## Lambda 関数のバッチ処理されたレスポンス
<a name="aws-appsync-resolver-reference-lambda-batched-response-js"></a>

`operation` フィールドが に設定されている場合`BatchInvoke`、 AWS AppSync は Lambda 関数から返される項目のリストを想定します。 AWS AppSync が各結果を元のリクエスト項目にマッピングするには、レスポンスリストのサイズと順序が一致している必要があります。レスポンスリストに `null` 項目がある場合も有効です。その場合、`ctx.result` が *null* に設定されます。