Lambda のリゾルバーのマッピングテンプレートリファレンス - AWS AppSync

Lambda のリゾルバーのマッピングテンプレートリファレンス

AWS AppSync の Lambda リゾルバーマッピングテンプレートを使用すると、AWS AppSync から、アカウントに配置された AWS Lambda 関数へのリクエストと、Lambda 関数から AWS AppSync に返すレスポンスを作成できます。マッピングテンプレートでは、呼び出されるオペレーションの特性に関して、AWS AppSync にヒントを渡すこともできます。このセクションでは、サポートされる AWS Lambda の処理の異なるマッピングテンプレートについて説明します。

リクエストマッピングテンプレート

Lambda リクエストマッピングテンプレートは非常に簡単で、できるだけ多くのコンテキスト情報を Lambda 関数に渡すことができます。

{ "version": string, "operation": Invoke|BatchInvoke, "payload": any type }

以下に示しているのは、解決済み Lambda リクエストマッピングテンプレートの JSON スキーマ表現です。

{ "definitions": {}, "$schema": "https://json-schema.org/draft-06/schema#", "$id": "https://aws.amazon.com/appsync/request-mapping-template.json", "type": "object", "properties": { "version": { "$id": "/properties/version", "type": "string", "enum": [ "2017-02-28" ], "title": "The Mapping template version.", "default": "2017-02-28" }, "operation": { "$id": "/properties/operation", "type": "string", "enum": [ "Invoke", "BatchInvoke" ], "title": "The Mapping template operation.", "description": "What operation to execute.", "default": "Invoke" }, "payload": {} }, "required": [ "version", "operation" ], "additionalProperties": false }

以下に示しているのは、コンテキストから GraphQL フィールド引数と field 値を渡すように選択した例です。

{ "version": "2017-02-28", "operation": "Invoke", "payload": { "field": "getPost", "arguments": $utils.toJson($context.arguments) } }

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

{ "version": "2017-02-28", "operation": "Invoke", "payload": { "field": "getPost", "arguments": { "id": "postId1" } } }

バージョン

すべてのリクエストマッピングテンプレートに共通で、version はテンプレートが使用するバージョンを定義します。version が必要です。

"version": "2017-02-28"

オペレーション

Lambda データソースでは、2 つのオペレーション InvokeBatchInvoke を定義できます。Invoke では、すべての GraphQL フィールドリゾルバーに対して Lambda 関数を呼び出すことを AWS AppSync に通知し、一方 BatchInvoke では、現在の GraphQL フィールドに対するリクエストをバッチ実行するように AWS AppSync に指示します。

Invoke では、解決されたリクエストマッピングテンプレートは Lambda 関数の入力ペイロードと完全に一致します。したがって、次のサンプルテンプレートは

{ "version": "2017-02-28", "operation": "Invoke", "payload": { "arguments": $utils.toJson($context.arguments) } }

解決され、次の内容が Lambda 関数に渡されます。

{ "version": "2017-02-28", "operation": "Invoke", "payload": { "arguments": { "id": "postId1" } } }

BatchInvoke では、バッチ内のすべてのフィールドリゾルバーにマッピングテンプレートが適用されます。簡潔さのために、AWS AppSync は解決されたすべてのマッピングテンプレートの payload 値を、マッピングテンプレートに一致する単一オブジェクトの下でリストにマージします。

次のサンプルテンプレートは、マージを示します。

{ "version": "2017-02-28", "operation": "BatchInvoke", "payload": $utils.toJson($context) }

このテンプレートは、次のマッピングドキュメントに解決されます。

{ "version": "2017-02-28", "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 ]

operation は必須です。

payload

payload フィールドは、任意の正しい形式の JSON を Lambda 関数に渡す際に使用するコンテナです。

operation フィールドが BatchInvoke に設定されている場合、AWS AppSync は既存の payload 値をリストにまとめます。

payload は省略可能です。

レスポンスマッピングテンプレート

他のデータソースと同様に、Lambda 関数はレスポンスを、AWS AppSync に送信します。これは GraphQL タイプに変換する必要があります。

Lambda 関数の結果が context オブジェクト (VTL $context.result プロパティで使用できる) に設定されます。

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

$utils.toJson($context.result)

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

Lambda 関数のバッチ処理されたレスポンス

operation フィールドが BatchInvoke に設定されている場合、AWS AppSync は Lambda 関数からの項目のリストを想定します。AWS AppSync で、それぞれの結果を元のリクエスト項目にマッピングするためには、レスポンスリストでサイズと順番が一致する必要があります。レスポンスリストに null 項目があっても構いません。その場合、$ctx.resultnull に設定されます。