部署为 Docker 图像时如何 运行 多个 lambda 函数?

How to run multiple lambda functions when deploying as a Docker image?

当在 templates.yaml 中声明多个 functions/apps 时,通过 aws-sam 使用 docker 图像的 aws lambda 看起来如何 dockerfile

这是 dockerfile 到 运行“单个应用”的示例

FROM public.ecr.aws/lambda/python:3.8

COPY app.py requirements.txt ./

RUN python3.8 -m pip install -r requirements.txt -t .

# Command can be overwritten by providing a different command in the template directly.
CMD ["app.lambda_handler"]

Dockerfile本身看起来是一样的。那里不需要更改。

Docker 文件中 CMD 行的存在看起来需要更改,但这是一种误导。 CMD 值可以在 template.yaml 文件中基于每个函数指定。

template.yaml 文件必须使用有关新功能的信息进行更新。您需要为每个函数添加一个 ImageConfig 属性。 ImageConfig 属性 必须以与 CMD 值相同的方式指定函数名称,否则会这样做。

您还需要将每个函数的 DockerTag 值更新为唯一值,尽管 may be a bug.

这是 NodeJs“Hello World”示例 template.yaml 的资源部分,已更新以支持单个 Docker 图像的多个功能:

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      PackageType: Image
      ImageConfig:
        Command: [ "app.lambdaHandler" ]
      Events:
        HelloWorld:
          Type: Api
          Properties:
            Path: /hello
            Method: get
    Metadata:
      DockerTag: nodejs14.x-v1-1
      DockerContext: ./hello-world
      Dockerfile: Dockerfile
  HelloWorldFunction2:
    Type: AWS::Serverless::Function
    Properties:
      PackageType: Image
      ImageConfig:
        Command: [ "app.lambdaHandler2" ]
      Events:
        HelloWorld:
          Type: Api
          Properties:
            Path: /hello2
            Method: get
    Metadata:
      DockerTag: nodejs14.x-v1-2
      DockerContext: ./hello-world
      Dockerfile: Dockerfile

这假定 app.js 文件已修改为同时提供 exports.lambdaHandlerexports.lambdaHandler2。我假设相应的 python 文件应该进行类似的修改。

以这种方式更新 template.yaml 后,sam local start-api 按预期工作,将 /hello 路由到 lambdaHandler 并将 /hello2 路由到 lambdaHandler2

这在技术上创建了两个单独的 Docker 图像(每个不同的 DockerTag 值一个)。但是,除了标签之外,这两张图片将完全相同,并且基于相同的 Dockerfile,因此第二张图片将使用第一张图片的 Docker 缓存。