我创建了一个 Ubuntu Docker 映像并将其用作 Lambda 函数。我已经完成了所有先决条件,例如安装 lambda-runtime-interface。 Docker 镜像是通过安装 google-chrome-stable 驱动程序构建的,供 Puppeteer 用于网络爬行应用程序。我只想提一下,我已经尝试过 chrome-aws-lambda,但它没有满足我们的要求。我们需要最新的 Puppeteer npm 软件包,因此我正在使用 Ubuntu 构建自定义 Docker 映像,并且它在容器化环境中运行良好(ECS)。
问题: 当在 AWS Lambda 上运行时,当收到请求并且由 puppeter 函数启动的浏览器崩溃时,下面是堆栈跟踪。
Error: Failed to launch the browser process!
mkdir: cannot create directory '/home/sbx_user1051': Read-only file system
touch: cannot touch '/home/sbx_user1051/.local/share/applications/mimeapps.list': No such file or directory
/usr/bin/google-chrome: line 45: /dev/fd/63: No such file or directory
/usr/bin/google-chrome: line 46: /dev/fd/63: No such file or directory
chrome_crashpad_handler: --database is required
Try 'chrome_crashpad_handler --help' for more information.
[35:35:0828/093835.966383:ERROR:socket.cc(120)] recvmsg: Connection reset by peer (104)
这是我通过 pupeteer 启动 chrome 的函数/参数
const browser = await puppeteer.launch({ headless: "new", executablePath: '/usr/bin/google-chrome', ignoreDefaultArgs: ['--disable-extensions'], args: ['--no-sandbox', '--disable-setuid-sandbox','--no-default-browser-check'], timeout: 0, protocolTimeout: 24000000 });
我知道 Lambda 中只有在“/tmp”中写入文件的目录,但我找不到如何更改 chrome 配置以使用“/tmp”目录而不是“/home/sbx_user1051/.local/share” /应用程序/'
下面是我的 Dockerfile
FROM ubuntu:latest
RUN apt-get update
RUN apt-get install curl wget -y
#Installing NodeJS 16
RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash -
RUN apt-get install nodejs
# Installing dependencies for Google-chrome
RUN apt install -y libxss1 libappindicator1 libindicator7 libasound2 libgconf-2-4 libnspr4 libnss3 libx11-xcb1 libxtst6 xauth xvfb
RUN apt install -y libatk-bridge2.0-0 fonts-liberation libatspi2.0-0 libgbm1 libgtk-4-1 libu2f-udev libvulkan1 libxkbcommon0 xdg-utils
# Installing Google-chrome
RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
RUN dpkg -i google-chrome-stable_current_amd64.deb
RUN apt-get install -f
RUN google-chrome --version
# Installing dependencies for Lambda runtime interface
RUN apt-get install -y \
g++ \
make \
cmake \
unzip \
libtool \
libcurl4-openssl-dev
# Installing lambda runtime interface
RUN apt-get install cmake -y
RUN apt-get install autoconf -y
RUN npm install aws-lambda-ric
# Copy function code
COPY / ${LAMBDA_TASK_ROOT}
RUN npm install
ENV NPM_CONFIG_CACHE=/tmp/.npm
ENV CHROME_USER_DATA_DIR=/tmp/chrome
ENTRYPOINT ["/usr/bin/npx", "aws-lambda-ric"]
CMD ["index.handler"]
您需要将路径更改为 Chrome 可以写入的路径,例如 /tmp。
将 XDG 环境变量更改为 /tmp 文件夹,例如:
export XDG_DATA_HOME=/tmp/.chromium
export XDG_CONFIG_HOME=/tmp/.chromium
export XDG_CACHE_HOME=/tmp/.chromium