リゾルバーの設定 - AWS AppSync

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

リゾルバーの設定

このセクションでは、リゾルバーを作成する方法、ミューテーション用のリゾルバーを追加する方法、詳細設定を使用する方法について説明します。

最初のリゾルバーを作成する

AWS AppSync コンソールで、[スキーマ] ページに移動します。右側のクエリタイプで、getTodos フィールドの横にある [アタッチリゾルバー] を選択します。[Create Domain Name] ページで、先ほど作成したデータソースを選択し、デフォルトのテンプレートを選択するか、または独自のテンプレートを貼り付けます。よくあるユースケースについては、AWS AppSync コンソールに、データソースから項目を取得するための組み込みテンプレート (全項目のクエリ、個別のルックアップなど) があります。たとえば、「スキーマの設計」で使用したスキーマのシンプルバージョンでは、getTodos にページ分割がなく、マッピングテンプレートは次のようになっていました。

{ "version" : "2017-02-28", "operation" : "Scan" }

レスポンスマッピングテンプレートは常に必要です。コンソールには、リストの値をパススルーする次のようなデフォルトのテンプレートがあります。

$util.toJson($context.result.items)

この例では、項目のリストに対する context オブジェクト ($ctx としてエイリアスが作成された) の形式は $context.result.items です。GraphQL オペレーションが単一の項目を返す場合、$context.result。AWSAppSync は、次のような一般的な操作用のヘルパー関数を提供します。応答を適切にフォーマットするために、前にリストした $util.toJson 関数など。関数の完全なリストについては、「リゾルバーのマッピングテンプレートのユーティリティリファレンス」を参照してください。

注意: 作成したデフォルトのリゾルバは、Unitリゾルバですが、AppSync は作成もサポートしていますパイプラインリゾルバは、複数のデータソースに対して操作を順番に実行するためのものです。詳細については、「パイプラインリゾルバー」を参照してください。

ミューテーション用のリゾルバーの追加

前述の処理を繰り返し、[スキーマ] ページから始めて、 ミューテーションに対して [Attach resolver (リゾルバーのアタッチ)addTodo] を選択します。これは DynamoDB に新しい項目を追加するミューテーションであるため、次のリクエストマッピングテンプレートを使用します。

{ "version" : "2017-02-28", "operation" : "PutItem", "key" : { "id" : $util.dynamodb.toDynamoDBJson($ctx.args.id) }, "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args) }

AWS AppSyncは、addTodo フィールドで定義されている引数を GraphQL スキーマから DynamoDB オペレーションに自動的に変換します。上記の例では、ミューテーションの引数で $ctx.args.id として渡された id のキーを使用して、レコードが DynamoDB に保存されます。渡した他のすべてのフィールドは、$util.dynamodb.toMapValuesJson($ctx.args) を使用して自動的に DynamoDB 属性にマッピングされます。

このリゾルバーでは、次のレスポンスマッピングテンプレートを使用します。

$utils.toJson($context.result)

AWS AppSyncでは、リゾルバーを編集するためのテストとデバッグのワークフローもサポートされています。モック context オブジェクトを使用して、呼び出す前にテンプレートでの変換後の値を確認できます。また、クエリを実行する際にデータソースへのリクエストの実行全体をインタラクティブに表示することもできます。詳細については、「リゾルバーのテストとデバッグ」および「モニタリングとロギング」を参照してください。

この時点で、高度なリゾルバーを使用していない場合は、「API の使用」で説明されているよう GraphQL API の使用を開始できます。

高度なリゾルバー

スキーマの設計」でのサンプルスキーマの構築の「高度な機能」セクションに従ってページ分割スキャンを行う場合は、getTodos フィールドに次のリクエストテンプレートを使用します。

{ "version" : "2017-02-28", "operation" : "Scan", "limit": $util.defaultIfNull(${ctx.args.limit}, 20), "nextToken": $util.toJson($util.defaultIfNullOrBlank($ctx.args.nextToken, null)) }

このページ分割のユースケースでは、レスポンスマッピングに cursor (クライアントが次の開始ページを知るため) と結果セットの両方が含まれている必要があるため、レスポンスマッピングは単なるパススルーではありません。マッピングテンプレートは次のようになります。

{ "todos": $util.toJson($context.result.items), "nextToken": $util.toJson($context.result.nextToken) }

前述のレスポンスマッピングテンプレート内のフィールドは、TodoConnection 型で定義されているフィールドと一致している必要があります。

Comments テーブルがあり、Todo 型の comments フィールドを解決するリレーション ([Comment] の型を返す) の場合は、2 番目のテーブルに対してクエリを実行するマッピングテンプレートを使用できます。これを行うには、「データソースをアタッチする」で説明しているように Comments テーブルのデータソースを作成しておく必要があります。

注意: ここでは 2 番目のテーブルに対するクエリオペレーションを使用しているのは、例を示すことのみを目的としています。代わりに、DynamoDB に対して別のオペレーションを使用できます。さらに、次のような別のデータソースからデータを取り込むこともできます。AWS Lambdaこのリレーションはユーザーの GraphQL スキーマによって制御されているため、このリレーションはユーザーの Amazon OpenSearch サービスです。

コンソールの [スキーマ] ページで、[Todo タイプ] の [commentsフィールドイン] を選択してから、[アタッチ] を選択します。[Comments table data source] を選択し、次のリクエストマッピングテンプレートを使用します。

{ "version": "2017-02-28", "operation": "Query", "index": "todoid-index", "query": { "expression": "todoid = :todoid", "expressionValues": { ":todoid": { "S": $util.toJson($context.source.id) } } } }

context.source は、解決する現在のフィールドの親オブジェクトを参照します。この例では、source.id は個別の Todo オブジェクトを参照します。これはクエリ式に使用されます。

次のようにパススルーのレスポンスマッピングテンプレートを使用できます。

$util.toJson($ctx.result.items)

最後に、コンソールの [スキーマ] ページで、リゾルバーを addComment フィールドにアタッチして Comments テーブルのデータソースを指定します。この例のリクエストマッピングテンプレートは、引数としてコメントされる特定の todoid を含む単純な PutItem ですが、次のように $utils.autoId() ユーティリティを使用してコメントに対して一意なソートキーを作成します。

{ "version": "2017-02-28", "operation": "PutItem", "key": { "todoid": { "S": $util.toJson($context.arguments.todoid) }, "commentid": { "S": "$util.autoId()" } }, "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args) }

次のようにパススルーレスポンステンプレートを使用します。

$util.toJson($ctx.result)