繁体   English   中英

您如何为 CDK 中的 aws lambda 覆盖 docker 的“cmd”?

[英]How can you override "cmd" of docker for aws lambda in CDK?

我在 Dockerfile 中写CMD ["main.handler"] in Dockerfile ,但我正在尝试更改处理函数以重用相同的容器映像。 您如何修复我的 CDK 代码? 我找到了 CodeImageConfig接口,但不知道如何使用这个选项。

CDK代码

const fn = new lambda.Function(scope, `lambda-fn`, {
    code: new lambda.AssetImageCode("./lambda/myapp", {
        ignoreMode: IgnoreMode.DOCKER,
        file: "lambda.Dockerfile",
    }),
    handler: lambda.Handler.FROM_IMAGE,
    runtime: lambda.Runtime.FROM_IMAGE,
    tracing: lambda.Tracing.ACTIVE,
    environment: {
        SAMPLE_ENV_VAR: "sample_env_var",
    },
});

lambda.Docker文件

FROM public.ecr.aws/lambda/python:3.9
COPY src/ /var/task/
CMD ["main.handler"]

您正在使用AssetImageCode ,它有一个cmd道具。 文档

cmd?

Type: string[] (optional, default: use the CMD specified in the docker image or Dockerfile.)

Specify or override the CMD on the specified Docker image or Dockerfile.

This needs to be in the 'exec form', viz., [ 'executable', 'param1', 'param2' ].
...
    code: new lambda.AssetImageCode("./lambda/myapp", {
        ignoreMode: IgnoreMode.DOCKER,
        file: "lambda.Dockerfile",
        cmd: ["entrypoint", "main.handler"],
    }),
...

目前将 CDK v2 与 Python 和DockerImageFunction用于一个项目——接受的答案对我不起作用

在我的案例中,我使用的是 AWS 托管图像——具体来说,是public.ecr.aws/lambda/python图像。

文件

此行位于我的Dockerfile ( source ) 的顶部:

FROM --platform=linux/amd64 public.ecr.aws/lambda/python:3.9

注意:在我的案例中,我添加了--platform来解决使用 M1 Mac 进行本地部署的问题。

为了保险起见,我还在 CDK 代码中指定了AMD64作为平台:

from aws_cdk.aws_ecr_assets import Platform

# needed for Mac M1 deployments
# noinspection PyTypeChecker
platform: Platform = Platform.LINUX_AMD64

function = lambda_.DockerImageFunction(
    self, 'MyFunction',
    code=lambda_.DockerImageCode.from_image_asset(
        str(work_dir),
        platform=platform,
        cmd=...,
    ),
)

CDK - 尝试 #1

在我的 CDK 代码中,建议的语法对我不起作用

cmd=['entrypoint', 'main.handler']

来自 CloudWatch 日志的错误:

entrypoint requires the handler name to be the first argument
Error: Runtime exited with error: exit status 142 Runtime.ExitError

CDK - 尝试 #2

在从官方Dockerfile咨询图像后,我还尝试了以下操作:

cmd=['/lambda-entrypoint.sh', 'main.handler']

在尝试运行受影响的 AWS Lambda 函数时,从 CloudWatch 日志中观察到了同样的错误。

CDK - 尝试 #3

什么起作用,只是将处理程序作为第一个参数传递给cmd ,就像我最初在Dockerfile中所做的那样:

cmd=['main.handler']

提示:使用点. 语法贯穿始终。 例如,如果您在$LAMBDA_TASK_ROOT ( /var/task ) 下有一个名为app的目录,并且在该目录中有一个具有函数my_handlerhandlers.py文件,则以下语法将起作用:

 cmd=['app.handlers.my_handler']

现在一切正常。 一切都是好的:-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM