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 .
为什么 API 不更新(有根据的猜测)
为了将更改添加到更改集,CloudFormation 必须检测更改。如果部署之间唯一发生更改的内容MyApiDef是 S3 上的 .yaml 文件的内容,则 CloudFormation 将不会检测到需要添加到更改集的更改。
如果此 API 定义存在于 CF 模板中,而不是 S3 上的文件中,CF 显然会检测到每个更改并为您更新 API。
由于定义位于 S3 中,并且文件名未更改,因此未检测到任何更改,因此不会更新任何内容。
可能的解决方法
您必须让 CloudFormation 相信您的 API 定义发生了一些变化。这两件事对我有用:
MyApiDef每次运行都会更新密钥本身。(MyApiDefv2,
MyApiDefv3, ETC)DefinitionUri作品。(即 S3 中的文件名版本)。这些都不是很好,但在 S3 中的文件名中附加版本似乎比其他选项更合理。
可能还有其他方法可以说服 CloudFormation 发生更改。值得注意的是,我无法为此Variables目的去工作。
| 归档时间: |
|
| 查看次数: |
553 次 |
| 最近记录: |