【问题标题】:Chrome --headless for AWS Lambda?Chrome——AWS Lambda 的无头?
【发布时间】:2017-07-27 15:53:50
【问题描述】:

具有无头模式的 Chrome 已经可用于 linux: https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.md

它目前仅适用于 Canary,但它会在 Chrome 57 中正式发布。

是否有机会在 aws lambda 上运行 Google Chrome?

【问题讨论】:

标签: google-chrome amazon-web-services aws-lambda chromium


【解决方案1】:

是的;有可能。

编译Headless Chrome 的非调试版本会生成约125 MB 的二进制文件,压缩后的大小略低于44 MB。这意味着它适合函数部署包的 250 MB 未压缩和 50 MB 大小limitation

(当前)需要的是强制 Chrome 在不使用 /dev/shm 的共享内存的情况下进行编译。在headless-dev google 组here 上有一个关于该主题的主题。

以下是我用来构建可在 AWS Lambda 上运行的无头 Chrome 二进制文件的步骤。它们基于thisthis

  1. 使用名称为 amzn-ami-hvm-2016.03.3.x86_64-gp2 (us-west-2 ami-7172b611) 的社区 AMI 创建一个新的 EC2 实例。
  2. 选择具有至少 16 GB 内存的实例类型。在 t2.xlarge 上编译时间大约需要 4-5 小时,在 t2.2xlarge 上需要 2-3ish 或者在 c4.4xlarge 上大约需要 45 分钟。
  3. 给自己一个至少 30 GB 的根卷(如果您想编译一个调试版本,则为 40 GB - 因为它太大,您将无法上传到 Lambda。)
  4. SSH 进入新实例并运行:
sudo printf "LANG=en_US.utf-8\nLC_ALL=en_US.utf-8" >> /etc/environment
sudo yum install -y git redhat-lsb python bzip2 tar pkgconfig atk-devel alsa-lib-devel bison binutils brlapi-devel bluez-libs-devel bzip2-devel cairo-devel cups-devel dbus-devel dbus-glib-devel expat-devel fontconfig-devel freetype-devel gcc-c++ GConf2-devel glib2-devel glibc.i686 gperf glib2-devel gtk2-devel gtk3-devel java-1.*.0-openjdk-devel libatomic libcap-devel libffi-devel libgcc.i686 libgnome-keyring-devel libjpeg-devel libstdc++.i686 libX11-devel libXScrnSaver-devel libXtst-devel libxkbcommon-x11-devel ncurses-compat-libs nspr-devel nss-devel pam-devel pango-devel pciutils-devel pulseaudio-libs-devel zlib.i686 httpd mod_ssl php php-cli python-psutil wdiff --enablerepo=epel

Yum 会抱怨某些软件包不存在。任何。我没有调查过他们。不过,似乎并没有阻止我构建 headless_shell。忽略 whiney little Yum 并继续前进。下一个:

git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
echo "export PATH=$PATH:$HOME/depot_tools" >> ~/.bash_profile
source ~/.bash_profile
mkdir Chromium && cd Chromium
fetch --no-history chromium
cd src

此时我们需要对 Chrome 代码做一个很小的改动。默认情况下,在 Linux 上,Chrome 假定在/dev/shm 有一个 tmpfs。 Lambda 函数没有可用的 tmpfs。 :-(

我们要修改的文件是src/base/files/file_util_posix.cc。修改 GetShmemTempDir() 使其始终返回操作系统临时目录 (/tmp)。一个简单的方法是删除GetShmemTempDir() 函数中的整个#if defined(OS_LINUX) 块。一个不太剧烈的变化是将use_dev_shm 硬编码为false

bool GetShmemTempDir(bool executable, FilePath* path) {
#if defined(OS_LINUX)
  bool use_dev_shm = true;
  if (executable) {
    static const bool s_dev_shm_executable = DetermineDevShmExecutable();
    use_dev_shm = s_dev_shm_executable;
  }

// cuz lambda
use_dev_shm = false; // <-- add this. Yes it's pretty hack-y

  if (use_dev_shm) {
    *path = FilePath("/dev/shm");
    return true;
  }
#endif
  return GetTempDir(path);
}

有了这个改变,就该编译了。在src 目录中备份内容,设置一些编译参数,然后(最后一个命令)开始构建过程。

mkdir -p out/Headless
echo 'import("//build/args/headless.gn")' > out/Headless/args.gn
echo 'is_debug = false' >> out/Headless/args.gn
echo 'symbol_level = 0' >> out/Headless/args.gn
echo 'is_component_build = false' >> out/Headless/args.gn
echo 'remove_webcore_debug_symbols = true' >> out/Headless/args.gn
echo 'enable_nacl = false' >> out/Headless/args.gn
gn gen out/Headless
ninja -C out/Headless headless_shell

最后,我们为需要在 Lambda 中运行的相关文件制作一个 tarball。

mkdir out/headless-chrome && cd out
cp Headless/headless_shell Headless/libosmesa.so headless-chrome/
tar -zcvf chrome-headless-lambda-linux-x64.tar.gz headless-chrome/

在 Lambda 中,运行 headless_shell 并通过执行以下命令启用远程调试器接口:

/path/to/headless_shell --disable-gpu --no-sandbox --remote-debugging-port=9222 --user-data-dir=/tmp/user-data --single-process --data-path=/tmp/data-path --homedir=/tmp --disk-cache-dir=/tmp/cache-dir

由于 /tmp 是 Lambda 函数中唯一可写的位置,因此有一堆标志只是告诉 Chrome 将其数据转储到哪里。它们不是必需的,但它让 Chrome 很高兴。另请注意,mentioned 带有 --disable-gpu 标志,我们不需要 libosmesa.so,省略它会从我们的压缩包中减少大约 4 MB。

我已经启动了this 项目,目的是让它更容易上手。它带有一个预构建的无头 Chrome 二进制文件,您可以获取 here

【讨论】:

  • 没有可用的沙箱!更新您的内核或查看chromium.googlesource.com/chromium/src/+/master/docs/… 以获取有关使用 SUID 沙箱进行开发的更多信息。如果你想危险地生活并需要立即解决,你可以尝试使用 --no-sandbox。
  • 出现上述错误,尝试使用 --no-sandbox 但超时
猜你喜欢
  • 2020-05-16
  • 2019-10-20
  • 1970-01-01
  • 2021-09-15
  • 2022-01-14
  • 2021-10-04
  • 1970-01-01
  • 2020-03-11
  • 2021-03-20
相关资源
最近更新 更多