После прочтения документации 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]]
}