使用 Docker 映像的 AWS Lambda 函数出现未找到模块错误

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

我有一个简单的 Node.js 应用程序,运行 puppeteer 来从网站提取和处理报告。

我遇到了 chromium 和 lambda 的一些兼容性问题,因此我决定将应用程序包含在 Docker 容器中。这是我的 Dockerfile :

FROM public.ecr.aws/lambda/nodejs:18

# Install dependencies
RUN yum install -y \
    fontconfig \
    freetype \
    git \
    bzip2 \
    && yum clean all \
    && rm -rf /var/cache/yum

# Copy package.json and package-lock.json files to the /app directory in the container
COPY package*.json ./

# Install production dependencies, including puppeteer-core and chrome-aws-lambda
RUN npm install chrome-aws-lambda puppeteer-core && \
    npm install

# Copy the rest of the application code to the /app directory
COPY ./src ./src
COPY ./handler.js ./handler.js

# Set the command to run the Lambda function handler
CMD ["handler.handler"]

我在本地构建并运行了图像,一切都运行良好。然后,我推送到 AWS ECR 并使用推送的图像创建了一个 Lambda 函数。

当我使用有效事件测试 lambda 函数时,我总是收到此错误:

{
  "errorType": "Runtime.ImportModuleError",
  "errorMessage": "Error: Cannot find module 'liveiq'\nRequire stack:\n- /var/runtime/index.mjs",
  "trace": [
    "Runtime.ImportModuleError: Error: Cannot find module 'liveiq'",
    "Require stack:",
    "- /var/runtime/index.mjs",
    "    at _loadUserApp (file:///var/runtime/index.mjs:1087:17)",
    "    at async UserFunction.js.module.exports.load (file:///var/runtime/index.mjs:1119:21)",
    "    at async start (file:///var/runtime/index.mjs:1282:23)",
    "    at async file:///var/runtime/index.mjs:1288:1"
  ]
}

我的 handler.js 是位于项目根目录的文件,其余代码位于 /src 目录中。这是我的 handler.js 文件:

('use strict');

const { getEmployees, putEmployees, getReportingData } = require('./src/liveiq.js');

exports.handler = async (event, context) => {
  // Log the event for debugging purposes
  const { functionName, startDate, endDate } = event;
  console.log('Current working directory:', process.cwd());

  if (functionName === 'getEmployees') {
    return await getEmployees();
  } else if (functionName === 'putEmployees') {
    return await putEmployees(event);
  } else if (functionName === 'getReporting') {
    return await getReportingData(startDate, endDate);
  } else {
    throw new Error('Function not found');
  }
};

我尝试了 Dockerfile 的多种变体 我尝试覆盖 AWS Lambda 中的 CWD 和 CMD 我从 aws ecr 中提取并运行了图像,所有文件都已正确复制到 /var/task 中

我已经没有主意了......

node.js docker aws-lambda puppeteer amazon-ecr
1个回答
0
投票

Cannot find module x
错误通常由以下原因引起:

  • 文件路径无效
  • 文件名错误
  • 丢失文件

如果没有文件夹结构,就没有太多上下文可以深入挖掘。 您可以使用 Docker Deamon 在本地运行容器,并从那里检查文件夹结构并检查它是否与“非 Docker”结构匹配

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