😍

AppSyncがJavaScriptのリゾルバに対応したので試す

2022/11/18に公開

AppSyncがvtlではなく、JavaScriptのリゾルバに対応したとのニュースが出ていました。
早速コンソールから試してみたところ、諸々変わっていたので、触ってみたいと思います。

https://aws.amazon.com/jp/blogs/aws/aws-appsync-graphql-apis-supports-javascript-resolvers/

結論

コンソールから設定する場合のデフォルトはvtlからJavaScriptに移行したようです。
シンプルなDynamoDBのテーブルを作成して、getのリクエストのみを検証したところ、
vtlは50ms程度、JavaScriptは100ms程度でした。

パイプラインありとなしで検証したところ、ネックになりそうなのはパイプラインでした。
パイプラインでvtlとjavascriptの速度を比較したところ、ほとんど差分はありませんでした。

パイプラインに載せると70ms程度の上乗せが発生するので、その値を許容できるかどうかが焦点になりそうです。

詳細

事前準備

適当にDynamoDBのテーブルとlambdaを作成しておきます。
今回はsampleというDynamoDBをpartition keyをpKeyにして作成しています。

構築

AppSyncのコンソールを開いて、APIを作成を選択後、一から構築を選んで「開始」をします。

API名はそのままで作成します。
まずはデータソースを作成します。
自動作成されるものも見たいので、「GraphQL を自動的に生成する」にチェックを入れています。

作成後、スキーマをみて、まず作成されたDynamo_Sampleのリゾルバを見てみます。

試しにcreateSampleを見てみたのですが、デフォルトはvtlのままのようです。

getSampleと同じ引数にもつgetSample2を作ってみて、動作を確認します。

	getSample2(pKey: String!): Sample

リゾルバを選択すると、デフォルトがパイプラインになっている、かつjavascriptになっていますね。

リゾルバには修正が必要にないと思うので、「関数を作成」を選択します。

データソースにDynamodb_Sampleを選択して、コードを書いていきます。
vtlの時と違ってサンプルがないのがちょっと不便ですね。
関数コードの部分は最初のリンクにあったコードになぞって記載します。

/**
 * Available AppSync utilities that you can use in your request and response handler.
 */
import { util } from '@aws-appsync/utils';

/**
 * Handles an incoming request and converts it into a request object for the
 * selected data source operation.
 * Find code samples at https://github.com/aws-samples/aws-appsync-resolver-samples
 * @param ctx contextual information for your resolver invocation
 * @returns a data source request object
 */
export function request(ctx) {
  return {
    operation: 'GetItem',
    key: util.dynamodb.toMapValues({ pKey: ctx.args.pKey }),
  };
}

/**
 * Handles the response from your data source.
 * Find code samples at https://github.com/aws-samples/aws-appsync-resolver-samples
 * @param ctx contextual information for your resolver invocation
 * @returns a result that is passed to the next function, or the response handler of the pipeline resolver
 */
export function response(ctx) {
    return ctx.result;
}

関数を作成後、関数を追加して、パイプラインにくっつけて作成します。

実行してみる

一通り準備ができたので、クエリを実行してみます。

割と一瞬で終わったので、lambdaを返すよりは圧倒的に早いように思えます。
せっかくなので、ログも見てみます。
3回くらい試してみたのですが、vtlのほうが半分くらいの速度のように思えます。

type duration
vlt 57ms
JavaScript 128ms
ログ
{
    "duration": 57082706,
    "logType": "ExecutionSummary",
    "requestId": "c8e0967e-6392-4683-9790-75c2dfd54f6b",
    "startTime": "2022-11-18T00:48:23.307181Z",
    "endTime": "2022-11-18T00:48:23.364263Z",
    "parsing": {
        "startOffset": 42814,
        "duration": 31553
    },
    "version": 1,
    "validation": {
        "startOffset": 118446,
        "duration": 71206
    },
    "graphQLAPIId": "xxx"
}
{
    "duration": 128935434,
    "logType": "ExecutionSummary",
    "requestId": "efbdba3b-1495-46a4-9b42-115692774004",
    "startTime": "2022-11-18T01:00:19.580119Z",
    "endTime": "2022-11-18T01:00:19.709053Z",
    "parsing": {
        "startOffset": 32263,
        "duration": 23297
    },
    "version": 1,
    "validation": {
        "startOffset": 82354,
        "duration": 47365
    },
    "graphQLAPIId": "xxx"
}

追加検証

パイプラインが遅いのではという仮説があったので、パイプラインでvtlのものも作成して比較しました。
この場合だとvtlとjavascriptで差が出ないので、パイプラインがあるかどうかの差分のようです。
パイプラインがない状態でもjavascriptで書けるようになったら一番いいですね。

type pipeline duration
vlt no 51ms
vlt yes 125ms
JavaScript yes 124ms

おわりに

速度はちょっと遅くなりますが、圧倒的に書きやすくなるので、AppSyncでテンプレート以外のことをしたい場合はjavascriptへと移行していくのではないでしょうか。

Discussion