我有一个简单的 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 中
我已经没有主意了......
Cannot find module x
错误通常由以下原因引起:
如果没有文件夹结构,就没有太多上下文可以深入挖掘。 您可以使用 Docker Deamon 在本地运行容器,并从那里检查文件夹结构并检查它是否与“非 Docker”结构匹配