AppSyncがJavaScriptのリゾルバに対応したので試す
AppSyncがvtlではなく、JavaScriptのリゾルバに対応したとのニュースが出ていました。
早速コンソールから試してみたところ、諸々変わっていたので、触ってみたいと思います。
結論
コンソールから設定する場合のデフォルトは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