从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...
答案 0 :(得分:3)
这在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)
答案 1 :(得分:1)
不,你不能。 Cloudformation是一个很好的工具,但它有其局限性。
您可能需要查看Jinja或Troposphere(python)。