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

xtr*_*ori 7 aws-lambda aws-sam-cli aws-sam

dockerfile在 中声明多个函数/应用程序时,通过 aws-sam 使用 docker 镜像的 aws lambda 看起来怎么样templates.yaml

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"]

Run Code Online (Sandbox Code Playgroud)

Chr*_*sen 3

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

Docker 文件中该行的存在CMD看起来需要更改,但这具有误导性。CMD可以在文件中针对每个函数指定该值template.yaml

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

您还需要将每个函数的DockerTag值更新为唯一,尽管这可能是一个错误

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

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

template.yaml以这种方式更新后,sam local start-api按预期工作,路由/hellolambdaHandler和。/hello2lambdaHandler2

从技术上讲,这会创建两个单独的 Docker 映像(每个不同的DockerTag值一个)。但是,除了标签之外,这两个映像将是相同的,并且基于相同的Dockerfile,因此第二个映像将利用第一个映像的 Docker 缓存。

  • 这实际上创建了两个 docker 镜像标签,从长远来看,这两个标签很难管理。希望 aws sam 团队能够尽快解决这些问题。 (2认同)