基本的なクエリの作成 (JavaScript) - AWS AppSync

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

基本的なクエリの作成 (JavaScript)

GraphQL リゾルバーは、タイプのスキーマのフィールドをデータソースに接続します。リゾルバーはリクエストを実行するメカニズムです。

GraphQL 式をデータソースが使用できる形式に変換 JavaScript するために AWS AppSync 使用されているリゾルバー。または、マッピングテンプレートを Apache Velocity Template Language (VTL) で記述して、GraphQL 式をデータソースで使用できる形式に変換することもできます。

このセクションでは、 を使用してリゾルバーを設定する方法について説明します 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
  1. にサインイン AWS Management Console し、AppSyncコンソール を開きます。

    1. APIs ダッシュボード で、GraphQL を選択しますAPI。

    2. サイドバー[スキーマ] を選択します。

  2. スキーマとデータソースの詳細を入力します。詳細については、「スキーマの設計」と「データソースを追加する」の各セクションを参照してください。

  3. [スキーマ] エディターの横に [リゾルバー] という名前のウィンドウがあります。このボックスには、[スキーマ] ウィンドウで定義されているタイプとフィールドのリストが含まれています。フィールドにはリゾルバーをアタッチできます。ほとんどの場合、フィールド処理にリゾルバーをアタッチすることになります。このセクションでは、簡単なクエリの設定について説明します。[クエリ] 型で、クエリのフィールドの横にある [アタッチ] を選択します。

  4. [リゾルバーをアタッチ] ページの [リゾルバータイプ] で、パイプラインリゾルバーとユニットリゾルバーのどちらかを選択できます。これらのリゾルバータイプの詳細については、「リゾルバー」を参照してください。このガイドでは pipeline resolvers を使用します。

    ヒント

    パイプラインリゾルバーを作成すると、データソースがパイプライン関数にアタッチされます。関数は、パイプラインリゾルバー自体を作成した後に作成されます。そのため、このページにはこれを設定するオプションはありません。ユニットリゾルバーを使用する場合は、データソースがリゾルバーに直接関連付けられるため、このページで設定します。

    Resolver ランタイム では、 JavaScript ランタイムを有効にするAPPSYNC_JSを選択します。

  5. この のキャッシュを有効にできますAPI。現時点では、この機能をオフにすることをお勧めします。[Create] (作成) を選択します。

  6. [リゾルバーを編集] ページには、リゾルバーハンドラーとレスポンス (before および after ステップ) のロジックを実装できるリゾルバーコードというコードエディターがあります。詳細については、JavaScript「リゾルバーの概要」を参照してください。

    注記

    この例では、リクエストを空白のままにし、context からの最後のデータソース結果を返すようにレスポンスを設定します。

    import {util} from '@aws-appsync/utils'; export function request(ctx) { return {}; } export function response(ctx) { return ctx.prev.result; }

    このセクションの下には、[関数] というテーブルがあります。[関数] では、複数のリゾルバーで再利用できるコードを実装できます。コードを絶えず書き換えたりコピーしたりする代わりに、ソースコードを関数として保存し、必要なときにいつでもリゾルバーに追加できます。

    関数はパイプラインのオペレーションリストの大部分を構成します。リゾルバーで複数の関数を使用する場合、関数の順序を設定すると、関数はその順序で順番に実行されます。これらの関数は、リクエスト関数の実行後、レスポンス関数の開始前に実行されます。

    新しい関数を追加するには、[関数][関数を追加][新しい関数の作成] の順に選択します。代わりに [関数の作成] ボタンが表示されて選択できる場合もあります。

    1. データソースを選択します。これがリゾルバーの処理対象となるデータソースになります。

      注記

      この例では、idPost オブジェクトを取得する getPost にリゾルバーをアタッチします。このスキーマ用の DynamoDB テーブルをすでにセットアップ済みであると仮定します。そのパーティションキーは id に設定されており、空です。

    2. Function name を入力します。

    3. [関数コード] で、関数の動作を実装する必要があります。わかりにくいかもしれませんが、各関数には独自のローカルのリクエストハンドラーとレスポンスハンドラーがあります。リクエストが実行され、次にデータソース呼び出しが実行されてリクエストが処理され、データソースのレスポンスがレスポンスハンドラーによって処理されます。結果は 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 は最後に実行されたオペレーションの結果であるリクエストハンドラーを返します。

    4. 完了したら、[作成] を選択します。

  7. リゾルバー画面に戻り、[関数][関数を追加] ドロップダウンを選択して、関数を関数リストに追加します。

  8. [保存] を選択してリゾルバーを更新します。

CLI

関数を追加するには

  • create-function コマンドを使用してパイプラインリゾルバー用の関数を作成します。

    この特定のコマンドでは、いくつかのパラメータを入力する必要があります。

    1. api-id の API。

    2. AWS AppSync コンソール内の 関数nameの 。

    3. data-source-name、すなわち関数で使用されるデータソースの名前。 AWS AppSync サービスAPIで GraphQL に既に作成およびリンクされている必要があります。

    4. runtime、すなわち関数の環境と言語。の場合 JavaScript、名前は APPSYNC_JSで、ランタイムは である必要があります1.0.0

    5. 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 のパイプライン関数を作成します。

    この特定のコマンドでは、いくつかのパラメータを入力する必要があります。

    1. api-id の API。

    2. type-name、すなわちスキーマ内の特別なオブジェクトタイプ (クエリ、ミューテーション、サブスクリプション)。

    3. field-name、すなわちリゾルバーをアタッチする特別なオブジェクトタイプ内のフィールドオペレーション。

    4. kind。ユニットまたはパイプラインリゾルバーを指定します。これを PIPELINE に設定すると、パイプライン関数が有効になります。

    5. pipeline-config、すなわちリゾルバーにアタッチする関数。関数の functionId 値がわかっていることを確認してください。リストの順序は重要です。

    6. runtimeAPPSYNC_JS () でしたJavaScript。runtimeVersion は現在、1.0.0 です。

    7. 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リファレンスを確認することをお勧めします。

以下の手順では、特定のリソースを追加するために使用するスニペットの一般的な例のみを示しています。これは本番稼働用コードで機能するソリューションとなることを意図したものではありません。また、動作するアプリが既にあることを前提としています。

基本的なアプリには以下のものが必要です。

  1. サービス import ディレクティブ

  2. スキーマのコード

  3. データソースジェネレーター

  4. 関数コード

  5. リゾルバーのコード

スキーマの設計」と「データソースを追加する」の各セクションによれば、スタックファイルには以下の形式の 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_apinewキーワードの後に が続く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 CFNposts-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 コンソール () に存在する関数nameget_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
  1. にサインイン AWS Management Console し、AppSyncコンソール を開きます。

    1. APIs ダッシュボード で、GraphQL を選択しますAPI。

    2. サイドバー[スキーマ] を選択します。

  2. [リゾルバー] セクションと[ミューテーションタイプ] で、フィールドの横にある [アタッチ] を選択します。

    注記

    この例では、createPost のリゾルバーをアタッチすることで、Post オブジェクトをテーブルに追加します。前のセクションと同じ DynamoDB テーブルを使用していると仮定します。そのパーティションキーは id に設定されており、空です。

  3. [リゾルバーをアタッチ] ページの [リゾルバータイプ] で、[pipeline resolvers] を選択します。リゾルバーの詳細を確認する場合は、こちらを参照してください。Resolver ランタイム では、 JavaScript ランタイムを有効にするAPPSYNC_JSことを選択します。

  4. この のキャッシュを有効にできますAPI。現時点では、この機能をオフにすることをお勧めします。[Create] (作成) を選択します。

  5. [関数の追加] を選択して、[新しい関数を作成] を選択します。代わりに [関数の作成] ボタンが表示されて選択できる場合もあります。

    1. データソースを選択します。これは、ミューテーション時にデータを操作する際のソースになります。

    2. Function name を入力します。

    3. [関数コード] で、関数の動作を実装する必要があります。これはミューテーションであるため、リクエストにより、呼び出されたデータソースに対してある程度状態が変化するオペレーションが実行されると理想的です。結果はレスポンス関数によって処理されます。

      注記

      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; }

      このステップでは、requestresponse の 2 つの関数を追加しました。

      • request: リクエストハンドラーはコンテキストを引数として受け入れます。リクエストハンドラーの return ステートメントは、組み込みの DynamoDB オペレーションである PutItem コマンドを実行します (例については、こちらまたはこちらを参照してください)。PutItem このコマンドは、パーティション key 値 (util.autoid() によって自動的に生成) とコンテキストの引数の入力による attributes (リクエストで渡される値) を取得して、Post オブジェクトを DynamoDB テーブルに追加します。key は、id で、attributesdate および title フィールド引数です。どちらも util.dynamodb.toMapValuesヘルパーを経由して実行され、DynamoDB テーブルを使用します。

      • response: レスポンスは、更新されたコンテキストを受け入れ、リクエストハンドラーの結果を返します。

    4. 完了したら、[作成] を選択します。

  6. リゾルバー画面に戻り、[関数][関数を追加] ドロップダウンを選択して、関数を関数リストに追加します。

  7. [保存] を選択してリゾルバーを更新します。

CLI

関数を追加するには

  • create-function コマンドを使用してパイプラインリゾルバー用の関数を作成します。

    この特定のコマンドでは、いくつかのパラメータを入力する必要があります。

    1. api-id の API。

    2. AWS AppSync コンソール内の 関数nameの 。

    3. data-source-name、すなわち関数で使用されるデータソースの名前。 AWS AppSync サービスAPIで GraphQL に既に作成およびリンクされている必要があります。

    4. runtime、すなわち関数の環境と言語。の場合 JavaScript、名前は APPSYNC_JSで、ランタイムは である必要があります1.0.0

    5. 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 のパイプライン関数を作成します。

    この特定のコマンドでは、いくつかのパラメータを入力する必要があります。

    1. api-id の API。

    2. type-name、すなわちスキーマ内の特別なオブジェクトタイプ (クエリ、ミューテーション、サブスクリプション)。

    3. field-name、すなわちリゾルバーをアタッチする特別なオブジェクトタイプ内のフィールドオペレーション。

    4. kind。ユニットまたはパイプラインリゾルバーを指定します。これを PIPELINE に設定すると、パイプライン関数が有効になります。

    5. pipeline-config、すなわちリゾルバーにアタッチする関数。関数の functionId 値がわかっていることを確認してください。リストの順序は重要です。

    6. runtimeAPPSYNC_JS () でしたJavaScript。runtimeVersion は現在、1.0.0 です。

    7. 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], });
    注記

    このミューテーションとクエリの構造は似ているため、ここではミューテーションを実行するために行った変更について説明します。

    関数では、テーブルに追加する事実を反映する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 }; }

リクエストでは、リクエストのコンテキストを渡します。の limit20。つまり、最初のクエリPostsでは最大 20 を返します。nextToken カーソルはデータソースの最初の Post エントリに固定されています。これらは args に渡されます。その後、リクエストは最初の Post からスキャン制限数までスキャンを実行します。データソースは結果をコンテキストに保存し、その結果はレスポンスに渡されます。レスポンスは取得した Posts を返し、nextToken が制限数直後の Post エントリに設定されます。次のリクエストも送信され、まったく同じ処理が行われますが、最初のクエリの直後のオフセットから開始されます。これらの種類のリクエストは、並列ではなくシーケンシャルに行われることに注意してください。