【问题标题】:Iterate over array of AWS cloudformation resources in template迭代模板中的 AWS cloudformation 资源数组
【发布时间】:2018-10-08 08:04:46
【问题描述】:

从 yml(或 json)模板在 AWS CloudFormation 中创建资源时,是否可以迭代数组以保持模板简短易读。例如,我有一个 Appsync 项目,我必须在其中创建一堆几乎相同的 AWS 类型“AWS::AppSync::Resolver”的解析器。在我与 Cloud Formation 一起使用的 YML 模板中,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)

我可能有十几个或更多这样的解析器,唯一的区别是我用&lt;---- 指示的位置。有没有办法迭代一个值数组,比如说

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

【问题讨论】:

    标签: amazon-web-services yaml amazon-cloudformation resolver aws-appsync


    【解决方案1】:

    这在 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)
    

    【讨论】:

      【解决方案2】:

      不,你不能。 Cloudformation 是一个很棒的工具,但它也有其局限性。

      您可能想看看 Jinja 或 Troposphere (python)。

      【讨论】:

        猜你喜欢
        • 2016-09-30
        • 2020-09-24
        • 2016-07-07
        • 1970-01-01
        • 2017-05-05
        • 2016-03-03
        • 2021-04-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多