我有一个带有嵌套堆栈的无服务器规范,我想使用RequestMappingTemplateS3Location和ResponseMappingTemplateS3Location定义Type:AWS :: AppSync :: Resolver,并且模板位于s3中。当我更新模板时,堆栈不会更新cloudformation。
Resource:
AppSyncResolverTestStack:
Type: AWS::CloudFormation::Stack
DependsOn:
- GraphQlApi
- GraphQlSchema
Properties:
Parameters:
MappingTemplatesURL:
Fn::Join:
- "/"
- - "s3:/"
- ${self:provider.deploymentBucket}
- 'etc'
- ${opt:stage}
- 'mapping_templates_extra'
GraphQlApiId:
Fn::GetAtt:
- GraphQlApi
- ApiId
TemplateURL:
Fn::Join:
- "/"
- - "https://s3.amazonaws.com"
- ${self:provider.deploymentBucket}
- 'etc'
- ${opt:stage}
- 'cf-resolvers-2.yml'
嵌套
Parameters:
MappingTemplatesURL:
Type: String
GraphQlApiId:
Type: String
Resources:
FCSYSAPIGraphQlResolverFinancialRequest:
Type: AWS::AppSync::Resolver
Properties:
ApiId:
Ref: GraphQlApiId
TypeName: Mutation
FieldName: FinanceDocumentsApi
DataSourceName: "FCFinanceApi"
RequestMappingTemplateS3Location:
Fn::Join:
- "/"
- - Ref: MappingTemplatesURL
- "fc-finance"
- "FinanceDocuments.request.vm"
ResponseMappingTemplateS3Location:
Fn::Join:
- "/"
- - Ref: MappingTemplatesURL
- "fc-finance"
- "FinanceDocuments.response.vm"
我希望当我在s3中更新模板并部署我的项目时,cloudformation会更新,但是它会与以前的代码一起维护。
答案 0 :(得分:1)
这是CloudFormation的正常行为。 CloudFormation 仅在资源属性更改时更新资源。
由于属性RequestMappingTemplateS3Location
和ResponseMappingTemplateS3Location
不变,因此CloudFormation不会更新您的AppSync解析器(即使这些S3位置指向“新”内容)。
解决问题的一种方法是使用AWS CLI的aws cloudformation package
命令。它允许您使用本地文件定义模板:
Type: 'AWS::AppSync::Resolver'
Properties:
...
RequestMappingTemplateS3Location: './path/to/local/template/file'
...
运行
aws cloudformation package --template-file mytemplate.yml --s3-bucket mybucket --output-template-file packaged.template
返回模板的副本(packaged.template
),并用命令上载工件的S3位置替换对本地工件的引用。 S3位置名称(键)取决于内容(使用MD5)。因此,使用此策略,如果S3位置引用的内容发生更改,则属性RequestMappingTemplateS3Location
也会发生更改。
之后,您可以使用aws cloudformation deploy
部署模板。
注意:这与使用AWS SAM CLI相同,sam package
是aws cloudformation package
的别名
如果使用无服务器框架,另一种解决方案是使用serverless-appsync-plugin,它可以内联或在文件中指定映射模板。