来自“经典/标准”开发,我习惯于有不同的部署阶段,例如暂存和生产,每个阶段都有其应用程序版本。
AWS Lambda 函数和 API 网关让我对如何处理版本和发布感到困惑,也许是因为我试图以在 AWS 上不正确的方式执行此操作。
Lambda 函数可以同时具有版本和别名,而网关可以具有阶段,因此我希望能够有一个指向函数生产版本的别名和一个指向暂存版本的别名,并且每个别名都在两个阶段的同一个网关资源上被调用,例如:
但似乎 api 网关阶段不能调用不同的 lambda 函数别名或版本,我可以在阶段资源中覆盖的唯一内容只是 CloudWatch 和节流设置。
我可能缺少了有关 AWS 开发这方面的一些信息,有人能给我指出正确的方向吗?
需要说明的是,我正在使用 vscode 和 aws/sam cli 进行 AWS 开发,任何需要通过 Web 界面完成的事情在我看来都是错误的,即使我知道这样做可能会存在技术/逻辑/业务限制,所以如果可能的话,我更喜欢涉及代码生成或 cli 命令的答案。
更新 #1
正如@Purefan 在他的评论中所建议的那样,使用 HTTP API 的阶段文档的部分解释了如何使用阶段变量来引用每个网关阶段上的不同 lambda 版本/别名,问题是我无法创建staging
指向来自 sam cli 的最新版本的函数别名:
aws lambda create-alias --function-name test-hello-world --name staging --function-version $LATEST
usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:
aws help
aws <command> help
aws <command> <subcommand> help
aws: error: argument --function-version: expected one argument
我确实回退到从 Web 控制台创建它,但现在似乎sam deploy
来自 CLI 的任何内容都会覆盖网关资源中的别名引用(函数名称+阶段变量),这可能是因为我的本地“template.yaml”中缺少此配置。
答案1
很高兴它有帮助:)
对于 API Gateway,对 lambda 的引用是一个字符串,我们可以使用该字符串中的变量指向不同的 lambda。方便的是,API Gateway 支持阶段变量,因此您可以在阶段“production”中定义一个指向名为“production”的 lambda 版本的变量,另一个阶段可以使用相同的变量指向另一个 lambda 或另一个 lambda 版本。
更多信息请见这里