ããã«ã¡ã¯ãåºéã§ãã AWS AppSync ã䜿çšããã¢ããªã±ãŒã·ã§ã³ãéçºããæ©äŒãããããªãŸã«ãã䞻㫠VTL ã®æžãæ¹ã«é¢ããŠãŸãšãŸã£ãç¥èãåŸãããã®ã§ç޹ä»ããŸããååããã®ç¶ããã®ã§ãä»å㯠1ã€ã® VTL ã§ 2ã€ã®ã¯ãšãªãçŽåã«å®è¡ããæ¹æ³ (ãã€ãã©ã€ã³ãªãŸã«ã) ã玹ä»ããŸãã æ¬èšäºã§ã¯ãVTL ã®æžãæ¹ã«ãã©ãŒã«ã¹ããŠããŸãããäºæ¿ãã ããã AWS AppSyncããªãŸã«ããVTL ã®èª¬æã«ã€ããŠã¯ä»¥äžã®èšäºãã芧äžããã AWS AppSync ãªãŸã«ã (VTL) ã®æžãæ¹ãµã³ãã« No.1 - Amazon DynamoDB GetItem Amazon DynamoDB ã« VTL ã§ GetItem ãããããšãã®åºæ¬çãªæžãæ¹ã玹ä»ããŸãã blog.usize-tech.com 2024.01.09 AWS AppSync ãªãŸã«ã (VTL) ã®æžãæ¹ãµã³ãã« No.2 â Amazon DynamoDB BatchGetItem Amazon DynamoDB ã« VTL ã§ BatchGetItem ãããããšãã®åºæ¬çãªæžãæ¹ã玹ä»ããŸãã blog.usize-tech.com 2024.01.19 AWS AppSync ãªãŸã«ã (VTL) ã®æžãæ¹ãµã³ãã« No.3 â Amazon DynamoDB Query Amazon DynamoDB ã« VTL ã§ Query ãããããšãã®åºæ¬çãªæžãæ¹ã玹ä»ããŸãã blog.usize-tech.com 2024.02.26 AWS AppSync ãªãŸã«ã (VTL) ã®æžãæ¹ãµã³ãã« No.4 - Amazon DynamoDB PutItem Amazon DynamoDB ã« VTL ã§ PutItem ãããããšãã®åºæ¬çãªæžãæ¹ã玹ä»ããŸãã blog.usize-tech.com 2024.02.26 AWS AppSync ãªãŸã«ã (VTL) ã®æžãæ¹ãµã³ãã« No.5 â Amazon DynamoDB UpdateItem Amazon DynamoDB ã« VTL ã§ UpdateItem ãããããšãã®åºæ¬çãªæžãæ¹ã玹ä»ããŸãã blog.usize-tech.com 2024.02.27 AWS AppSync ãªãŸã«ã (VTL) ã®æžãæ¹ãµã³ãã« No.6 - Amazon DynamoDB å¿çšç·š åŒæ°å
ã®ãã©ã°ã«ããåŠçãåãã Amazon DynamoDB ã« VTL ã§ããŒã¿èªã¿æžããããããšãã«ãåŒæ°å
ã®ãã©ã°ã«ããå®è¡ãããåŠçãåå²ããæ¹æ³ã玹ä»ããŸãã blog.usize-tech.com 2024.06.17 AWS AppSync ã䜿ã£ãŠ React ã¢ããªããããã¯ããéåæãžã§ãã®çµæãããã·ã¥éç¥ã§åãåã éåæãžã§ããå®è¡ããåŸãçµæãã©ãåãåããïŒãšããã®ã¯éçºè
ãšããŠäœã蟌ã¿ç²æã®ããããŒãã§ããä»å㯠React ã¢ããªãéåæãžã§ããå®è¡ããåŸã«ãAWS AppSync çµç±ã§ãžã§ãå®äºã®ããã·ã¥éç¥ãåãåãä»çµã¿ã玹ä»ããŸãã blog.usize-tech.com 2022.12.01 ããããã㚠以äžã®ãããªåŠçããããã§ãã ã¢ããªããã®1åã®ãªã¯ãšã¹ããåããŠããªãŸã«ãã®äžã§çŽåãã 2 ã€ã®åŠçãå®è¡ããçµæãã¢ããªã«ã¬ã¹ãã³ã¹ããã ã¢ããªãžã®ã¬ã¹ãã³ã¹ã¯ã1ã€ç®ã®åŠç (颿°1) ã®çµæã 2ã€ç®ã®åŠç (颿°2) ãåãåããåŠçã«äœ¿çšããã ããã¯ã以äžã®ãããªãã€ãã©ã€ã³ãªãŸã«ããæ§ç¯ããããšã§å®çŸã§ããŸãã å
¬åŒã«ã¯ã以äžã®ããã¥ã¡ã³ããã芧äžããã リゾルバーのマッピングテンプレートの概要 - AWS AppSync AWS AppSync 察å¿ã®ãªãŸã«ããŒã®ãããã³ã°ãã³ãã¬ãŒãã®æŠèŠ docs.aws.amazon.com æ¬èšäºã®ãµã³ãã«ã§ã¯ãã¢ããªãã AWS AppSync ã«ãã°ã©ãã«äœ¿çšãã 3 ã€ã®ããŒã¿ãååŸããããªã¯ãšã¹ããåãããšããŸããAmazon DynamoDB ã«ã¯é©åãªããŒã¿ãããæ³å®ã§ããããŒãã«åã¯ãªãŸã«ãã®å¥ã®èšå® (Data Source) ã§è¡ããŸãã 1ã€ç®ã®é¢æ°: ããŒãã£ã·ã§ã³ã㌠pkeyããœãŒãã㌠skey1 ã “TRUE” ã§ããä»¶æ°ãããŒãã« A ããååŸ 2ã€ç®ã®é¢æ°: ããŒãã£ã·ã§ã³ã㌠pkeyããœãŒãã㌠skey1 ã “FALSE” ã§ããä»¶æ°ãããŒãã« A ããååŸ 3ã€ç®ã®é¢æ°: ããŒãã£ã·ã§ã³ã㌠pkeyããœãŒãã㌠skey2 ã “Red” ããå§ãŸãä»¶æ°ãããŒãã« B ããååŸ pkey 㯠pkey ãšãã倿°åã§åŒæ°ãšããŠã¢ããªããå€ãæž¡ããã ãããã®ä»¶æ°ãã以äžã®ãã©ãŒãããã® JSON ããŒã¿ãšããŠãŸãšããŠã¬ã¹ãã³ã¹ããã { "true": xx, "false": xx, "red": xx } Amazon DynamoDB ã«åœä»€ãã VTL ãŸãã倧å
ç· ãã®ãã€ãã©ã€ã³ãªãŸã«ãã®ãããã³ã°ãã³ãã¬ãŒããã€ãããŸãããå®äœã¯ã»ãŒç©ºã§ããå®åŠçã¯å颿°ã®ãªãŸã«ãã«èšè¿°ããŸãã ãã€ãã©ã€ã³ãªãŸã«ãã®ãªã¯ãšã¹ããããã³ã°ãã³ãã¬ãŒã äœãããŸããã(ç¬) {} ãã€ãã©ã€ã³ãªãŸã«ãã®ã¬ã¹ãã³ã¹ãããã³ã°ãã³ãã¬ãŒã æåŸã«å®è¡ããã颿°ããåãåã£ãã¬ã¹ãã³ã¹ããã®ãŸãŸãã€ãã©ã€ã³ãªãŸã«ãã®ã¬ã¹ãã³ã¹ãšããŠã¢ããªã«è¿ã仿§ã«ããŸãã $util.toJson($context.result) 颿° 1 ã®ãªã¯ãšã¹ããããã³ã°ãã³ãã¬ãŒã { "version": "2018-05-29", "operation": "Query", "query": { "expression": "#pkey = :pkey AND #skey1 = :skey1", "expressionNames": { "#pkey": "pkey", "#skey1": "skey1" }, "expressionValues": { ":pkey": $util.dynamodb.toDynamoDBJson($context.arguments.pkey), ":skey1": $util.dynamodb.toDynamoDBJson("TRUE") } }, "nextToken": $util.toJson($util.defaultIfNullOrEmpty($context.arguments.after, null)), "scanIndexForward": false, "consistentRead": false, "projection": { "expression": "pkey" } } ã·ã³ãã«ãªãæ¡ä»¶ã«åèŽããè¡ã®ä»¶æ°ãã«ãŠã³ããããã ãã®ã¯ãšãªãªã®ã§ãprojection ã« pkey ã®ã¿ãæå®ããŠããŸããããã«ããã¬ã¹ãã³ã¹ã®ããŒã¿éãç¯çŽããŸãã 颿° 1 ã®ã¬ã¹ãã³ã¹ãããã³ã°ãã³ãã¬ãŒã çµæã®ãã¡ãä»¶æ°ã ããååŸãããã®ã§ã以äžã®ããã« scannedCount ã䜿çšããŸãã $util.toJson({ "true": $ctx.result.scannedCount }) ãã®ã¬ã¹ãã³ã¹ã¯ã颿° 2 ã«æž¡ãããŸãã 颿° 2 ã®ãªã¯ãšã¹ããããã³ã°ãã³ãã¬ãŒã { "version": "2018-05-29", "operation": "Query", "query": { "expression": "#pkey = :pkey AND #skey1 = :skey1", "expressionNames": { "#pkey": "pkey", "#skey1": "skey1" }, "expressionValues": { ":pkey": $util.dynamodb.toDynamoDBJson($context.arguments.pkey), ":skey1": $util.dynamodb.toDynamoDBJson("FALSE") } }, "nextToken": $util.toJson($util.defaultIfNullOrEmpty($context.arguments.after, null)), "scanIndexForward": false, "consistentRead": false, "projection": { "expression": "pkey" } } æ¬ãµã³ãã«ã§ã¯ã颿° 2 ã¯é¢æ° 1 ã®ãœãŒãããŒã®æ¡ä»¶ãå€ããã ãã®ãã®ã§ãã»ãšãã©åãã§ããskey1 ã FALSE ã§ããä»¶æ°ãååŸããç®çã§ãã 颿° 2 ã®ã¬ã¹ãã³ã¹ãããã³ã°ãã³ãã¬ãŒã ããã¯é¢æ° 1 ãšã¯å°ãå€ãããŸãã颿° 1 ã®ã¬ã¹ãã³ã¹ãåãåã£ããã®ãããã§ããŒãžããŸãã $util.qr($ctx.prev.result.put("false", $ctx.result.scannedCount)) $util.toJson($ctx.prev.result) $ctx.prev.result ã颿° 1 ã®ã¬ã¹ãã³ã¹ã§ããããã« “false”: ã«ç¶ããŠé¢æ° 2 ã®çµæ $ctx.result ã®äžã®ä»¶æ°ã«åœãã scannedCount ãåãåºããŠããŒãžããŠããŸããçµæãšããŠã以äžã®ããŒã¿ã颿° 2 ã®ã¬ã¹ãã³ã¹ãšããŠé¢æ° 3 ã«æž¡ãããŸãã { "true": xx, "false": xx } 颿° 3 ã®ãªã¯ãšã¹ããããã³ã°ãã³ãã¬ãŒã ãã¡ãã¯ã颿° 1,2 ãšã¯å¥ã®ããŒãã«ããå¥ã®ããŒã¿ã®ä»¶æ°ãååŸããŸãã { "version": "2018-05-29", "operation": "Query", "query": { "expression": "#pkey = :pkey AND begins_with(#skey2, :skey2)", "expressionNames": { "#pkey": "pkey", "#skey2": "skey2" }, "expressionValues": { ":pkey": $util.dynamodb.toDynamoDBJson($context.arguments.pkey), ":skey2": $util.dynamodb.toDynamoDBJson("Red") } }, "nextToken": $util.toJson($util.defaultIfNullOrEmpty($context.arguments.after, null)), "scanIndexForward": false, "consistentRead": false, "projection": { "expression": "pkey" } } 颿° 3 ã®ã¬ã¹ãã³ã¹ãããã³ã°ãã³ãã¬ãŒã 颿° 2 ããåãåã£ãã¬ã¹ãã³ã¹ãããã§ããŒãžããŸãããã£ãŠããããšã¯é¢æ° 2 ãšåãã§ãã $util.qr($ctx.prev.result.put("red", $ctx.result.scannedCount)) $util.toJson($ctx.prev.result) çµæãšããŠã以äžã®ããŒã¿ã颿° 3 ã®ã¬ã¹ãã³ã¹ãšããŠãã€ãã©ã€ã³ãªãŸã«ãã«è¿ãããŸãããã€ãã©ã€ã³ãªãŸã«ãã¯ä»åã®äŸã§ã¯ãã®ãŸãŸã¢ããªã«ããŒã¿ãè¿ãã®ã§ãå®è³ªé¢æ° 3 ã®ã¬ã¹ãã³ã¹ãæçµçãªã¬ã¹ãã³ã¹ã«ãªããŸãã { "true": xx, "false": xx, "red": xx } (åè) AWS CloudFormation ãã³ãã¬ãŒã ç§ã¯ãã®é¢åãªãªãŸã«ãã®å®çŸ©ã AWS ãããžã¡ã³ãã³ã³ãœãŒã«ã§èšå®ããæ°ãèµ·ãã (UI ããããã«ããã®ã§)ãAWS CloudFormation ã§ãããã€ããŠããŸããå®å
šãª AWS AppSync ã®ãã³ãã¬ãŒãã§ã¯ãããŸãããããã€ãã©ã€ã³ãªãŸã«ãã®ãšããã® Resources ã®ã¿æç²ããŠç޹ä»ããŸãã # ãã€ãã©ã€ã³ãªãŸã«ãã®å®çŸ© AppSyncResolverPipeline: Type: AWS::AppSync::Resolver Properties: ApiId: !GetAtt AppSyncApi.ApiId # AppSync ã® API ID TypeName: Query FieldName: queryUserExamScore # AppSync ã®ã¹ããŒãã§å®çŸ©ããã¯ãšãªã®åå Kind: PIPELINE # ããã§ãã€ãã©ã€ã³ãªãŸã«ãã§ããããšãå®£èš PipelineConfig: Functions: # äœæããã颿°ãåŠçé ã«äžŠã¹ãã颿° ID ãåç
§ - !GetAtt FunctionUserExamScore1true.FunctionId - !GetAtt FunctionUserExamScore2false.FunctionId - !GetAtt FunctionUserExamScore3red.FunctionId RequestMappingTemplate: | {} ResponseMappingTemplate: | $util.toJson($context.result) DependsOn: - FunctionUserExamScore1true - FunctionUserExamScore2false - FunctionUserExamScore3red # 颿° 1 ã®å®çŸ© FunctionUserExamScore1true: Type: AWS::AppSync::FunctionConfiguration Properties: ApiId: !GetAtt AppSyncApi.ApiId # DynamoDB ããŒãã« A ã®ããŒã¿ãœãŒã¹åãããã§åç
§ DataSourceName: !GetAtt AppSyncDataSourceTableA.Name Description: AppSync Function for User Exam Score Graph 1 for true FunctionVersion: 2018-05-29 Name: AppSyncFunctionUserExamScore1true RequestMappingTemplate: | { "version": "2018-05-29", "operation": "Query", "query": { "expression": "#pkey = :pkey AND #skey1 = :skey1", "expressionNames": { "#pkey": "pkey", "#skey1": "skey1" }, "expressionValues": { ":pkey": $util.dynamodb.toDynamoDBJson($context.arguments.pkey), ":skey1": $util.dynamodb.toDynamoDBJson("TRUE") } }, "nextToken": $util.toJson($util.defaultIfNullOrEmpty($context.arguments.after, null)), "scanIndexForward": false, "consistentRead": false, "projection": { "expression": "pkey" } } ResponseMappingTemplate: | $util.toJson({ "true": $ctx.result.scannedCount }) DependsOn: - AppSyncDataSourceTableA # 颿° 2 ã®å®çŸ© FunctionUserExamScore2false: Type: AWS::AppSync::FunctionConfiguration Properties: ApiId: !GetAtt AppSyncApi.ApiId # DynamoDB ããŒãã« A ã®ããŒã¿ãœãŒã¹åãããã§åç
§ DataSourceName: !GetAtt AppSyncDataSourceTableA.Name Description: AppSync Function for User Exam Score Graph 2 for false FunctionVersion: 2018-05-29 Name: AppSyncFunctionUserExamScore2false RequestMappingTemplate: | { "version": "2018-05-29", "operation": "Query", "query": { "expression": "#pkey = :pkey AND #skey1 = :skey1", "expressionNames": { "#pkey": "pkey", "#skey1": "skey1" }, "expressionValues": { ":pkey": $util.dynamodb.toDynamoDBJson($context.arguments.pkey), ":skey1": $util.dynamodb.toDynamoDBJson("FALSE") } }, "nextToken": $util.toJson($util.defaultIfNullOrEmpty($context.arguments.after, null)), "scanIndexForward": false, "consistentRead": false, "projection": { "expression": "pkey" } } ResponseMappingTemplate: | $util.qr($ctx.prev.result.put("false", $ctx.result.scannedCount)) $util.toJson($ctx.prev.result) DependsOn: - AppSyncDataSourceTableA # 颿° 3 ã®å®çŸ© FunctionUserExamScore3red: Type: AWS::AppSync::FunctionConfiguration Properties: ApiId: !GetAtt AppSyncApi.ApiId # DynamoDB ããŒãã« B ã®ããŒã¿ãœãŒã¹åãããã§åç
§ DataSourceName: !GetAtt AppSyncDataSourceTableB.Name Description: AppSync Function for User Exam Score Graph 3 for red FunctionVersion: 2018-05-29 Name: AppSyncFunctionUserExamScore3red RequestMappingTemplate: | { "version": "2018-05-29", "operation": "Query", "query": { "expression": "#pkey = :pkey AND begins_with(#skey2, :skey2)", "expressionNames": { "#pkey": "pkey", "#skey2": "skey2" }, "expressionValues": { ":pkey": $util.dynamodb.toDynamoDBJson($context.arguments.pkey), ":skey2": $util.dynamodb.toDynamoDBJson("Red") } }, "nextToken": $util.toJson($util.defaultIfNullOrEmpty($context.arguments.after, null)), "scanIndexForward": false, "consistentRead": false, "projection": { "expression": "pkey" } } ResponseMappingTemplate: | $util.qr($ctx.prev.result.put("red", $ctx.result.scannedCount)) $util.toJson($ctx.prev.result) DependsOn: - AppSyncDataSourceTableB ãŸãšã ãããã§ããã§ããããã ä»åã®ãµã³ãã«ã§ã¯ãããããã®é¢æ°ã®çµæãé çªã«ããŒãžããŠããã ãã®ç°¡åãªçŽååŠçã§ããããåã®é¢æ°ã®çµæã次ã®é¢æ°ã®ã¯ãšãªã®ãã©ã¡ãŒã¿ã«äœ¿çšããããšãã§ããŸãããã®å Žåã¯ãªã¯ãšã¹ããããã³ã°ãã³ãã¬ãŒãã®äžã§åã®é¢æ°ã®ã¬ã¹ãã³ã¹ $ctx.prev.result ã䜿çšããŸãã ããã«ããéåžž DynamoDB ãžã®åäœã®ã¯ãšãªã§ã¯å®çŸã§ããªããããŒãã«ã®çµåã«è¿ãããšãå®ã¯ã§ããŸãããŸãåãããšããã«ããŠã Lambda 颿°æžãã°æ®éã«ã§ãããã§ãããVTL ã®æ¹ãåŠçãéãã®ãš Lambda 颿°ãä¹±ç«ããªããŠãããªããšæã£ãŠæ¥µåç§ã¯ VTL ã䜿ã£ãŠããŸãã æ¬èšäºãçæ§ã®ã圹ã«ç«ãŠãã°å¹žãã§ãã