gpt4 book ai didi

amazon-web-services - 是否可以在 AppSync 解析器中引用 CloudFormation 资源名称?

转载 作者:行者123 更新时间:2023-12-03 07:18:18 25 4
gpt4 key购买 nike

我在 CloudFormation 模板(用 YAML 编写)中配置了一些 DynamoDB 表资源,并在模板的其他位置配置了 AppSync 端点。

我不指定表的名称,而是让 CloudFormation 为它们生成名称。每当我需要指定表名时,我都会使用

!Ref TableName

我想在 AppSync 中使用 DynamoDB 批量解析器,这要求我列出表的名称,但是当我更新堆栈时,“!Ref TableName”不会转换为表的名称。解析器最终以“!Ref TableName”作为表名称。

有没有办法可以将 CloudFormation 生成的表名称获取到 AppSync 模板语言中?

下面是我的 CloudFormation 模板,已根据相关性进行了修剪:

conversationsTable:
Type: "AWS::DynamoDB::Table"
Properties:
AttributeDefinitions:
-
AttributeName: "id"
AttributeType: "S"
KeySchema:
-
AttributeName: "id"
KeyType: "HASH"
ProvisionedThroughput:
ReadCapacityUnits: "1"
WriteCapacityUnits: "1"

userConversationsTable:
Type: "AWS::DynamoDB::Table"
Properties:
AttributeDefinitions:
-
AttributeName: "userId"
AttributeType: "S"
-
AttributeName: "conversationId"
AttributeType: "S"
KeySchema:
-
AttributeName: "userId"
KeyType: "HASH"
-
AttributeName: "conversationId"
KeyType: "RANGE"
ProvisionedThroughput:
ReadCapacityUnits: "1"
WriteCapacityUnits: "1"

...

createConversationMutationResolver:
Type: "AWS::AppSync::Resolver"
Properties:
ApiId: !GetAtt chatQLApi.ApiId
TypeName: "Mutation"
FieldName: "createConversation"
DataSourceName: !GetAtt conversationsTableDataSource.Name
RequestMappingTemplate: |
{
"version" : "2018-05-29",
"operation" : "BatchPutItem",
"tables": {
!Ref conversationsTable : $util.toJson($convoList),
!Ref userConversationsTable : $util.toJson($users)
}
}
ResponseMappingTemplate: |
#if($context.error)
$util.appendError($context.error.message, $context.error.message)
#end
{
"conversation": $util.toJson("${context.result.data}!Ref conversationTable")
"userConversations": $util.toJson("${context.result.data}!Ref userConversationsTable")
}

最佳答案

阅读 intrinsic functions 上的 CloudFormation 文档后,我能够使用 Sub 实现我的目标和 Join功能。

在 RequestMapping 模板中,我使用 Fn::Sub 将两个 VTL 变量设置为表的名称,然后使用 Fn::Join 将字符串替换为模板字符串的其余部分。

在 ResponseMapping 模板中,我在模板代码中为需要表名称的所有内容放置了占位符,并使用 Fn::Sub 对其进行子化。然后,为了将表名称附加到上下文对象路径,我使用 Fn::Join 完全使用 CloudFormation 模板构建该路径,并将其放入 Fn::Sub 使用的替换映射中。

下面是我上面的模板,经过更改

createConversationMutationResolver:
Type: "AWS::AppSync::Resolver"
Properties:
ApiId: !GetAtt chatQLApi.ApiId
TypeName: "Mutation"
FieldName: "createConversation"
DataSourceName: !GetAtt conversationsTableDataSource.Name
RequestMappingTemplate:
!Join
- ''
- - !Sub
- |
#set($conversationTable = "${conversationsTable}")
#set($userConversationTable = "${userConversationsTable}")
- { conversationTable: !Ref conversationsTable, userConversationTable: !Ref userConversationsTable }
- |
{
"version" : "2018-05-29",
"operation" : "BatchPutItem",
"tables": {
"${conversationTable}" : $util.toJson($convoList),
"${userConversationTable}" : $util.toJson($users)
}
}
ResponseMappingTemplate:
!Sub
- |
#if($context.error)
$util.appendError($context.error.message, $context.error.message)
#end
{
"${conversation}": $util.toJson(${conversationContext})
"${userConversations}": $util.toJson(${userConversationContext})
}
- {
conversation: !Ref conversationsTable,
userConversations: !Ref userConversationsTable,
conversationContext: !Join [ '.', ["$context.result.data", !Ref conversationsTable]],
userConversationContext: !Join [ '.', ["$context.result.data", !Ref userConversationsTable]]
}

关于amazon-web-services - 是否可以在 AppSync 解析器中引用 CloudFormation 资源名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52449215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com