嵌套堆栈无法使用RequestMappingTemplateS3Loc​​ation检测模板中的更改

时间:2019-05-03 23:44:09

标签: amazon-web-services amazon-cloudformation serverless-framework

我有一个带有嵌套堆栈的无服务器规范,我想使用RequestMappingTemplateS3Loc​​ation和ResponseMappingTemplateS3Loc​​ation定义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会更新,但是它会与以前的代码一起维护。

1 个答案:

答案 0 :(得分:1)

这是CloudFormation的正常行为。 CloudFormation 仅在资源属性更改时更新资源

由于属性RequestMappingTemplateS3LocationResponseMappingTemplateS3Location不变,因此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 packageaws cloudformation package的别名

如果使用无服务器框架,另一种解决方案是使用serverless-appsync-plugin,它可以内联或在文件中指定映射模板。