Chrome - 用于AWS Lambda的无头?

Ser*_*kin 10 google-chrome chromium amazon-web-services aws-lambda

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

它现在只适用于Canary,但它正在Chrome 57中正式发布.

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

Mar*_*thy 13

是; 这是可能的.

编译Headless Chrome的非调试版本会生成~125 MB的二进制文件,并且在gzip压缩时不到44 MB.这意味着它适合功能部署包的250 MB未压缩和50 MB大小限制.

(目前)需要的是强制Chrome在不使用/ dev/shm的共享内存的情况下进行编译.即使世界上的话题线程无头-dev的谷歌组在这里.

以下是我用于构建可在AWS Lambda上运行的无头Chrome二进制文件的步骤.他们是基于这个这个.

  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.2x大型机上需要2-3天,或者在c4.4x大型机上需要大约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
Run Code Online (Sandbox Code Playgroud)

百胜会抱怨一些不存在的包裹.随你.我没有调查过他们.但是,似乎没有阻止我构建headless_shell.忽略那个小小的百胜,然后继续前进.下一个:

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
Run Code Online (Sandbox Code Playgroud)

此时,我们需要对Chrome代码进行非常小的更改.默认情况下,在Linux上,Chrome假定存在tmpfs /dev/shm.Lambda函数没有可用的tmpfs.:-(

我们要改变的文件是src/base/files/file_util_posix.cc.进行修改GetShmemTempDir(),使其始终返回OS temp dir(/tmp).一种简单的方法是删除函数中的整个#if defined(OS_LINUX)GetShmemTempDir().一个不太剧烈的变化是硬编码use_dev_shmfalse:

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);
}
Run Code Online (Sandbox Code Playgroud)

有了这个改变,就该编译了.在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
Run Code Online (Sandbox Code Playgroud)

最后,我们制作了一个我们需要在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/
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

由于/ tmp是Lambda函数中唯一可写的位置,因此有一堆标志只是告诉Chrome在哪里转储它的数据.它们不是必需的,但它让Chrome很开心.还要注意,有人提到,使用--disable-gpu标志,我们不需要libosmesa.so,遗漏将从我们的包zip中削减大约4 MB.

我开始这个项目的目的是让它更容易上手.它配备了预制的无头Chrome二进制文件,您可以在此处获取.