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

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

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

-AWSAppSync Lambda リゾルバーマッピングテンプレートを使用すると、からのリクエストをシェーピングできます。AWSAppSyncAWS Lambdaアカウントにある関数と Lambda 関数からのレスポンスAWSAppSync。マッピングテンプレートでは、にヒントを渡すこともできます。AWSAppSync は、呼び出されるオペレーションの特性に関する 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": [ "2018-05-29" ], "title": "The Mapping template version.", "default": "2018-05-29" }, "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": "2018-05-29", "operation": "Invoke", "payload": { "field": "getPost", "arguments": $util.toJson($context.arguments) } }

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

{ "version": "2018-05-29", "operation": "Invoke", "payload": { "field": "getPost", "arguments": { "id": "postId1" } } }

Version

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

"version": "2018-05-29"

Operation

Lambda データソースでは、2 つのオペレーション InvokeBatchInvoke を定義できます。-InvokeそうだAWSAppSync はすべての GraphQL フィールドリゾルバーに対して Lambda 関数を呼び出すことを AppSync に認識BatchInvoke指示しますAWSAppSync を使用して、現在の GraphQL フィールドのリクエストをバッチ処理します。

operation は必須です。

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

{ "version": "2018-05-29", "operation": "Invoke", "payload": { "arguments": $util.toJson($context.arguments) } }

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

{ "version": "2018-05-29", "operation": "Invoke", "payload": { "arguments": { "id": "postId1" } } }

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

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

{ "version": "2018-05-29", "operation": "BatchInvoke", "payload": $util.toJson($context) }

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

{ "version": "2018-05-29", "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,AWSAppSync は既存のものをラップしますpayload値をリストに追加します。

payload は省略可能です。

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

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

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

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

$util.toJson($context.result)

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

Lambda 関数バッチレスポンス

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

Lambda リゾルバー

マッピングテンプレートの使用を完全に回避したい場合は、AWSAppSync は、Lambda 関数にデフォルトのペイロードを提供し、GraphQL タイプに対する Lambda 関数の応答のデフォルトを提供できます。リクエストテンプレート、レスポンステンプレート、またはどちらを指定しないかを選択できます。AWSAppSync はそれに応じて処理します。

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

リクエストマッピングテンプレートが指定されていない場合は、AWSAppSync は、Context オブジェクトを Lambda 関数に直接送信します。Invokeオペレーション. Context オブジェクトの構造の詳細については、「」を参照してください。Context

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

レスポンスマッピングテンプレートが指定されていない場合は、AWSAppSync は Lambda 関数のレスポンスを受け取ると、2 つの処理のいずれかを行います。リクエストマッピングテンプレートを指定しなかった場合、またはバージョン「2018-05-29」でリクエストマッピングテンプレートを提供した場合、応答ロジックは次のレスポンスマッピングテンプレートと同等しく機能します。

#if($ctx.error) $util.error($ctx.error.message, $ctx.error.type, $ctx.result) #end $util.toJson($ctx.result)

バージョン「2017-02-28」のテンプレートを提供した場合、レスポンス・ロジックは次のレスポンス・マッピング・テンプレートと同等の機能を果たします。

$util.toJson($ctx.result)

表面的には、マッピングテンプレートのバイパスは、前の例に示すように、特定のマッピングテンプレートを使用する場合と同様に機能します。ただし、舞台裏では、マッピングテンプレートの評価は完全に回避されます。テンプレート評価ステップはバイパスされるため、一部のシナリオでは、評価が必要なレスポンスマッピングテンプレートを持つ Lambda 関数と比較して、アプリケーションのレスポンスのオーバーヘッドとレイテンシーが少なくなる場合があります。

ダイレクト Lambda リゾルバーレスポンスのカスタムエラー処理

カスタム例外を発生させることにより、Direct Lambda リゾルバーによって呼び出される Lambda 関数からのエラーレスポンスをカスタマイズできます。次の例では、JavaScript を使用してカスタム例外を作成する方法を示します。

class CustomException extends Error { constructor(message) { super(message); this.name = "CustomException"; } } throw new CustomException("Custom message");

例外が発生すると、errorTypeおよびerrorMessageとなるnameおよびmessage、それぞれスローされるカスタムエラーの。

もしerrorTypeUnauthorizedException,AWSAppSync はデフォルトのメッセージを返します。"You are not authorized to make this call.") カスタムメッセージの代わりに。

以下は、カスタムを示す GraphQL レスポンスの例です。errorType

{ "data": { "query": null }, "errors": [ { "path": [ "query" ], "data": null, "errorType": "CustomException", "errorInfo": null, "locations": [ { "line": 5, "column": 10, "sourceName": null } ], "message": "Custom Message" } ] }