Chrome - 用于AWS Lambda的无头?

时间:2017-03-07 12:27:26

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

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

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

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

1 个答案:

答案 0 :(得分:13)

< p为H.是;它是可能的。< / p> < p>编译< a href =" https://cs.chromium.org/chromium/src/headless/app/"的非调试版本。 rel =" noreferrer"> Headless Chrome< / a>产生一个〜125 MB的二进制文件,并且在压缩时产生不到44 MB的二进制文件。这意味着它适合250 MB未压缩和50 MB大小< a href =" http://docs.aws.amazon.com/lambda/latest/dg/limits.html"的rel =" noreferrer">限制< / A>对于该功能的部署包。< / p> < p>当前需要的是强制Chrome在不使用/ dev / shm的共享内存的情况下进行编译。这是关于< a href =" https://groups.google.com/a/chromium.org/forum/#!forum / headless-dev"上主题的主题。的rel =" noreferrer">无头-dev的< / A> google group< a href =" https://groups.google.com/a/chromium.org/d/msg/headless-dev/qqbZVZ2IwEw/CPInd55OBgAJ"的rel =" noreferrer">此处< / A>。< / p为H. < p>以下是我用于构建可在AWS Lambda上运行的无头Chrome二进制文件的步骤。他们基于< a href =" http://www.zackarychapple.guru/chrome/2016/08/24/chrome-headless.html"的rel =" noreferrer">这< / A>和< a href =" https://chromium.googlesource.com/chromium/src/+/master/docs/linux_build_instructions.md"的rel =" noreferrer">这< / A>。< / p为H. <醇> < li>使用社区AMI创建一个新的EC2实例,名称为amzn-ami-hvm-2016.03.3.x86_64-gp2(us-west-2 ami-7172b611)。< / li> < li>选择具有至少16 GB内存的实例类型。编译时间在t2.xlarge上大约需要4-5个小时,或者在t2.2x大型机上需要2-3天,或者在c4.4xlarge上大约需要45分钟。< / li> < li>给自己一个至少30 GB的根卷(如果你想编译一个调试版本,那就是40 GB - 你赢了也无法上传到Lambda,因为它也是大)LT; /立GT; < li> SSH进入新实例并运行:< / li> < /醇> < pre class =" lang-bash prettyprint-override">< code> sudo printf" LANG = en_US.utf-8 \ nLC_ALL = en_US.utf-8" >>在/ etc /环境 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 libcapomic 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 < /代码>< /预> &LT p为H.;< EM>荫< / EM>会抱怨一些不存在的包裹。随你。我没有调查过他们。但是,似乎没有阻止我构建headless_shell。忽略whiney little< em> Yum< / em>然后继续前进。下一步:其中/ p为H. < pre class =" lang-bash prettyprint-override">< code> 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 < /代码>< /预> < p>此时我们需要对Chrome代码进行非常小的更改。默认情况下,在Linux上,Chrome会假定在< code> / dev / shm< / code>处有一个tmpfs。 Lambda函数没有可用的tmpfs。 : - (小于/ p为H. < p>我们要更改的文件是< code> src / base / files / file_util_posix.cc< / code>。修改< code> GetShmemTempDir()< / code>这样它总是返回OS temp dir(< code> / tmp< / code>)。一种简单的方法是删除整个< code> #if defined(OS_LINUX)< / code>阻止< code> GetShmemTempDir()< / code>功能。一个不太激烈的变化是硬编码< code> use_dev_shm< / code>到< code> false< / code>:< / p> < pre class =" lang-cc prettyprint-override">< code> 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; //< - 添加此内容。是的,非常黑客   if(use_dev_shm){     * path = FilePath(" / dev / shm");     返回true;   } #万一   return GetTempDir(path); } < /代码>< /预> < p>随着这一变化,它的编译时间。在< code> src< / code>中备份内容目录,设置一些编译参数,然后(最后一个命令)启动构建过程。< / p> < pre class =" lang-bash prettyprint-override">< code> mkdir -p out / Headless echo' import(" // build / args / headless.gn")' >出/无头/ args.gn echo' is_debug = false' >>出/无头/ args.gn echo' symbol_level = 0' >>出/无头/ args.gn echo' is_component_build = false' >>出/无头/ args.gn echo' remove_webcore_debug_symbols = true' >>出/无头/ args.gn echo' enable_nacl = false' >>出/无头/ args.gn gn gen out /无头 ninja -C out / Headless headless_shell < /代码>< /预> < p>最后,我们制作了一个我们需要在Lambda中运行的相关文件的tarball。< / p> < pre class =" lang-bash prettyprint-override">< code> mkdir out / headless-chrome&&熄灭 cp Headless / headless_shell Headless / libosmesa.so headless-chrome / tar -zcvf chrome-headless-lambda-linux-x64.tar.gz headless-chrome / < /代码>< /预> < p>在Lambda中,运行< code> headless_shell< / code>通过执行以下命令启用远程调试器接口:< / p> < pre class =" lang-bash prettyprint-override">< code> / 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 < /代码>< /预> < p>由于/ tmp是Lambda函数中唯一可写的位置,因此有一堆标志只是告诉Chrome在哪里转储它的数据。它们没有必要,但它让Chrome很开心。另请注意,它已经< a href =" https://groups.google.com/a/chromium.org/d/msg/headless-dev/qqbZVZ2IwEw/XMKlEMP3EQAJ"的rel =" noreferrer">提到< / A>使用< code> - disable-gpu< / code>标志,我们不需要< code> libosmesa.so< / code&gt ;,遗漏了我们的包zip将减少大约4 MB。< / p> < p>我已经开始< a href =" https://github.com/adieuadieu/serverless-chrome"的rel =" noreferrer">这< / A>项目旨在使其更容易上手。它带有一个预先构建的无头Chrome二进制文件,你可以得到< a href =" https://github.com/adieuadieu/serverless-chrome/tree/master/chrome"的rel =" noreferrer">此处< / A>。< / p为H.