我们使用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。
答案 0 :(得分:1)
为什么API无法更新(有根据的猜测)
为了将更改添加到change set,CloudFormation必须检测更改。如果部署之间唯一更改(对于MyApiDef
)的内容是S3上的.yaml文件的内容,则CloudFormation将无法检测到需要添加到更改集的更改。< / p>
如果此API定义存在于CF模板中,而不是S3上的文件,则CF(显然)会检测到每个更改并为您更新API。
由于定义存在于S3中,并且文件名未更改,因此未检测到任何更改,因此不会更新任何内容。
可能的解决方法
您必须说服CloudFormation您的API定义已发生变化。这两件事对我有用:
MyApiDef
密钥。 (MyApiDefv2
,
MyApiDefv3
等)DefinitionUri
有效。 (即版本
S3中的文件名。)这些都不是很好,但在S3中将文件附加到文件名似乎比其他选项更合理。
可能有其他方法可以说服CloudFormation发生了变化。值得注意的是,我可以不让Variables
为此目的而工作。