在templates.yaml中声明多个函数/应用程序时,通过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"]发布于 2021-02-24 06:26:41
Dockerfile本身看起来是一样的。不需要做任何更改。
Docker文件中的CMD行看起来需要更改,但这是误导性的。可以在template.yaml文件中为每个函数指定CMD值。
必须使用有关新函数的信息更新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的第一个镜像的缓存。
https://stackoverflow.com/questions/65724726
复制相似问题