部署为 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.lambdaHandler
和 exports.lambdaHandler2
。我假设相应的 python 文件应该进行类似的修改。
以这种方式更新 template.yaml
后,sam local start-api
按预期工作,将 /hello
路由到 lambdaHandler
并将 /hello2
路由到 lambdaHandler2
。
这在技术上创建了两个单独的 Docker 图像(每个不同的 DockerTag
值一个)。但是,除了标签之外,这两张图片将完全相同,并且基于相同的 Dockerfile
,因此第二张图片将使用第一张图片的 Docker 缓存。
当在 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.lambdaHandler
和 exports.lambdaHandler2
。我假设相应的 python 文件应该进行类似的修改。
以这种方式更新 template.yaml
后,sam local start-api
按预期工作,将 /hello
路由到 lambdaHandler
并将 /hello2
路由到 lambdaHandler2
。
这在技术上创建了两个单独的 Docker 图像(每个不同的 DockerTag
值一个)。但是,除了标签之外,这两张图片将完全相同,并且基于相同的 Dockerfile
,因此第二张图片将使用第一张图片的 Docker 缓存。