【问题标题】:AWS Lambda Function (NodeJS) using a Docker image fails on invocation使用 Docker 映像的 AWS Lambda 函数 (NodeJS) 调用失败
【发布时间】:2022-02-15 23:22:55
【问题描述】:

我有一个打包为 Docker 容器的 lambda 函数。该应用程序非常简单,结构如下:

├── Dockerfile
├── app.js
├── package-lock.json
└── package.json

package.json 是:

{
  "name": "docker-lambda-test",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

app.js 是:

module.exports.handler = async (event, context) => {
  return "test";
};

Dockerfile 是:

FROM public.ecr.aws/lambda/nodejs:14
COPY app.js package*.json ${LAMBDA_TASK_ROOT}
RUN npm install
CMD [ "app.handler" ]

构建镜像并使用 AWS RIE 执行后,调用失败并出现错误:

docker run -d -v ~/.aws-lambda-rie:/aws-lambda -p 9000:8080 \
  --entrypoint /aws-lambda/aws-lambda-rie  lambda-docker-demo:latest
ced1fcef9cdf2e275d1680b889ac1e08afb63d80d6d04f4280ae2f9f836631c3



curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
{"errorType":"TypeError","errorMessage":"Cannot read property 'includes' of undefined","trace":["TypeError: Cannot read property 'includes' of undefined","    at _throwIfInvalidHandler (/var/runtime/UserFunction.js:210:25)","    at Object.module.exports.load (/var/runtime/UserFunction.js:237:3)","    at Object.<anonymous> (/var/runtime/index.js:43:30)","    at Module._compile (internal/modules/cjs/loader.js:1085:14)","    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)","    at Module.load (internal/modules/cjs/loader.js:950:32)","    at Function.Module._load (internal/modules/cjs/loader.js:790:12)","    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12)","    at internal/main/run_main_module.js:17:47"]}

我怎样才能让这个简单的 Lambda 函数打包为 Docker 映像来工作?

【问题讨论】:

  • 您检查过this 文档吗?
  • 是的 - 但我面临同样的错误

标签: node.js amazon-web-services docker aws-lambda


【解决方案1】:

您需要将代码复制到正确的目录中:

/var/task

所以这应该可以解决问题:

COPY app.js package*.json /var/task

【讨论】:

  • 我将 Dockerfile 更改为使用:COPY app.js package*.json /var/task,但通过 AWS RIE 运行时出现相同的错误
  • @ProgFan666 什么是 AWS RIE?它可以在 AWS 上运行吗?
  • AWS RIE 是 AWS 提供的用于在本地测试容器 lambda 映像的工具 - docs.aws.amazon.com/lambda/latest/dg/images-test.html。我在 AWS 上也遇到了同样的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
  • 2017-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多