来自“经典/标准”开发,我习惯于有不同的部署阶段,例如暂存和生产,每个阶段都有其应用程序版本。
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”中缺少此配置。
很高兴它有所帮助 :)
对于 API 网关,对 lambda 的引用是一个字符串,我们可以使用该字符串中的变量来指向不同的。方便的是,API Gateway 支持阶段变量,因此您可以在阶段“生产”中定义一个变量,该变量将指向名为“生产”的 lambda 版本,另一个阶段可以将相同的变量指向另一个 lambda 或另一个 lambda 版本。
更多信息可以在这里找到