こんにちは、広野です。
AWS AppSync を使用したアプリケーションを開発する機会があり、リゾルバ、主に VTL の書き方に関してまとまった知識が得られたので紹介します。前回からの続きもので、Query の書き方を紹介します。
Amazon DynamoDB に Query する VTL
例えば、AWS AppSync から以下のリクエストを受けたとします。Amazon DynamoDB には適切なデータがある想定です。テーブル名はリゾルバの別の設定 (Data Source) で行います。
- 引数となるパラメータ: パーティションキー pkey、ソートキー skey
- 必要なレスポンス: パーティションキーにマッチし、ソートキーのパラメータとして渡された文字列から始まるデータ全て
今回は受け取ったパーティションキーとソートキーのパラメータをもとに、Query の条件に当てはめます。ソートキーは begins_with のキー条件式を使用します。このサンプルでは、最大 30 件のデータのみ取得するようにしています。
リクエストマッピングテンプレート
{ "version": "2018-05-29", "operation": "Query", "query": { "expression": "#pkey = :pkey AND begins_with (#skey, :skey)", "expressionNames": { "#pkey": "pkey", "#skey": "skey" }, "expressionValues": { ":pkey": $util.dynamodb.toDynamoDBJson($context.arguments.pkey), ":skey": $util.dynamodb.toDynamoDBJson($context.arguments.skey) } }, "limit": $util.defaultIfNull($context.arguments.first, 30), "nextToken": $util.toJson($util.defaultIfNullOrEmpty($context.arguments.after, null)), "consistentRead": false, "select": "ALL_ATTRIBUTES" }
operation には、Query を書きます。これは Amazon DynamoDB に Query するぞ、という意思表示です。
アプリから受け取った引数はマッピングテンプレート内では $context.arguments 内に格納されます。
pkey や skey というアイテム名であれば問題はないのですが、DynamoDB の予約語がアイテム名になっている場合は必ず # や : を使用してエスケープのような処理をしないとクエリが動作しません。おまじない的に、このように書くことをお勧めします。
これで Amazon DynamoDB に Query をかけることができます。
レスポンスマッピングテンプレート
結果は配列に格納されます。戻ってきたデータをそのままアプリ側に戻す書き方です。
$utils.toJson($context.result)
VTL に関しては以下の AWS 公式ドキュメントも必要に応じてご確認ください。
まとめ
いかがでしたでしょうか。
Query は非常によくオペレーションで、キー条件式をいろいろ変えて使うことが多いと思います。あえて紹介するまでもないと思いましたが、一応紹介させて頂きました。
本記事が皆様のお役に立てれば幸いです。