基本的なクエリの作成 (JavaScript)
GraphQL リゾルバーは、タイプのスキーマのフィールドをデータソースに接続します。リゾルバーはリクエストを実行するメカニズムです。
AWS AppSync のリゾルバーは、JavaScript を使用して GraphQL 表現をデータソースで使用できる形式に変換します。または、マッピングテンプレートを Apache Velocity Template Language (VTL)
このセクションでは、JavaScript を使用してリゾルバーを設定する方法を説明します。「リゾルバーのチュートリアル (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 マネジメントコンソール にサインインして、AppSync コンソール
を開きます。 -
API ダッシュボードで、GraphQL API を選択します。
-
サイドバーで [スキーマ] を選択します。
-
-
スキーマとデータソースの詳細を入力します。詳細については、「スキーマの設計」と「データソースを追加する」の各セクションを参照してください。
-
[スキーマ] エディターの横に [リゾルバー] という名前のウィンドウがあります。このボックスには、[スキーマ] ウィンドウで定義されているタイプとフィールドのリストが含まれています。フィールドにはリゾルバーをアタッチできます。ほとんどの場合、フィールド処理にリゾルバーをアタッチすることになります。このセクションでは、簡単なクエリの設定について説明します。[クエリ] 型で、クエリのフィールドの横にある [アタッチ] を選択します。
-
[リゾルバーをアタッチ] ページの [リゾルバータイプ] で、パイプラインリゾルバーとユニットリゾルバーのどちらかを選択できます。これらのリゾルバータイプの詳細については、「リゾルバー」を参照してください。このガイドでは
pipeline resolversを使用します。ヒント
パイプラインリゾルバーを作成すると、データソースがパイプライン関数にアタッチされます。関数は、パイプラインリゾルバー自体を作成した後に作成されます。そのため、このページにはこれを設定するオプションはありません。ユニットリゾルバーを使用する場合は、データソースがリゾルバーに直接関連付けられるため、このページで設定します。
[リゾルバーランタイム] では、[
APPSYNC_JS] を選択して JavaScript ランタイムを有効化します。 -
この API のキャッシュは有効にできます。現時点では、この機能をオフにすることをお勧めします。[作成] を選択します。
-
[リゾルバーを編集] ページには、リゾルバーハンドラーとレスポンス (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にリゾルバーをアタッチします。リクエスト関数はテーブルのデータをリクエストし、テーブルはそのレスポンスを context (ctx) に渡して、レスポンスは結果を context に返します。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 の
api-idです。 -
AWS AppSync コンソールの関数の
name。 -
data-source-name、すなわち関数で使用されるデータソースの名前。すでに作成され、AWS AppSync サービス内の GraphQL API にリンクされている必要があります。 -
runtime、すなわち関数の環境と言語。JavaScript の場合、name はAPPSYNC_JSで、runtime は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 の
api-idです。 -
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
-
ヒント
CDK を使用する前に、CDK の公式ドキュメントと AWS AppSync の CDK リファレンスを確認することをお勧めします。
以下の手順では、特定のリソースを追加するために使用するスニペットの一般的な例のみを示しています。これは本番稼働用コードで機能するソリューションとなることを意図したものではありません。また、動作するアプリが既にあることを前提としています。
基本的なアプリには以下のものが必要です。
-
サービス import ディレクティブ
-
スキーマのコード
-
データソースジェネレーター
-
関数コード
-
リゾルバーのコード
「スキーマの設計」と「データソースを追加する」の各セクションによれば、スタックファイルには以下の形式の import ディレクティブが含まれます。
import * asxfrom '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キーワードの後にappsync.GraphqlApi(scope: Construct, id: string , props: GraphqlApiProps)を続けて新しい GraphQL API が追加されています。スコープはthisで、CFN ID がgraphQL-exampleで、props はmy-first-api(コンソールに表示される API の名前) およびschema.graphql(スキーマファイルへの絶対パス) です。データソースを追加するには、まずデータソースをスタックに追加する必要があります。次に、ソース固有のメソッドを使用して GraphQL API に関連付ける必要があります。この関連付けは、リゾルバー関数を作成したときに行われます。その間に、
dynamodb.Tableを使用して DynamoDB テーブルを作成する例を見てみましょう。const add_ddb_table = new dynamodb.Table(this, 'posts-table', { partitionKey: { name: 'id', type: dynamodb.AttributeType.STRING, }, });注記
この例でこれを使用すると、CFN ID が
posts-tableで、パーティションキーがid (S)という新しい DynamoDB テーブルが追加されます。次に、スタックファイルにリゾルバーを実装する必要があります。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で、CFN ID がfunc-get-postsで、props には実際に関数の詳細が含まれています。props 内には以下が含まれています。-
AWS AppSync コンソール (
get_posts_func_1) に表示される関数のname。 -
以前に作成した GraphQL API (
add_api)。 -
データソース。これは、データソースを GraphQL API 値にリンクし、それを関数にアタッチするポイントです。作成したテーブル (
add_ddb_table) を取得し、GraphqlApiメソッド (addDynamoDbDataSource) のいずれかを使用して GraphQL API (add_api) にアタッチします。ID 値 (table-for-posts) は AWS AppSync コンソールに表示されるデータソースの名前です。ソース固有のメソッドの一覧については、次のページを参照してください。 -
コードには関数のリクエストハンドラーとレスポンスハンドラーが含まれており、シンプルなスキャンを実行し、結果を返します。
-
ランタイムでは、APPSYNC_JS ランタイムバージョン 1.0.0 を使用することを指定しています。現在 APPSYNC_JS で使用できるのはこのバージョンだけであることに注意してください。
次に、関数をパイプラインリゾルバーにアタッチする必要があります。リゾルバーは次の形式で作成しています。
Resolver(scope: Construct, id: string, props: ResolverProps)スコープは
thisで、CFN ID がpipeline-resolver-get-postsで、props には実際に関数の詳細が含まれています。props 内には以下が含まれています。-
以前に作成した GraphQL API (
add_api)。 -
特別なオブジェクトタイプ名。これはクエリオペレーションであり、
Query値を追加しただけです。 -
フィールド名 (
getPost) は、Queryタイプのスキーマ内にあるフィールドの名前です。 -
コードには before ハンドラーと after ハンドラーが含まれています。この例では、関数がオペレーションを実行した後の context 内の結果を返すだけです。
-
ランタイムでは、APPSYNC_JS ランタイムバージョン 1.0.0 を使用することを指定しています。現在 APPSYNC_JS で使用できるのはこのバージョンだけであることに注意してください。
-
パイプライン config には、作成した関数 (
add_func) への参照が含まれています。
-
この例では、リクエストおよびレスポンスのハンドラーを実装する AWS AppSync 関数のオペレーションの内容を確認しました。この関数はデータソースとやりとりする役割を持っています。リクエストハンドラーは AWS AppSync に Scan オペレーションを送信し、DynamoDB データソースに対して実行するオペレーションを指示します。レスポンスハンドラーは項目のリスト (ctx.result.items) を返します。その後、項目のリストは Post GraphQL タイプに自動的にマッピングされました。
基本的なミューテーションリゾルバーの作成
このセクションでは、基本的なミューテーションリゾルバーを作成する方法を説明します。
- Console
-
-
AWS マネジメントコンソール にサインインして、AppSync コンソール
を開きます。 -
API ダッシュボードで、GraphQL API を選択します。
-
サイドバーで [スキーマ] を選択します。
-
-
[リゾルバー] セクションと[ミューテーションタイプ] で、フィールドの横にある [アタッチ] を選択します。
注記
この例では、
createPostのリゾルバーをアタッチすることで、Postオブジェクトをテーブルに追加します。前のセクションと同じ DynamoDB テーブルを使用していると仮定します。そのパーティションキーはidに設定されており、空です。 -
[リゾルバーをアタッチ] ページの [リゾルバータイプ] で、[
pipeline resolvers] を選択します。リゾルバーの詳細を確認する場合は、こちらを参照してください。[リゾルバーランタイム] では、[APPSYNC_JS] を選択して JavaScript ランタイムを有効化します。 -
この API のキャッシュは有効にできます。現時点では、この機能をオフにすることをお勧めします。[作成] を選択します。
-
[関数の追加] を選択して、[新しい関数を作成] を選択します。代わりに [関数の作成] ボタンが表示されて選択できる場合もあります。
-
データソースを選択します。これは、ミューテーション時にデータを操作する際のソースになります。
-
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 の
api-idです。 -
AWS AppSync コンソールの関数の
name。 -
data-source-name、すなわち関数で使用されるデータソースの名前。すでに作成され、AWS AppSync サービス内の GraphQL API にリンクされている必要があります。 -
runtime、すなわち関数の環境と言語。JavaScript の場合、name はAPPSYNC_JSで、runtime は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 の
api-idです。 -
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
-
ヒント
CDK を使用する前に、CDK の公式ドキュメントと AWS AppSync の 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], });注記
このミューテーションとクエリの構造は似ているため、ここではミューテーションを実行するために行った変更について説明します。
この関数では、テーブルに
Postsを追加していることを反映して CFN ID をfunc-add-postに、名前をadd_posts_func_1に変更しました。データソースでは、addDynamoDbDataSourceメソッドでの要求に応じて、AWS AppSync コンソールでtable-for-posts-2としてテーブル (add_ddb_table) に新しい関連付けを行いました。この新しい関連付けでは以前に作成した同じテーブルを引き続き使用していますが、AWS AppSync コンソールには、table-for-postsとしてのクエリ用の接続と、table-for-posts-2としてのミューテーション用の接続の 2 つの接続が存在します。コードは、id値を自動的に生成し、残りのフィールドのクライアントの入力を受け入れることで、Postを追加するように変更されました。リゾルバーでは、テーブルに
Postsを追加していることを反映して ID 値をpipeline-resolver-create-postsに変更しました。スキーマのミューテーションを反映するため、タイプ名がMutationに変更され、名前がcreatePostに変更されました。パイプラインの config は、新しいミューテーション関数add_func_2に設定されました。
-
この例では、AWS AppSync によって、createPost フィールドで定義されている引数を GraphQL スキーマから DynamoDB オペレーションに自動的に変換します。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 で、最初のクエリでは最大 20 Posts を返します。nextToken カーソルはデータソースの最初の Post エントリに固定されています。これらは args に渡されます。その後、リクエストは最初の Post からスキャン制限数までスキャンを実行します。データソースは結果をコンテキストに保存し、その結果はレスポンスに渡されます。レスポンスは取得した Posts を返し、nextToken が制限数直後の Post エントリに設定されます。次のリクエストも送信され、まったく同じ処理が行われますが、最初のクエリの直後のオフセットから開始されます。これらの種類のリクエストは、並列ではなくシーケンシャルに行われることに注意してください。