Можно ли ссылаться на имя ресурса CloudFormation в распознавателе AppSync? - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть несколько ресурсов таблиц DynamoDB, которые я инициализирую в своем шаблоне CloudFormation (написанном на YAML), а в другом месте шаблона я инициализирую конечную точку AppSync.

Я не указываюимена таблиц и пусть CloudFormation генерирует имена для них.Всякий раз, когда мне нужно указать имя таблицы, я использую

!Ref TableName

. Я хочу использовать пакетный преобразователь DynamoDB в AppSync, который требует от меня перечисления имен таблиц, однако «! 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")
    }

1 Ответ

0 голосов
/ 23 сентября 2018

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