2

问题

我有一个在 AWS lambda中运行的网络爬虫,但几周后 AWS lambda 将停止支持 Ruby 2.7。我去年使用本教程构建了我的刮刀。

我需要找到与Ruby 2.7兼容的 chrome 驱动程序和无头 chrome 版本,但我不知道从哪里开始。

我查看了ChromeDriver 的下载门户,但我没有看到任何迹象表明 Chrome 驱动程序适用于 ruby​​ 2.7 或任何其他特定版本的 ruby​​。

我的代码通过访问 ChromeDriver 二进制文件并在特定文件夹中启动它来工作

我通过运行以下命令下载了我正在使用的特定二进制文件:

# serverless chrome
wget https://github.com/adieuadieu/serverless-chrome/releases/download/v1.0.0-37/stable-headless-chromium-amazonlinux-2017-03.zip
unzip stable-headless-chromium-amazonlinux-2017-03.zip -d bin/
rm stable-headless-chromium-amazonlinux-2017-03.zip

# chromedriver
wget https://chromedriver.storage.googleapis.com/2.37/chromedriver_linux64.zip
unzip chromedriver_linux64.zip -d bin/
rm chromedriver_linux64.zip
4

1 回答 1

1

解决方案

我找到了解决这个问题的方法。Lambda 默认提供的 Ruby 2.7 运行在 Amazon Linux 2(缺少许多重要的库和依赖项)之上,不幸的是,您无法更改它。

但是,Amazon 为您提供了在最大 10GB 的自定义 docker 镜像中运行代码的能力。

我通过使用以下 Dockerfile 创建自己的图像来解决此问题

FROM public.ecr.aws/lambda/ruby:2.7

# Install dependencies needed to run MySQL & Chrome

RUN yum -y install libX11
RUN yum -y install dejavu-sans-fonts
RUN yum -y install procps
RUN yum -y install mysql-devel
RUN yum -y install tree
RUN mkdir /var/task/lib
RUN cp /usr/lib64/mysql/libmysqlclient.so.18 /var/task/lib
RUN gem install bundler
RUN yum -y install wget
RUN yum -y groupinstall 'Development Tools'

# Ruby Gems

ADD Gemfile ${LAMBDA_TASK_ROOT}/
ADD Gemfile.lock ${LAMBDA_TASK_ROOT}/
RUN bundle config set path 'vendor/bundle' && \
    bundle install

# Install chromedriver & chromium

RUN mkdir ${LAMBDA_TASK_ROOT}/bin

# Chromium
RUN wget https://github.com/adieuadieu/serverless-chrome/releases/download/v1.0.0-37/stable-headless-chromium-amazonlinux-2017-03.zip
RUN unzip stable-headless-chromium-amazonlinux-2017-03.zip -d ${LAMBDA_TASK_ROOT}/bin/
RUN rm stable-headless-chromium-amazonlinux-2017-03.zip

# Chromedriver

RUN wget https://chromedriver.storage.googleapis.com/2.37/chromedriver_linux64.zip
RUN unzip chromedriver_linux64.zip -d ${LAMBDA_TASK_ROOT}/bin/
RUN rm chromedriver_linux64.zip

# Copy function code

COPY app.rb ${LAMBDA_TASK_ROOT}

WORKDIR ${LAMBDA_TASK_ROOT}

RUN tree
RUN ls ${LAMBDA_TASK_ROOT}/bin
# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "app.handle" ]

笔记

  1. 如果您的代码以前使用 zip 文件部署,您将不得不销毁以前的函数或使用代码更新创建第二个函数,这一切都归结为您希望如何处理部署。
  2. 可以使用无服务器框架自动化部署过程
于 2021-07-01T19:18:55.283 回答