🏃‍♂️

AppSync(vtl)とLambdaでのDynamoDBアクセスの速度比較

2021/11/25に公開

AppSyncでDynamoDBにアクセスするには、vtlを記述する方法とLambdaを経由する方法があります。
Lambdaを経由したほうが遅いのは感覚的にわかるのですが、実際にどのくらい時間がかかるのか計測してみました。

結論

データ1件のテーブルをGetで取得してみました。
AppSyncのほうが予想していたよりだいぶ早いです。

  • AppSync 約100ms
  • Lambda 約700ms + コールドスタートの約200ms

前提条件

計測にはCloudWatch logsに出力している情報を利用します。
AppSyncはConsoleから、Lambdaはtestのボタンから実行しています。

DynamoDB

  • テーブルを作成して、データを1件用意しました。
  • フィールドはid(partition key, string)とtest(string)のみ

AppSync

  • API Key
  • getTestに対してDynamoDBのテーブルをgetするように作成
  • ログはすべて出力するように設定

リクエストマッピングテンプレート

{
    "version": "2017-02-28",
    "operation": "GetItem",
    "key": {
        "id": $util.dynamodb.toDynamoDBJson($ctx.args.id),
    }
}

クエリ

query MyQuery {
  getTest(id: "1") {
    id
  }
}

Lambda

  • nodejsのデフォルトで実行
  • コンソール上でソースを書いた
index.js
const DynamoDB = require('aws-sdk/clients/dynamodb');

exports.handler = async (event) => {
    console.log("start");
    const client = new DynamoDB.DocumentClient({
        region: 'ap-northeast-1'
    });
    
    const value = await client.get({
        TableName: 'test',
        Key: {
            id: '1'
        },
    }).promise();
    
    console.log("end");
    return value.id;
};

実行結果

AppSyncの場合

  • ログに出ているBeginからEndまで114msだった。
  • 念のため、ブラウザから実行しているリクエストをみてみたが、163msだったのでそんなに違和感はない。
ログの抜粋
2021-11-25T05:51:51.782+09:00 fe96e4c0-6e54-4866-b75c-a93395f48ec3 Begin Request
2021-11-25T05:51:51.896+09:00 fe96e4c0-6e54-4866-b75c-a93395f48ec3 End Request

Lambdaの場合

  • ログに出ているSTARTからENDまで738msだった。
  • Reportに出ているように、コールドスタートの場合は272msさらにかかっている。
  • ブラウザから実行しているリクエストだと1.18秒かかっていた。
ログの抜粋
2021-11-25T05:54:51.954+09:00 START RequestId: f1ecc995-41d8-4c8d-93b9-1c9b6e643682 Version: $LATEST
2021-11-25T05:54:52.692+09:00 END RequestId: f1ecc995-41d8-4c8d-93b9-1c9b6e643682
2021-11-25T05:54:52.692+09:00 REPORT RequestId: f1ecc995-41d8-4c8d-93b9-1c9b6e643682	Duration: 733.20 ms	Billed Duration: 734 ms	Memory Size: 128 MB	Max Memory Used: 69 MB	Init Duration: 272.86 ms

結論

AppSyncから直接データを取得できるのであれば、Lambdaを経由する理由は全くない。
Lambdaで処理が必要な条件があるのなら、先に処理しておいて、DynamoDBに格納しておくことを検討したほうがよさそうですね。

Discussion