Amazon Web Services ブログ

AWS AppSync GraphQL API は JavaScript リゾルバーをサポートしています

2022年11月17日より AWS AppSync では、JavaScript リゾルバーをサポートするようになり、クラウドに公開する前にリゾルバーをテストするためのリゾルバー評価エンジンが提供されます。

2017 年に開始された AWS AppSync は、クラウドで GraphQL API を構築、管理、およびホストできるようにするサービスです。 AWS AppSync では、リゾルバーを使用して GraphQL スキーマをさまざまなデータソースに接続します。リゾルバーとは、 AWS AppSync が GraphQL リクエストを変換し、さまざまなデータソースから情報を取得する方法です。

これまでは、Apache Velocity Template Language (VTL) を使用してリゾルバーを作成しなければならないお客様が多くいらっしゃいました。VTL リゾルバーを作成するために、多くの開発者は新しい言語を学ぶ必要があり、リゾルバーが提供する機能を活用することを躊躇する要因となっていました。また、VTL リゾルバーを作成した場合、開発者は、VTL リゾルバーをどのようにテストするかという課題にも直面していました。そのため、多くのお客様は、複雑なリゾルバーを AWS Lambda 関数として作成し、その関数を呼び出す単純な VTL リゾルバーを作成していました。この新しい Lambda 関数を維持、および運用しなければならないため、アプリケーションはより複雑になります。

AWS AppSync では、GraphQL フィールドでリゾルバーを実行します。アプリケーションでは、単一の GraphQL フィールドを解決するために複数の操作を実行する必要がある場合があります。 AWS AppSync を使用する場合、開発者はパイプラインリゾルバーを作成してオペレーション (関数と呼ばれる) を構成し、それらを順番に実行することができます。各関数は、Amazon DynamoDB テーブルからアイテムを取得するなど、データソースに対して操作を実行します。

関数の仕組み

AWS AppSync JavaScript パイプラインリゾルバーのご紹介
VTL に加えて、開発者は JavaScript を使用して関数を作成できるようになりました。JavaScript で作成された関数と VTL で作成された関数をパイプラインリゾルバー内で混在させることができます。

今回のリリースでは、開発を簡素化するために 2 つの新しい NPM ライブラリが付属しています。@aws-appsync/eslint-plugin では開発中に問題を素早くキャッチして修正し、@aws-appsync/utils ではコードエディタで型検証やオートコンプリートを行います。

開発者は、AWS AppSync の新しい API コマンドである評価コードを使用して JavaScript コードをテストすることができます。テスト中、コードの正確性が検証され、モックデータを使用して評価されます。これにより、開発者は変更をクラウドにプッシュする前にコードを検証できます。

今回のリリースにより、AWS AppSync は、アプリケーションとほぼすべての AWS サービスとを対話する最も簡単な方法の 1 つになります。JavaScript を使用して API エンドポイントを使用して任意の AWS サービスを呼び出す HTTP 関数を作成し、その関数をパイプラインの一部として使用できます。たとえば、GraphQL フィールドのクエリが発生したときに呼び出されるパイプラインリゾルバーを作成することができます。このフィールドは、テーブルに保存されている項目のスペイン語の翻訳テキストを返します。このパイプラインリゾルバーは 2 つの関数で構成されています。1 つは DynamoDB テーブルからデータを取得する関数で、もう 1 つは Amazon Translate API を使用してアイテムのテキストをスペイン語に変換する関数です。

function awsTranslateRequest(Text, SourceLanguageCode, SourceLanguageCode) {
  return {
    method: 'POST',
    resourcePath: '/',
    params: {
      headers: {
        'content-type': 'application/x-amz-json-1.1',
        'x-amz-target': 'AWSShineFrontendService_20170701.TranslateText',
      },
      body: JSON.stringify({ Text, SourceLanguageCode, SourceLanguageCode }),
    },
  };
}

開始方法
JavaScript 関数は、AWS AppSync コンソールまたは AWS コマンドラインインターフェース (CLI) を使用して作成することができます。AWS CLI を使用して既存の DynamoDB テーブルから項目を取得するパイプラインリゾルバーを作成しましょう。このリゾルバーには 1 つの関数しかありません。

新しい AWS AppSync 関数を作成する際には、その関数のコードを指定する必要があります。新しい JavaScript ファイルを作成し、次のコードスニペットをコピーします。

import { util } from '@aws-appsync/utils';

/**
 * Request a single item from the attached DynamoDB table
 * @param ctx the request context
 */
export function request(ctx) {
  return {
    operation: 'GetItem',
    key: util.dynamodb.toMapValues({ id: ctx.args.id }),
  };
}

/**
 * Returns the DynamoDB result directly
 * @param ctx the request context
 */
export function response(ctx) {
  return ctx.result;
}

すべての機能にはリクエストメソッドとレスポンスメソッドが必要で、それぞれのメソッドでビジネスニーズを満たす操作を実行することができます。

開始するには、まず AWS CLI が最新バージョンであること、DynamoDB テーブルが作成されていること、そして AWS AppSync API があることを確認します。その後、AWS CLI 関数作成コマンドと作成したファイルを使用して、AWS AppSync で関数を作成することができます。このコマンドは関数 ID を返します。リゾルバーを作成するには、関数 ID、GraphQL 操作、およびリゾルバーを適用するフィールドを渡します。ドキュメントには、パイプラインリゾルバーの作成方法に関する詳細なチュートリアルがあります。

リゾルバーのテスト
関数をテストするには、AWS CLI または AWS SDK の評価コードコマンドを使用します。このコマンドは、AWS AppSync サービスを呼び出し、指定されたコンテキストを使用してコードを評価します。テストを自動化するには、任意の JavaScript テストおよびアサーションライブラリを使用できます。たとえば、次のコードスニペットでは Jest を使用して、返された結果をプログラムで検証しています。

import * as AWS from 'aws-sdk'
import { readFile } from 'fs/promises'
const appsync = new AWS.AppSync({ region: 'us-east-2' })
const file = './functions/updateItem.js'

test('validate an update request', async () => {
  const context = JSON.stringify({
    arguments: {
      input: { id: '<my-id>', title: 'change!', description: null },
    },
  })
  const code = await readFile(file, { encoding: 'utf8' })
  const runtime = { name: 'APPSYNC_JS', runtimeVersion: '1.0.0' }
  const params = { context, code, runtime, function: 'request' }

  const response = await appsync.evaluateCode(params).promise()
  expect(response.error).toBeUndefined()
  expect(response.evaluationResult).toBeDefined()
  const result = JSON.parse(response.evaluationResult)
  expect(result.key.id.S).toEqual(context.arguments.input.id)
  expect(result.update.expressionNames).not.toHaveProperty('#id')
  expect(result.update.expressionNames).toHaveProperty('#title')
  expect(result.update.expressionNames).toHaveProperty('#description')
  expect(result.update.expressionValues).not.toHaveProperty(':description')
})

このようにして、API テストをビルドプロセスに追加し、変更をクラウドにプッシュする前にリゾルバーを正しくコーディングしたことを検証できます。

今すぐ使用開始いただけます
AWS AppSync の JavaScript AWS AppSync リゾルバーのサポートは、現在 AWS AppSync をサポートしているすべてのリージョンで利用可能です 。この機能は、AWS マネジメントコンソール、AWS CLI、または Amazon CloudFormation から今すぐ使い始めることができます。

このリリースの詳細については、AWS AppSync サービスのページをご覧ください。

— Marcia

原文はこちらです。