SAM的API网关未正确更新

时间:2017-12-19 16:54:17

标签: amazon-web-services aws-lambda aws-api-gateway amazon-cloudformation 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'

CodePipeline生成变更集并执行它。

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

1 个答案:

答案 0 :(得分:1)

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

为了将更改添加到change set,CloudFormation必须检测更改。如果部署之间唯一更改(对于MyApiDef)的内容是S3上的.yaml文件的内容,则CloudFormation将无法检测到需要添加到更改集的更改。< / p>

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

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

可能的解决方法

您必须说服CloudFormation您的API定义已发生变化。这两件事对我有用:

  • 每次运行都会更新MyApiDef密钥。 (MyApiDefv2MyApiDefv3等)
  • 更新DefinitionUri有效。 (即版本 S3中的文件名。)

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

可能有其他方法可以说服CloudFormation发生了变化。值得注意的是,我可以Variables为此目的而工作。