🏃♂️
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