Перебирать массив ресурсов облачной информации AWS в шаблоне - PullRequest
0 голосов
/ 27 апреля 2018

При создании ресурсов в AWS CloudFormation из шаблона yml (или json) можно выполнять итерации по массиву, чтобы шаблон был кратким и читабельным. Например, у меня есть проект Appsync, в котором я должен создать группу почти идентичных распознавателей типа AWS «AWS :: AppSync :: Resolver». В используемом шаблоне YML, который я использую с Cloud Formation, 1 такой ресурс может выглядеть следующим образом

Resource:
 GraphQlAddPostsResolver:
      Type: "AWS::AppSync::Resolver"
      DependsOn: GraphQlSchema
      Properties:
        ApiId:
          Fn::GetAtt: [GraphQlApi, ApiId]
        TypeName: Mutation #<---
        FieldName: addPost #<----
        DataSourceName:
          Fn::GetAtt: [GraphQlLambdaDataSource, Name]
        RequestMappingTemplate: |
          {
              "version" : "2017-02-28",
              "operation": "Invoke",
              "payload": {
                  "field": "addPost", #<---
                  "context": $util.toJson($context)
              }
          }
        ResponseMappingTemplate: |
          $util.toJson($context.result)

У меня может быть дюжина или более таких распознавателей, и единственное отличие будет в том, где я указал <----. Есть ли способ перебора массива значений, скажем,

- Field: addPost
  Type: Mutation
- Field: allPosts
  Type: Query
- Field: getPost
  Type: Query
## etc...

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Это невозможно в AWS CloudFormation. Вы можете решить вашу проблему с помощью вложенных стеков. Используйте AWS :: CloudFormation :: Stack ресурсы.

  FirstResolver:
    Type: AWS::CloudFormation::Stack
    DependsOn: GraphQlSchema
    Properties:
      TemplateURL: ./app-sync-resolver.yml
      Parameters:
        ApiId: !GetAtt GraphQlApi.ApiId
        DataSourceName: !GetAtt GraphQlLambdaDataSource.Name
        Field: addPost
        Type: Mutation

  SecondResolver:
    Type: AWS::CloudFormation::Stack
    DependsOn: GraphQlSchema
    Properties:
      TemplateURL: ./app-sync-resolver.yml
      Parameters:
        ApiId: !GetAtt GraphQlApi.ApiId
        DataSourceName: !GetAtt GraphQlLambdaDataSource.Name
        Field: allPosts
        Type: Query

app-sync-resolver.yml выглядит так ( не тестировалось! )

AWSTemplateFormatVersion: 2010-09-09
Parameters:
  ApiId:
    Type: String
  DataSourceName:
    Type: String
  Type:
    Type: String
  Field:
    Type: String
Resource:
 GraphQLResolver:
      Type: AWS::AppSync::Resolver
      Properties:
        ApiId: !Ref ApiId
        TypeName: !Ref Type
        FieldName: !Ref Field
        DataSourceName: !Ref DataSourceName
        RequestMappingTemplate: |
          {
              "version" : "2017-02-28",
              "operation": "Invoke",
              "payload": {
                  "field": "${Field}",
                  "context": $util.toJson($context)
              }
          }
        ResponseMappingTemplate: |
          $util.toJson($context.result)
0 голосов
/ 27 апреля 2018

Нет, ты не можешь. Cloudformation - отличный инструмент, но у него есть свои ограничения.

Возможно, вы захотите взглянуть на Джинджу или Тропосферу (питона).

...