簡體   English   中英

在模板中迭代一組AWS雲信息資源

[英]Iterate over array of AWS cloudformation resources in template

從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)

我可能有十幾個或更多這些解析器,唯一的區別是我用<----指示的位置。 有沒有辦法迭代一組值,比如說

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

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

不,你不能。 Cloudformation是一個很好的工具,但它有其局限性。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM