🏃♂️
AppSync(vtl)とLambdaでのDynamoDBアクセスの速度比較
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