top of page
検索
  • 執筆者の写真m o

AppSyncリクエストマッピングテンプレートを使いこなす

AppSyncとは

AWS AppSyncは、アプリケーションに簡単にデータのリアルタイム同期やオフラインアクセス機能を提供します。

主にGraphQLを使用してデータの取得や変更を行うことができます。


リゾルバについて

AppSyncのリゾルバ(Resolver)とは、GraphQLのスキーマで受け付けたリクエストに対し実際にデータ操作を行う部分です。

DynamoDBのリソースをマッピングしGetItem,PutItem等の操作を行う他に、lambdaを呼び出すことも可能です。


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

AppSyncのリゾルバにはリクエストマッピングテンプレートが用意されています。

リクエスト時の認証情報を呼び出す関数に渡したり、リクエストによる挙動を定義することができます。

以下はcognitoの認証情報からカスタム属性を取得し、DynamoDBからGetItemでユーザーの情報を取得する例です。

#set($loginId = $context.identity.claims.get("custom:login_id"))

{
    "version" : "2017-02-28",
    "operation" : "GetItem",
    "key" : {
        "loginId" : $util.dynamodb.toDynamoDBJson($loginId)
    }
}

リクエストマッピングテンプレートでは、setの他にも条件式を使用することができます。

基本的な文法に関しては、AWSのリファレンスでわかりやすく解説されています。


動的なクエリの生成

以下はQueryを使用した抽出条件を、APIの引数の値に応じてifを使用して動的に可変させる例です。

      #if(${ctx.args.loginIdNotSet} && ${ctx.args.loginIdNotSet} != '' )
        #set( $filterExpression = "${filterExpression} AND (attribute_not_exists(#loginId) or loginId = :empty)")
        $util.qr($expressionNames.put("#loginId", "loginId"))
        $util.qr($expressionValues.put(":empty", $util.dynamodb.toDynamoDBJson("")))
      #end
    ,"filter": {
      "expression": "$!{filterExpression}",
      "expressionNames" : {
          #foreach( $key in $expressionNames.keySet() )
          "$!{key}": "${expressionNames.get($key)}"#if( $foreach.hasNext ),#end
          #end
      },
      "expressionValues": {
          #foreach( $key in $expressionValues.keySet() )
          "$!{key}": $expressionValues.get($key)#if( $foreach.hasNext ),#end
          #end
      }
    }
    #if( ${ctx.args.count} )
        ,"limit": $util.toJson($ctx.args.count)
    #end
    #if( ${ctx.args.nextToken} )
        ,"nextToken": "${ctx.args.nextToken}"
    #end
}

以上のように、if文を使用することによって条件分岐し、動的なクエリを作成することができます。


ハマってしまった細かい場所

DynamoDBにキーが存在しないかどうかを調べる際はattribute_not_existsを使用しますが、

DynamoDBで値が含まれない、という条件を付与する際はnot containsを使用します。

not_containsではないことに注意が必要です。

      #set( $filterExpression = "not contains(#userTypes, :userTypes)")
      $util.qr($expressionNames.put("#userTypes", "userTypes"))
      $util.qr($expressionValues.put(":userTypes", $util.dynamodb.toDynamoDBJson("ADMIN")))


閲覧数:9回0件のコメント

最新記事

すべて表示

データ状態によりSQLを異常終了させたい

はじめに 夜間バッチのデータ更新等では、入力テーブルが0件などのデータの状態によってSQLを継続実行せず、エラー終了したいケースがあります。 出力テーブルが0件で作成されると、後続の参照処理大きな障害を引き起こしかねないケースで、中断することで前日状態を維持したい場合です。 例えば、全件洗いがえのマスター系データが障害により0件で連携されたなど、夜間バッチの障害では時々出会う事象です。 前提 SQ

bottom of page