sam.yml 文件中的多个 Lambda 函数

Multiple Lambda functions from the sam.yml file

仍在等待 AWS 对此的实际支持: https://github.com/aws-samples/aws-serverless-samfarm/issues/5

这应该如何工作?

我的用例是我有一个 API 网关前端 lambda,它将事件写入 SNS 主题。我有另一个订阅该主题的 lambda。

这些 lambda 可以在单独的 repos 中吗?是的。首先使用 pub/sub 模式来分隔这两个应用程序的部分目的是什么?是的。

但这是一个简单的应用程序。该主题不会与其他功能共享,并且整个内容都是独立的。理想情况下,它们应该一起部署在同一个模板中。

我可以轻松地将我想要的所有功能添加到我的 SAM 模板中,但我该如何部署它们?他们每个人都应该有不同的 CodeURI 吗?这意味着我需要编写脚本复制并将每个 lambda 依赖项安装到不同的文件夹中,然后将模板中每个 lambda 的 codeuri 指向不同的文件夹。

这个没有更好的支持吗?

您可以在一个模板中拥有任意数量的 AWS::Serverless::Function 资源,只要它们具有唯一的逻辑 ID。

如果您希望将多个 lambda 函数保存在一个存储库中,则必须为每个 lambda 提供不同的 CodeUri。例如 CodeUri: ./handler-my-lambda-one.zipCodeUri: ./handler-my-lambda-two.zip

通常,在你的存储库中有一个 Makefile 是一个很好的做法,它有一个 build 目标负责准备 handler-my-lambda-*.zip 类似的东西:

build: 
    rm -rf node_modules
    npm install
    zip -r handler.zip index.js lib node_modules

和一个 deploy 目标,它将 package 您的代码(将代码上传到 s3)并部署 cloudformation。

package命令负责上传CodeUri中指定的zip神器,并在sam.out.yaml[=27]中替换为s3URL =]

deploy:
    aws cloudformation package \
        --template-file sam.yaml \
        --output-template-file sam.out.yaml \
        --s3-bucket my-artifact-bucket-name

    aws cloudformation deploy \
        --template-file sam.out.yaml

既然你决定在一个存储库中有多个 lambda,你可能会对每个 lambda 函数有两个 build 命令和一些 cd ... 逻辑来改变每个函数的工作目录