AWS AppSync リゾルバ (VTL) の書き方サンプル No.6 – Amazon DynamoDB 応用編 引数内のフラグにより処理を分ける

こんにちは、広野です。

AWS AppSync を使用したアプリケーションを開発する機会があり、リゾルバ、主に VTL の書き方に関してまとまった知識が得られたので紹介します。前回からの続きもので、今回は引数内のフラグ条件により実行させる処理 (オペレーション) を分岐する方法を紹介します。

本記事では、VTL の書き方にフォーカスしています。ご了承ください。
AWS AppSync、リゾルバ、VTL の説明については以下の記事をご覧下さい。
AWS AppSync リゾルバ (VTL) の書き方サンプル No.1 - Amazon DynamoDB GetItem
Amazon DynamoDB に VTL で GetItem をかけるときの基本的な書き方を紹介します。
AWS AppSync リゾルバ (VTL) の書き方サンプル No.2 – Amazon DynamoDB BatchGetItem
Amazon DynamoDB に VTL で BatchGetItem をかけるときの基本的な書き方を紹介します。
AWS AppSync リゾルバ (VTL) の書き方サンプル No.3 – Amazon DynamoDB Query
Amazon DynamoDB に VTL で Query をかけるときの基本的な書き方を紹介します。
AWS AppSync リゾルバ (VTL) の書き方サンプル No.4 - Amazon DynamoDB PutItem
Amazon DynamoDB に VTL で PutItem をかけるときの基本的な書き方を紹介します。
AWS AppSync リゾルバ (VTL) の書き方サンプル No.5 – Amazon DynamoDB UpdateItem
Amazon DynamoDB に VTL で UpdateItem をかけるときの基本的な書き方を紹介します。
AWS AppSync を使って React アプリからキックした非同期ジョブの結果をプッシュ通知で受け取る
非同期ジョブを実行した後、結果をどう受け取るか?というのは開発者として作り込み甲斐のあるテーマです。今回は React アプリが非同期ジョブを実行した後に、AWS AppSync 経由でジョブ完了のプッシュ通知を受け取る仕組みを紹介します。

やりたいこと

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

  • 引数となるパラメータ: status の中に true/false の Boolean 値、パーティションキー pkey、ソートキー skey、属性 attr

今回は受け取った status をフラグとして、

  • true の場合はパーティションキーとソートキー、属性をそのまま PutItem し、
  • false の場合はパーティションキーとソートキーに該当するデータを DeleteItem します。

Amazon DynamoDB に命令する VTL

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

{
  "version": "2018-05-29",
  "operation": #if($context.arguments.status) "PutItem" #else "DeleteItem" #end,
  #if($context.arguments.status)
    "key": {
      "pkey": $util.dynamodb.toDynamoDBJson($pkey),
      "skey": $util.dynamodb.toDynamoDBJson($skey)
    },
    "attributeValues": {
      "attr": $util.dynamodb.toDynamoDBJson($context.arguments.attr)
    }
  #else
    "key": {
      "pkey": $util.dynamodb.toDynamoDBJson($pkey),
      "skey": $util.dynamodb.toDynamoDBJson($skey)
    }
  #end
}

operation の部分に、上記のように if 分岐を書くことで、オペレーションを PutItem にするか DeleteItem にするか、1行で分けることができます。

当然、PutItem のときと DeleteItem のときで DynamoDB に渡す “key” の項目が異なりますので、そこも if 分岐を書きます。

簡単な処理であれば、1つの VTL で引数によって処理を変えられるので、使いようによっては開発を効率化できると思います。もちろん他のオペレーションにも応用できます。

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

結果は配列に格納されます。戻ってきたデータをそのままアプリ側に戻す書き方です。

$utils.toJson($context.result)

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

まとめ

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

VTL 内では if 分岐を自由に書けるので、今回の例に限らずやりたいことを試してみて頂けたらと思います。

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

著者について
広野 祐司

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

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