AWS AppSync リゾルバ (VTL) の書き方サンプル No.2 – Amazon DynamoDB BatchGetItem

こんにちは、広野です。

AWS AppSync を使用したアプリケーションを開発する機会があり、リゾルバ、主に VTL の書き方に関してまとまった知識が得られたので紹介します。前回の続きもので、BatchGetItem の書き方を紹介します。

本記事では、VTL の書き方にフォーカスしています。ご了承ください。
AWS AppSync、リゾルバ、VTL の説明については以下の記事をご覧下さい。

Amazon DynamoDB に BatchGetItem する VTL

例えば、AWS AppSync から以下のリクエストを受けたとします。Amazon DynamoDB には適切なデータがある想定です。テーブル名はリゾルバの別の設定 (Data Source) で行います。

  • 引数となるパラメータ: パーティションキー pkey、ソートキー skey
  • 必要なレスポンス: data1, data2 という属性の値、ただし予め決まったルールで2アイテム分のデータが必要

今回は受け取った1つのソートキーパラメータを加工して、2種類のソートキーを VTL で作成します。
もちろん最初から引数として2つのソートキーを渡すこともできますし、パーティションキーを変えてもいいです。いずれにしても、同じテーブルに対して複数の GetItem を 1回のクエリで取得したいときに便利で、かつアプリに結果を戻すときに複数のクエリ結果を融合して返すことが可能です。

マッピングテンプレートは JSON 形式で記述します。その中に VTL が混在する感じです。

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

#set($skey1 = "skey1#"+$context.arguments.skey)
#set($skey2 = "skey2#"+$context.arguments.skey)
{
  "version": "2018-05-29",
  "operation": "BatchGetItem",
  "tables": {
    "DynamoDBTableName": {
      "keys": [
        {
          "pkey": $util.dynamodb.toDynamoDBJson($context.arguments.pkey),
          "skey": $util.dynamodb.toDynamoDBJson($skey1)
        },
        {
          "pkey": $util.dynamodb.toDynamoDBJson($context.arguments.pkey),
          "skey": $util.dynamodb.toDynamoDBJson($skey2)
        }
      ]
    }
  }
}

operation には、BatchGetItem を書きます。これは Amazon DynamoDB に BatchGetItem をするぞ、という意思表示です。

DynamDB テーブル名も入れる必要があります。DynamoDBTableName の部分は、実際にクエリをかけるテーブル名に書き換えます。

アプリから受け取った引数はマッピングテンプレート内では $context.arguments 内に格納されます。keys に受け取った引数を埋め込みたいのですが、ここでは、pkey はそのまま。skey に対してテンプレート冒頭で #set() で値を2種類に加工しています。変数名は $skey1, $skey2 にしています。加工後の変数を BatchGetItem のソートキーの引数として指定していると思って下さい。

これで Amazon DynamoDB に GetItem をかけることができます。

レスポンスマッピングテンプレート

2つの GetItem が行われた結果は実行順に配列に格納されます。値を取り出して、任意の JSON データ構造にして返すことになります。

$util.toJson({
  "skey1data1": $context.result.data.DynamoDBTableName[0].data1
  "skey1data2": $context.result.data.DynamoDBTableName[0].data2
  "skey2data1": $context.result.data.DynamoDBTableName[1].data1
  "skey2data2": $context.result.data.DynamoDBTableName[1].data2
})

VTL に関しては以下の AWS 公式ドキュメントも必要に応じてご確認ください。

まとめ

いかがでしたでしょうか。

BatchGetItem の使い方は他にもあると思いますが、今回は単純に2つのGetItemをベタに書く方法を紹介いたしました。

Amazon DynamoDB への BatchGetItem が必要となる局面はあると思います。是非、何ができるか押さえておいて、必要になったときの引き出しとして持っておいて頂けたらと思います。

本記事が皆様のお役に立てれば幸いです。

著者について
広野 祐司

AWS サーバーレスアーキテクチャを駆使して社内クラウド人材育成アプリとコンテンツづくりに勤しんでいます。React で SPA を書き始めたら快適すぎて、他の言語には戻れなくなりました。サーバーレス & React 仲間を増やしたいです。AWSは好きですが、それよりもAWSすげー!って気持ちの方が強いです。
取得資格:AWS 認定は12資格、ITサービスマネージャ、ITIL v3 Expert 等
2020 - 2023 Japan AWS Top Engineer 受賞
2022 - 2023 Japan AWS Ambassador 受賞
2023 当社初代フルスタックエンジニア認定
好きなAWSサービス:AWS Amplify / AWS AppSync / Amazon Cognito / AWS Step Functions / AWS CloudFormation

広野 祐司をフォローする
クラウドに強いによるエンジニアブログです。
SCSKは専門性と豊富な実績を活かしたクラウドサービス USiZE(ユーサイズ)を提供しています。
USiZEサービスサイトでは、お客様のDX推進をワンストップで支援するサービスの詳細や導入事例を紹介しています。
AWSアプリケーション開発クラウドソリューションデータベース
シェアする
TechHarmony
タイトルとURLをコピーしました