AppSyncとは
AWS AppSyncは、アプリケーションに簡単にデータのリアルタイム同期やオフラインアクセス機能を提供します。
主に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")))
Comments