如何解决在定义单个 AWS::Serverless::Function 的 SAM 模板中指定多个 API 阶段和 Lambda 别名
我的目标 我正在尝试编写一个(单个)SAM 模板来获取由 Api 网关事件触发的 Lambda 函数。
我想要多个 API Stage(比如“dev”、“testing”、“prod”),并且我希望它们中的每一个都映射到一个同名的 Lambda 别名上。
我不想在每次部署时生成新的 lambda 版本,我喜欢手动设置每个 lambda 别名使用的 lambda 版本。当然,“dev”别名的意思是指向 $LATEST 代码版本。
我尝试了什么,得到了什么
我修改了经典的“hello_world”模板如下。 现在,当第一次部署(比如“开发”)时,一切似乎都按预期工作。 但是如果我尝试部署到“测试”阶段,这个新阶段的 API 会响应,而“开发”阶段的 API 会停止响应。
我错过了什么?
AWstemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
zzzz
Sample SAM Template for zzzz
# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
Function:
Timeout: 3
Parameters:
StageAliasName:
Description: stage / alias name to be used in this deploy
Type: String
AllowedValues:
- prod
- stage
- dev
- v1
Default: dev
Resources:
ApiGatewayApi:
Type: AWS::Serverless::Api
Properties:
StageName: !Ref StageAliasName
HelloWorldFunction:
Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
Properties:
CodeUri: hello_world/
Handler: app.lambda_handler
Runtime: python3.8
AutopublishAlias: !Ref StageAliasName
FunctionName: zzz
Environment:
Variables:
stage: !Ref StageAliasName
Events:
HelloWorld:
Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
Properties:
RestApiId: !Ref ApiGatewayApi
Path: /hello
Method: GET
# Auth:
# ApiKeyrequired: true
Outputs:
# ServerlessRestApi is an implicit API created out of Events key under Serverless::Function
# Find out more about other implicit resources you can reference within SAM
# https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api
# HelloWorldApi:
# Description: "API Gateway endpoint URL for Prod stage for Hello World function"
# Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"
HelloWorldFunction:
Description: "Hello World Lambda Function ARN"
Value: !GetAtt HelloWorldFunction.Arn
HelloWorldFunctionIamRole:
Description: "Implicit IAM Role created for Hello World function"
Value: !GetAtt HelloWorldFunctionRole.Arn
解决方法
我和你有同样的问题,发现这个:https://jun711.github.io/aws/deploy-api-gateway-to-multiple-stage-when-aws-sam-replaces-previous-stages/。看起来 SAM 取代了之前的阶段。
这个 jun chap 做了一些手动步骤来使它工作。很高兴知道它有效,但有点破坏“基础设施即代码”,我想我将使用 ansible 为不同环境模板化出不同版本的模板,然后直接运行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。