带有无服务器框架的 Dockerized Node API 不起作用

问题描述 投票:0回答:1

我想使用无服务器框架设置一个简单的 Docker 化 API。我做错了什么,因为一旦我访问 Lambda 函数 URL,CloudWatch 就会抛出

Runtime.InvalidEntrypoint
错误。

我使用的命令是:

  • npm 初始化 -y
  • 无服务器部署

都成功了。

错误:

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 可运行且可访问。

node.js docker aws-lambda serverless serverless-framework
1个回答
0
投票

我过去也遇到过类似的问题,就我而言,问题出在我的 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
定位您的处理程序。

© www.soinside.com 2019 - 2024. All rights reserved.