带有SAM的API网关未正确更新

BAD*_*EED 6 amazon-web-services aws-cloudformation aws-lambda aws-api-gateway aws-codepipeline

我们使用Cloud Formation来定义一堆Lambda函数:

AWSTemplateFormatVersion: '2010-09-09'
Transform:
- 'AWS::Serverless-2016-10-31'

Resources:
  MyLambda:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: com.handler::MyLambda
      Runtime: java8
      CodeUri: .
      Description: Some desc
      MemorySize: 512
      Timeout: 15
      Role: !Ref LambdaRole
      FunctionName: MyLambda
      Events:
        MyLambdaEvt:
          Type: Api
          Properties:
            RestApiId: !Ref MyApiDef
            Path: /lambda/my
            Method: get

  MyApiDef:
    Type: AWS::Serverless::Api
    Properties:
      DefinitionUri: s3://a-bucket/api-gateway.yml
      StageName: prod

Outputs:
  ApiUrl:
    Description: URL of your API endpoint
    Value: !Join
      - ''
      - - https://
        - !Ref MyApiDef
        - '.execute-api.'
        - !Ref 'AWS::Region'
        - '.amazonaws.com/prod'
Run Code Online (Sandbox Code Playgroud)

CodePipeline生成变更集并执行它.

通过这种方式,所有Lambda函数都已正确更新,但API Gateway端点未正确更新,我们需要s3://a-bucket/api-gateway.yml手动导入和部署YML .

Mik*_*ick 3

为什么 API 不更新(有根据的猜测)

为了将更改添加到更改集,CloudFormation 必须检测更改。如果部署之间唯一发生更改的内容MyApiDef是 S3 上的 .yaml 文件的内容,则 CloudFormation 将不会检测到需要添加到更改集的更改。

如果此 API 定义存在于 CF 模板中,而不是 S3 上的文件中,CF 显然会检测到每个更改并为您更新 API。

由于定义位于 S3 中,并且文件名未更改,因此未检测到任何更改,因此不会更新任何内容。

可能的解决方法

您必须让 CloudFormation 相信您的 API 定义发生了一些变化。这两件事对我有用:

  • MyApiDef每次运行都会更新密钥本身。(MyApiDefv2MyApiDefv3, ETC)
  • 更新DefinitionUri作品。(即 S3 中的文件名版本)。

这些都不是很好,但在 S3 中的文件名中附加版本似乎比其他选项更合理。

可能还有其他方法可以说服 CloudFormation 发生更改。值得注意的是,我无法为此Variables目的去工作。