是的;有可能。
编译Headless Chrome 的非调试版本会生成约125 MB 的二进制文件,压缩后的大小略低于44 MB。这意味着它适合函数部署包的 250 MB 未压缩和 50 MB 大小limitation。
(当前)需要的是强制 Chrome 在不使用 /dev/shm 的共享内存的情况下进行编译。在headless-dev google 组here 上有一个关于该主题的主题。
以下是我用来构建可在 AWS Lambda 上运行的无头 Chrome 二进制文件的步骤。它们基于this 和this。
- 使用名称为 amzn-ami-hvm-2016.03.3.x86_64-gp2 (us-west-2 ami-7172b611) 的社区 AMI 创建一个新的 EC2 实例。
- 选择具有至少 16 GB 内存的实例类型。在 t2.xlarge 上编译时间大约需要 4-5 小时,在 t2.2xlarge 上需要 2-3ish 或者在 c4.4xlarge 上大约需要 45 分钟。
- 给自己一个至少 30 GB 的根卷(如果您想编译一个调试版本,则为 40 GB - 因为它太大,您将无法上传到 Lambda。)
- 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。