我想使用无服务器框架设置一个简单的 Docker 化 API。我做错了什么,因为一旦我访问 Lambda 函数 URL,CloudWatch 就会抛出
Runtime.InvalidEntrypoint
错误。
我使用的命令是:
都成功了。
错误:
INIT_REPORT Init Duration: 4.66 ms Phase: init Status: error Error Type: Runtime.InvalidEntrypoint
INIT_REPORT Init Duration: 0.58 ms Phase: invoke Status: error Error Type: Runtime.InvalidEntrypoint
START RequestId: 42c8d6e8-e848-461c-a6bd-5eebb839d86b Version: $LATEST
RequestId: 42c8d6e8-e848-461c-a6bd-5eebb839d86b Error: fork/exec /lambda-entrypoint.sh: exec format error Runtime.InvalidEntrypoint
./app.js
"use strict";
module.exports.handler = async (event) => {
return {
statusCode: 200,
body: JSON.stringify(
{
message: `Hello, world!`,
},
null,
2
),
};
};
./Dockerfile
FROM public.ecr.aws/lambda/nodejs:18
COPY package.json ./
RUN npm install
COPY app.js .
CMD ["app.handler"]
./serverless.yml
service: lambda-hello
provider:
name: aws
region: ap-southeast-1
ecr:
images:
appimage:
path: ./
functions:
hello:
image:
name: appimage
command:
- app.handler
events:
- http:
path: /{any+}
method: any
使 API 可运行且可访问。
我过去也遇到过类似的问题,就我而言,问题出在我的 Dockerfile 中配置 Lambda 入口点的方式,这与您所展示的非常相似。您可以在此处
阅读有关使用 lambda 容器映像的更多信息通常,AWS Lambda 基础映像在内部处理命令和入口点,如果您的处理程序是用支持的语言编写的并遵循预期的命名约定(您已经这样做了),则不需要显式指定它们。
您在无服务器框架配置 (
serverless.yml
) 文件中的函数定义中指定的处理程序很好。因此,只需修改您的 Dockerfile 以删除最后一行:
FROM public.ecr.aws/lambda/nodejs:18
COPY package*.json ./
RUN npm install
COPY app.js .
# The base image's CMD is used by default; no need to specify CMD ["app.handler"]
更改 Dockerfile 后,重建 Docker 映像,并使用无服务器框架重新部署服务:
serverless deploy
进行这些更改后,AWS Lambda 将自动使用基础映像中定义的入口点,并将根据
command
中指定的 serverless.yml
定位您的处理程序。