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

red*_*888 5 amazon-web-services aws-cloudformation aws-lambda aws-sam-cli aws-sam

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

这应该如何工作?

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

这些lambda是否可以放在单独的存储库中?是。首先使用发布/订阅模式来分离这两个应用程序的目的的一部分吗?是。

但是,这是一个简单的应用程序。该主题将不会与其他功能共享,并且整个过程都是自包含的。理想情况下,应将其全部部署在同一模板中。

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

有没有更好的支持呢?

b.b*_*4rd 5

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

如果您希望在单个存储库中保留多个 lambda 函数,则必须CodeUri为每个 lambda提供不同的值。例如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
Run Code Online (Sandbox Code Playgroud)

以及deploypackage您的代码(将代码上传到 s3)并部署 cloudformation 的目标。

package命令负责上传 中指定的 zip 工件CodeUri并将其替换s3sam.out.yaml

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
Run Code Online (Sandbox Code Playgroud)

由于您决定在单个存储库中拥有多个 lambda,您可能会build为每个 lambda 函数提供两个命令以及一些cd ...更改每个函数工作目录的逻辑