翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
基本的なクエリの作成 (JavaScript)
GraphQL リゾルバーは、タイプのスキーマのフィールドをデータソースに接続します。リゾルバーはリクエストを実行するメカニズムです。
GraphQL 式をデータソースが使用できる形式に変換 JavaScript するために AWS AppSync 使用されているリゾルバー。または、マッピングテンプレートを Apache Velocity Template Language (VTL)
このセクションでは、 を使用してリゾルバーを設定する方法について説明します JavaScript。Resolver チュートリアル (JavaScript) セクションでは、 を使用してリゾルバーを実装する方法に関する詳細なチュートリアルを提供します JavaScript。リゾルバーリファレンス (JavaScript) セクションでは、 JavaScript リゾルバーで使用できるユーティリティオペレーションについて説明します。
前述のチュートリアルを使用する前に、このガイドに従うことをお勧めします。
このセクションでは、リゾルバーを作成してクエリとミューテーションを実行するために設定する方法について説明します。
注記
このガイドでは、スキーマが作成済みで、少なくとも 1 つのクエリまたはミューテーションが含まれていることを前提としています。サブスクリプション (リアルタイムデータ) をお探しの場合は、このガイドを参照してください。
このセクションでは、リゾルバーを設定する一般的な手順と、以下のスキーマを使用する例を紹介します。
// schema.graphql file input CreatePostInput { title: String date: AWSDateTime } type Post { id: ID! title: String date: AWSDateTime } type Mutation { createPost(input: CreatePostInput!): Post } type Query { getPost: [Post] }
基本的なクエリリゾルバーの作成
このセクションでは、基本的なクエリリゾルバーを作成する方法を説明します。
- Console
-
-
にサインイン AWS Management Console し、AppSyncコンソール
を開きます。 -
APIs ダッシュボード で、GraphQL を選択しますAPI。
-
サイドバーで [スキーマ] を選択します。
-
-
スキーマとデータソースの詳細を入力します。詳細については、「スキーマの設計」と「データソースを追加する」の各セクションを参照してください。
-
[スキーマ] エディターの横に [リゾルバー] という名前のウィンドウがあります。このボックスには、[スキーマ] ウィンドウで定義されているタイプとフィールドのリストが含まれています。フィールドにはリゾルバーをアタッチできます。ほとんどの場合、フィールド処理にリゾルバーをアタッチすることになります。このセクションでは、簡単なクエリの設定について説明します。[クエリ] 型で、クエリのフィールドの横にある [アタッチ] を選択します。
-
[リゾルバーをアタッチ] ページの [リゾルバータイプ] で、パイプラインリゾルバーとユニットリゾルバーのどちらかを選択できます。これらのリゾルバータイプの詳細については、「リゾルバー」を参照してください。このガイドでは
pipeline resolvers
を使用します。ヒント
パイプラインリゾルバーを作成すると、データソースがパイプライン関数にアタッチされます。関数は、パイプラインリゾルバー自体を作成した後に作成されます。そのため、このページにはこれを設定するオプションはありません。ユニットリゾルバーを使用する場合は、データソースがリゾルバーに直接関連付けられるため、このページで設定します。
Resolver ランタイム では、 JavaScript ランタイムを有効にする
APPSYNC_JS
を選択します。 -
この のキャッシュを有効にできますAPI。現時点では、この機能をオフにすることをお勧めします。[Create] (作成) を選択します。
-
[リゾルバーを編集] ページには、リゾルバーハンドラーとレスポンス (before および after ステップ) のロジックを実装できるリゾルバーコードというコードエディターがあります。詳細については、JavaScript「リゾルバーの概要」を参照してください。
注記
この例では、リクエストを空白のままにし、context からの最後のデータソース結果を返すようにレスポンスを設定します。
import {util} from '@aws-appsync/utils'; export function request(ctx) { return {}; } export function response(ctx) { return ctx.prev.result; }
このセクションの下には、[関数] というテーブルがあります。[関数] では、複数のリゾルバーで再利用できるコードを実装できます。コードを絶えず書き換えたりコピーしたりする代わりに、ソースコードを関数として保存し、必要なときにいつでもリゾルバーに追加できます。
関数はパイプラインのオペレーションリストの大部分を構成します。リゾルバーで複数の関数を使用する場合、関数の順序を設定すると、関数はその順序で順番に実行されます。これらの関数は、リクエスト関数の実行後、レスポンス関数の開始前に実行されます。
新しい関数を追加するには、[関数] で [関数を追加]、[新しい関数の作成] の順に選択します。代わりに [関数の作成] ボタンが表示されて選択できる場合もあります。
-
データソースを選択します。これがリゾルバーの処理対象となるデータソースになります。
注記
この例では、
id
でPost
オブジェクトを取得するgetPost
にリゾルバーをアタッチします。このスキーマ用の DynamoDB テーブルをすでにセットアップ済みであると仮定します。そのパーティションキーはid
に設定されており、空です。 -
Function name
を入力します。 -
[関数コード] で、関数の動作を実装する必要があります。わかりにくいかもしれませんが、各関数には独自のローカルのリクエストハンドラーとレスポンスハンドラーがあります。リクエストが実行され、次にデータソース呼び出しが実行されてリクエストが処理され、データソースのレスポンスがレスポンスハンドラーによって処理されます。結果は context オブジェクトに保存されます。その後、リスト内の次の関数が実行されるか、それが最後の関数であればステップ後のレスポンスハンドラーに渡されます。
注記
この例では、データソースから
Post
オブジェクトのリストを取得するgetPost
にリゾルバーをアタッチします。リクエスト関数はテーブルからデータをリクエストし、テーブルはそのレスポンスをコンテキスト (ctx) に渡し、レスポンスはコンテキストで結果を返します。 AWS AppSyncの強みは、他の AWS サービスとの相互接続にあります。DynamoDB を使用しているため、このような作業を簡略化するための一連のオペレーションがあります。他のデータソースタイプについても共通する例がいくつかあります。コードは以下のようになります。
import { util } from '@aws-appsync/utils'; /** * Performs a scan on the dynamodb data source */ export function request(ctx) { return { operation: 'Scan' }; } /** * return a list of scanned post items */ export function response(ctx) { return ctx.result.items; }
このステップでは、次の 2 つの関数を追加しました。
-
request
: リクエストハンドラーはデータソースに対して取得オペレーションを実行します。引数には、コンテキストオブジェクト (ctx
)、または特定のオペレーションを実行するすべてのリゾルバーが利用できるデータが含まれます。たとえば、認可データや解決対象のフィールド名などが含まれる場合があります。return ステートメントはScan
オペレーションを実行します (例はこちらを参照)。DynamoDB を使用しているため、そのサービスの一部のオペレーションを使用できます。このスキャンでは、テーブル内のすべての項目の基本的なフェッチが実行されます。このオペレーションの結果は、レスポンスハンドラーに渡される前にresult
コンテナーとしてコンテキストオブジェクトに保存されます。request
はパイプライン内のレスポンス前に実行されます。 -
response
:request
の出力を返すレスポンスハンドラー。引数は、更新されたコンテキストオブジェクトで、return ステートメントはctx.prev.result
です。ガイドのこの段階では、この値についてはよくわからないかもしれません。ctx
は context object オブジェクトを参照します。prev
はパイプライン内の直前のオペレーション、この例ではrequest
を参照します。result
には、リゾルバーがパイプラインを経由して移動する際の結果が含まれます。すべてをまとめると、ctx.prev.result
は最後に実行されたオペレーションの結果であるリクエストハンドラーを返します。
-
-
完了したら、[作成] を選択します。
-
-
リゾルバー画面に戻り、[関数] で [関数を追加] ドロップダウンを選択して、関数を関数リストに追加します。
-
[保存] を選択してリゾルバーを更新します。
-
- CLI
-
関数を追加するには
-
create-function
コマンドを使用してパイプラインリゾルバー用の関数を作成します。この特定のコマンドでは、いくつかのパラメータを入力する必要があります。
-
api-id
の API。 -
AWS AppSync コンソール内の 関数
name
の 。 -
data-source-name
、すなわち関数で使用されるデータソースの名前。 AWS AppSync サービスAPIで GraphQL に既に作成およびリンクされている必要があります。 -
runtime
、すなわち関数の環境と言語。の場合 JavaScript、名前はAPPSYNC_JS
で、ランタイムは である必要があります1.0.0
。 -
code
、すなわち関数のリクエストハンドラーとレスポンスハンドラー。手動でも入力できますが、.txt ファイル (または同様の形式) に追加して引数として渡すほうがはるかに簡単です。注記
クエリコードは引数として渡されるファイルにあります。
import { util } from '@aws-appsync/utils'; /** * Performs a scan on the dynamodb data source */ export function request(ctx) { return { operation: 'Scan' }; } /** * return a list of scanned post items */ export function response(ctx) { return ctx.result.items; }
コマンドの例は、次のようになります。
aws appsync create-function \ --api-id abcdefghijklmnopqrstuvwxyz \ --name get_posts_func_1 \ --data-source-name table-for-posts \ --runtime name=APPSYNC_JS,runtimeVersion=1.0.0 \ --code file://~/path/to/file/{filename}.{fileType}
出力は に返されますCLI。例を示します。
{ "functionConfiguration": { "functionId": "ejglgvmcabdn7lx75ref4qeig4", "functionArn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/functions/ejglgvmcabdn7lx75ref4qeig4", "name": "get_posts_func_1", "dataSourceName": "table-for-posts", "maxBatchSize": 0, "runtime": { "name": "APPSYNC_JS", "runtimeVersion": "1.0.0" }, "code": "
Code output goes here
" } }注記
functionId
は、必ずどこかに記録しておいてください。これは、リゾルバーに関数をアタッチする際に使用します。 -
リゾルバーを作成するには
-
create-resolver
コマンドを実行してQuery
のパイプライン関数を作成します。この特定のコマンドでは、いくつかのパラメータを入力する必要があります。
-
api-id
の API。 -
type-name
、すなわちスキーマ内の特別なオブジェクトタイプ (クエリ、ミューテーション、サブスクリプション)。 -
field-name
、すなわちリゾルバーをアタッチする特別なオブジェクトタイプ内のフィールドオペレーション。 -
kind
。ユニットまたはパイプラインリゾルバーを指定します。これをPIPELINE
に設定すると、パイプライン関数が有効になります。 -
pipeline-config
、すなわちリゾルバーにアタッチする関数。関数のfunctionId
値がわかっていることを確認してください。リストの順序は重要です。 -
runtime
はAPPSYNC_JS
() でしたJavaScript。runtimeVersion
は現在、1.0.0
です。 -
code
。before および after ステップハンドラーが含まれています。注記
クエリコードは引数として渡されるファイルにあります。
import { util } from '@aws-appsync/utils'; /** * Sends a request to `put` an item in the DynamoDB data source */ export function request(ctx) { const { id, ...values } = ctx.args; return { operation: 'PutItem', key: util.dynamodb.toMapValues({ id }), attributeValues: util.dynamodb.toMapValues(values), }; } /** * returns the result of the `put` operation */ export function response(ctx) { return ctx.result; }
コマンドの例は、次のようになります。
aws appsync create-resolver \ --api-id abcdefghijklmnopqrstuvwxyz \ --type-name Query \ --field-name getPost \ --kind PIPELINE \ --pipeline-config functions=ejglgvmcabdn7lx75ref4qeig4 \ --runtime name=APPSYNC_JS,runtimeVersion=1.0.0 \ --code file:///path/to/file/{filename}.{fileType}
出力は に返されますCLI。例を示します。
{ "resolver": { "typeName": "Mutation", "fieldName": "getPost", "resolverArn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/types/Mutation/resolvers/getPost", "kind": "PIPELINE", "pipelineConfig": { "functions": [ "ejglgvmcabdn7lx75ref4qeig4" ] }, "maxBatchSize": 0, "runtime": { "name": "APPSYNC_JS", "runtimeVersion": "1.0.0" }, "code": "
Code output goes here
" } } -
-
- CDK
-
ヒント
基本的なアプリには以下のものが必要です。
-
サービス import ディレクティブ
-
スキーマのコード
-
データソースジェネレーター
-
関数コード
-
リゾルバーのコード
「スキーマの設計」と「データソースを追加する」の各セクションによれば、スタックファイルには以下の形式の import ディレクティブが含まれます。
import * as
x
from 'x
'; # import wildcard as the 'x' keyword from 'x-service' import {a
,b
, ...} from 'c
'; # import {specific constructs} from 'c-service'注記
前のセクションでは、 AWS AppSync コンストラクトをインポートする方法のみについて説明しました。実際のコードでは、アプリを実行するためだけにより多くのサービスをインポートする必要があります。この例では、非常にシンプルなCDKアプリケーションを作成する場合、少なくとも DynamoDB テーブルであるデータソースとともに AWS AppSync サービスをインポートします。また、アプリをデプロイするには、いくつかの追加コンストラクトをインポートする必要があります。
import * as cdk from 'aws-cdk-lib'; import * as appsync from 'aws-cdk-lib/aws-appsync'; import * as dynamodb from 'aws-cdk-lib/aws-dynamodb'; import { Construct } from 'constructs';
それぞれについて概説すると、次のようになります。
-
import * as cdk from 'aws-cdk-lib';
: これにより、CDKアプリケーションやスタックなどのコンストラクトを定義できます。また、メタデータの操作など、アプリケーションに役立つユーティリティ関数もいくつか含まれています。このインポートディレクティブには精通しているものの、cdk コアライブラリがここで使用される理由が不明の場合は、「マイグレーション」ページを参照してください。 -
import * as appsync from 'aws-cdk-lib/aws-appsync';
: これにより AWS AppSync サービスがインポートされます。 -
import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';
: これにより DynamoDB サービスがインポートされます。 -
import { Construct } from 'constructs';
: ルート コンストラクトを定義するにはこれが必要です。
インポートの種類は、呼び出すサービスによって異なります。例については、CDKドキュメントを参照してください。ページ上部のスキーマは、CDKアプリ内の別のファイルとして
.graphql
ファイルとして表示されます。スタックファイルでは、次の形式でスキーマを新しい GraphQL に関連付けることができます。const add_api = new appsync.GraphqlApi(this, 'graphQL-example', { name: 'my-first-api', schema: appsync.SchemaFile.fromAsset(path.join(__dirname, 'schema.graphql')), });
注記
スコープ では
add_api
、new
キーワードの後に が続くAPI新しい GraphQL を追加しますappsync.GraphqlApi(scope: Construct, id: string , props: GraphqlApiProps)
。スコープはthis
で、ID CFN は でgraphQL-example
、props はmy-first-api
(コンソールAPIの の名前) とschema.graphql
(スキーマファイルへの絶対パス) です。データソースを追加するには、まずデータソースをスタックに追加する必要があります。次に、ソース固有のメソッドAPIを使用して、GraphQL に関連付ける必要があります。この関連付けは、リゾルバー関数を作成したときに行われます。その間に、
dynamodb.Table
を使用して DynamoDB テーブルを作成する例を見てみましょう。const add_ddb_table = new dynamodb.Table(this, 'posts-table', { partitionKey: { name: 'id', type: dynamodb.AttributeType.STRING, }, });
注記
この例では、ID CFN
posts-table
が でパーティションキーが の新しい DynamoDB テーブルを追加しますid (S)
。次に、スタックファイルにリゾルバーを実装する必要があります。DynamoDB テーブル内のすべての項目をスキャンする簡単なクエリの例を以下に示します。
const add_func = new appsync.AppsyncFunction(this, 'func-get-posts', { name: 'get_posts_func_1', add_api, dataSource: add_api.addDynamoDbDataSource('table-for-posts', add_ddb_table), code: appsync.Code.fromInline(` export function request(ctx) { return { operation: 'Scan' }; } export function response(ctx) { return ctx.result.items; } `), runtime: appsync.FunctionRuntime.JS_1_0_0, }); new appsync.Resolver(this, 'pipeline-resolver-get-posts', { add_api, typeName: 'Query', fieldName: 'getPost', code: appsync.Code.fromInline(` export function request(ctx) { return {}; } export function response(ctx) { return ctx.prev.result; } `), runtime: appsync.FunctionRuntime.JS_1_0_0, pipelineConfig: [add_func], });
注記
最初に、
add_func
という関数を作成しました。この作成順序は少し直観に反するような印象を持つかもしれませんが、リゾルバー自体を作成する前に、パイプラインリゾルバーで関数を作成する必要があります。関数は次の形式に従います。AppsyncFunction(scope: Construct, id: string, props: AppsyncFunctionProps)
スコープは
this
で、ID CFN は でfunc-get-posts
、小道具には実際の関数の詳細が含まれていました。props 内には以下が含まれています。-
AWS AppSync コンソール () に存在する関数
name
のget_posts_func_1
。 -
前にAPI作成した GraphQL (
add_api
)。 -
データソース。データソースを GraphQL API値にリンクし、関数にアタッチするポイントです。作成したテーブル (
add_ddb_table
) を取得し、いずれかのGraphqlApi
メソッド API () を使用して GraphQL (add_api
) にアタッチしますaddDynamoDbDataSource
。ID 値 (table-for-posts
) は AWS AppSync コンソールに表示されるデータソースの名前です。ソース固有のメソッドの一覧については、次のページを参照してください。 -
コードには関数のリクエストハンドラーとレスポンスハンドラーが含まれており、シンプルなスキャンを実行し、結果を返します。
-
ランタイムは、APPSYNC_JS ランタイムバージョン 1.0.0 を使用するように指定します。これは現在、APPSYNC_JS で使用できる唯一のバージョンであることに注意してください。
次に、関数をパイプラインリゾルバーにアタッチする必要があります。リゾルバーは次の形式で作成しています。
Resolver(scope: Construct, id: string, props: ResolverProps)
スコープは
this
で、ID CFN は でpipeline-resolver-get-posts
、小道具には実際の関数の詳細が含まれていました。props 内には以下が含まれています。-
前にAPI作成した GraphQL (
add_api
)。 -
特別なオブジェクトタイプ名。これはクエリオペレーションであり、
Query
値を追加しただけです。 -
フィールド名 (
getPost
) は、Query
タイプのスキーマ内にあるフィールドの名前です。 -
コードには before ハンドラーと after ハンドラーが含まれています。この例では、関数がオペレーションを実行した後の context 内の結果を返すだけです。
-
ランタイムは、APPSYNC_JS ランタイムバージョン 1.0.0 を使用するように指定します。これは現在、APPSYNC_JS で使用できる唯一のバージョンであることに注意してください。
-
パイプライン config には、作成した関数 (
add_func
) への参照が含まれています。
-
この例で何が起こったかを要約すると、リクエストとレスポンスハンドラーを実装した AWS AppSync 関数が表示されました。この関数はデータソースとやりとりする役割を持っています。リクエストハンドラーは にScan
オペレーションを送信し AWS AppSync、DynamoDB データソースに対して実行するオペレーションを指示します。レスポンスハンドラーは項目のリスト (ctx.result.items
) を返します。その後、項目のリストは Post
GraphQL タイプに自動的にマッピングされました。
基本的なミューテーションリゾルバーの作成
このセクションでは、基本的なミューテーションリゾルバーを作成する方法を説明します。
- Console
-
-
にサインイン AWS Management Console し、AppSyncコンソール
を開きます。 -
APIs ダッシュボード で、GraphQL を選択しますAPI。
-
サイドバーで [スキーマ] を選択します。
-
-
[リゾルバー] セクションと[ミューテーションタイプ] で、フィールドの横にある [アタッチ] を選択します。
注記
この例では、
createPost
のリゾルバーをアタッチすることで、Post
オブジェクトをテーブルに追加します。前のセクションと同じ DynamoDB テーブルを使用していると仮定します。そのパーティションキーはid
に設定されており、空です。 -
[リゾルバーをアタッチ] ページの [リゾルバータイプ] で、[
pipeline resolvers
] を選択します。リゾルバーの詳細を確認する場合は、こちらを参照してください。Resolver ランタイム では、 JavaScript ランタイムを有効にするAPPSYNC_JS
ことを選択します。 -
この のキャッシュを有効にできますAPI。現時点では、この機能をオフにすることをお勧めします。[Create] (作成) を選択します。
-
[関数の追加] を選択して、[新しい関数を作成] を選択します。代わりに [関数の作成] ボタンが表示されて選択できる場合もあります。
-
データソースを選択します。これは、ミューテーション時にデータを操作する際のソースになります。
-
Function name
を入力します。 -
[関数コード] で、関数の動作を実装する必要があります。これはミューテーションであるため、リクエストにより、呼び出されたデータソースに対してある程度状態が変化するオペレーションが実行されると理想的です。結果はレスポンス関数によって処理されます。
注記
createPost
はパラメータがデータとして含まれているテーブルに新しいPost
ものを追加します (入れます)。次のように追加します。import { util } from '@aws-appsync/utils'; /** * Sends a request to `put` an item in the DynamoDB data source */ export function request(ctx) { return { operation: 'PutItem', key: util.dynamodb.toMapValues({id: util.autoId()}), attributeValues: util.dynamodb.toMapValues(ctx.args.input), }; } /** * returns the result of the `put` operation */ export function response(ctx) { return ctx.result; }
このステップでは、
request
とresponse
の 2 つの関数を追加しました。-
request
: リクエストハンドラーはコンテキストを引数として受け入れます。リクエストハンドラーの return ステートメントは、組み込みの DynamoDB オペレーションであるPutItem
コマンドを実行します (例については、こちらまたはこちらを参照してください)。PutItem
このコマンドは、パーティションkey
値 (util.autoid()
によって自動的に生成) とコンテキストの引数の入力によるattributes
(リクエストで渡される値) を取得して、Post
オブジェクトを DynamoDB テーブルに追加します。key
は、id
で、attributes
はdate
およびtitle
フィールド引数です。どちらもutil.dynamodb.toMapValues
ヘルパーを経由して実行され、DynamoDB テーブルを使用します。 -
response
: レスポンスは、更新されたコンテキストを受け入れ、リクエストハンドラーの結果を返します。
-
-
完了したら、[作成] を選択します。
-
-
リゾルバー画面に戻り、[関数] で [関数を追加] ドロップダウンを選択して、関数を関数リストに追加します。
-
[保存] を選択してリゾルバーを更新します。
-
- CLI
-
関数を追加するには
-
create-function
コマンドを使用してパイプラインリゾルバー用の関数を作成します。この特定のコマンドでは、いくつかのパラメータを入力する必要があります。
-
api-id
の API。 -
AWS AppSync コンソール内の 関数
name
の 。 -
data-source-name
、すなわち関数で使用されるデータソースの名前。 AWS AppSync サービスAPIで GraphQL に既に作成およびリンクされている必要があります。 -
runtime
、すなわち関数の環境と言語。の場合 JavaScript、名前はAPPSYNC_JS
で、ランタイムは である必要があります1.0.0
。 -
code
、すなわち関数のリクエストハンドラーとレスポンスハンドラー。手動でも入力できますが、.txt ファイル (または同様の形式) に追加して引数として渡すほうがはるかに簡単です。注記
クエリコードは引数として渡されるファイルにあります。
import { util } from '@aws-appsync/utils'; /** * Sends a request to `put` an item in the DynamoDB data source */ export function request(ctx) { return { operation: 'PutItem', key: util.dynamodb.toMapValues({id: util.autoId()}), attributeValues: util.dynamodb.toMapValues(ctx.args.input), }; } /** * returns the result of the `put` operation */ export function response(ctx) { return ctx.result; }
コマンドの例は、次のようになります。
aws appsync create-function \ --api-id abcdefghijklmnopqrstuvwxyz \ --name add_posts_func_1 \ --data-source-name table-for-posts \ --runtime name=APPSYNC_JS,runtimeVersion=1.0.0 \ --code file:///path/to/file/{filename}.{fileType}
出力は に返されますCLI。例を示します。
{ "functionConfiguration": { "functionId": "vulcmbfcxffiram63psb4dduoa", "functionArn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/functions/vulcmbfcxffiram63psb4dduoa", "name": "add_posts_func_1", "dataSourceName": "table-for-posts", "maxBatchSize": 0, "runtime": { "name": "APPSYNC_JS", "runtimeVersion": "1.0.0" }, "code": "
Code output foes here
" } }注記
functionId
は、必ずどこかに記録しておいてください。これは、リゾルバーに関数をアタッチする際に使用します。 -
リゾルバーを作成するには
-
create-resolver
コマンドを実行してMutation
のパイプライン関数を作成します。この特定のコマンドでは、いくつかのパラメータを入力する必要があります。
-
api-id
の API。 -
type-name
、すなわちスキーマ内の特別なオブジェクトタイプ (クエリ、ミューテーション、サブスクリプション)。 -
field-name
、すなわちリゾルバーをアタッチする特別なオブジェクトタイプ内のフィールドオペレーション。 -
kind
。ユニットまたはパイプラインリゾルバーを指定します。これをPIPELINE
に設定すると、パイプライン関数が有効になります。 -
pipeline-config
、すなわちリゾルバーにアタッチする関数。関数のfunctionId
値がわかっていることを確認してください。リストの順序は重要です。 -
runtime
はAPPSYNC_JS
() でしたJavaScript。runtimeVersion
は現在、1.0.0
です。 -
code
。before および after ステップが含まれています。注記
クエリコードは引数として渡されるファイルにあります。
import { util } from '@aws-appsync/utils'; /** * Sends a request to `put` an item in the DynamoDB data source */ export function request(ctx) { const { id, ...values } = ctx.args; return { operation: 'PutItem', key: util.dynamodb.toMapValues({ id }), attributeValues: util.dynamodb.toMapValues(values), }; } /** * returns the result of the `put` operation */ export function response(ctx) { return ctx.result; }
コマンドの例は、次のようになります。
aws appsync create-resolver \ --api-id abcdefghijklmnopqrstuvwxyz \ --type-name Mutation \ --field-name createPost \ --kind PIPELINE \ --pipeline-config functions=vulcmbfcxffiram63psb4dduoa \ --runtime name=APPSYNC_JS,runtimeVersion=1.0.0 \ --code file:///path/to/file/{filename}.{fileType}
出力は に返されますCLI。例を示します。
{ "resolver": { "typeName": "Mutation", "fieldName": "createPost", "resolverArn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/types/Mutation/resolvers/createPost", "kind": "PIPELINE", "pipelineConfig": { "functions": [ "vulcmbfcxffiram63psb4dduoa" ] }, "maxBatchSize": 0, "runtime": { "name": "APPSYNC_JS", "runtimeVersion": "1.0.0" }, "code": "
Code output goes here
" } } -
-
- CDK
-
ヒント
-
同じプロジェクトに属していると仮定して、ミューテーションを行うには、クエリのようにスタックファイルにミューテーションを追加できます。以下は、テーブルに新しい
Post
を追加するミューテーションの修正済み関数とリゾルバーです。const add_func_2 = new appsync.AppsyncFunction(this, 'func-add-post', { name: 'add_posts_func_1', add_api, dataSource: add_api.addDynamoDbDataSource('table-for-posts-2', add_ddb_table), code: appsync.Code.fromInline(` export function request(ctx) { return { operation: 'PutItem', key: util.dynamodb.toMapValues({id: util.autoId()}), attributeValues: util.dynamodb.toMapValues(ctx.args.input), }; } export function response(ctx) { return ctx.result; } `), runtime: appsync.FunctionRuntime.JS_1_0_0, }); new appsync.Resolver(this, 'pipeline-resolver-create-posts', { add_api, typeName: 'Mutation', fieldName: 'createPost', code: appsync.Code.fromInline(` export function request(ctx) { return {}; } export function response(ctx) { return ctx.prev.result; } `), runtime: appsync.FunctionRuntime.JS_1_0_0, pipelineConfig: [add_func_2], });
注記
このミューテーションとクエリの構造は似ているため、ここではミューテーションを実行するために行った変更について説明します。
関数では、テーブルに追加する事実を反映する
add_posts_func_1
ために、ID CFN を にfunc-add-post
、名前をPosts
に変更しました。データソースでは、addDynamoDbDataSource
メソッドがそれを必要とするtable-for-posts-2
ため、 AWS AppSync コンソールでテーブル (add_ddb_table
) に新しい関連付けを行いました。この新しい関連付けは、以前に作成したのと同じテーブルを引き続き使用していますが、 AWS AppSync コンソールには 2 つの接続があります。1 つはクエリ用table-for-posts
、もう 1 つはミューテーション用ですtable-for-posts-2
。コードは、id
値を自動的に生成し、残りのフィールドのクライアントの入力を受け入れることで、Post
を追加するように変更されました。リゾルバーでは、テーブルに
Posts
を追加していることを反映して ID 値をpipeline-resolver-create-posts
に変更しました。スキーマのミューテーションを反映するため、タイプ名がMutation
に変更され、名前がcreatePost
に変更されました。パイプラインの config は、新しいミューテーション関数add_func_2
に設定されました。
-
この例では、 は GraphQL スキーマから DynamoDB オペレーションに createPost
フィールドで定義された引数 AWS AppSync を自動的に変換します。util.autoId()
ヘルパーを使用して自動的に作成される id
のキーを使用して、DynamoDB にレコードが保存されます。 AWS AppSync コンソールで行われたリクエストまたはそれ以外のリクエストからコンテキスト引数 (ctx.args.input
) に渡した他のすべてのフィールドは、テーブルの属性として保存されます。キーと属性は両方とも、util.dynamodb.toMapValues(values)
ヘルパーを使用して互換性のある DynamoDB 形式に自動的にマッピングされます。
AWS AppSync は、リゾルバーを編集するためのテストおよびデバッグワークフローもサポートしています。モック context
オブジェクトを使用して、呼び出す前にテンプレートでの変換後の値を確認できます。また、クエリを実行する際にデータソースへのリクエスト全体をインタラクティブに表示することもできます。詳細については、「リゾルバーのテストとデバッグ (JavaScript)」および「モニタリングとログ記録」を参照してください。
高度なリゾルバー
「スキーマの設計」のオプションのページネーションセクションに従っている場合でも、ページネーションを利用するにはリゾルバーをリクエストに追加する必要があります。この例では、getPosts
と呼ばれるクエリページネーションを使用して、リクエストされた内容の一部だけを一度に返します。このフィールドのリゾルバーのコードは以下のようになります。
/** * Performs a scan on the dynamodb data source */ export function request(ctx) { const { limit = 20, nextToken } = ctx.args; return { operation: 'Scan', limit, nextToken }; } /** * @returns the result of the `put` operation */ export function response(ctx) { const { items: posts = [], nextToken } = ctx.result; return { posts, nextToken }; }
リクエストでは、リクエストのコンテキストを渡します。の limit
は 20
。つまり、最初のクエリPosts
では最大 20 を返します。nextToken
カーソルはデータソースの最初の Post
エントリに固定されています。これらは args に渡されます。その後、リクエストは最初の Post
からスキャン制限数までスキャンを実行します。データソースは結果をコンテキストに保存し、その結果はレスポンスに渡されます。レスポンスは取得した Posts
を返し、nextToken
が制限数直後の Post
エントリに設定されます。次のリクエストも送信され、まったく同じ処理が行われますが、最初のクエリの直後のオフセットから開始されます。これらの種類のリクエストは、並列ではなくシーケンシャルに行われることに注意してください。