簡體   English   中英

Chrome - 用於AWS Lambda的無頭?

[英]Chrome --headless for AWS Lambda?

具有無頭模式的Chrome已經可用於linux: https//chromium.googlesource.com/chromium/src/+/lkgr/headless/README.md

它現在只適用於Canary,但它正在Chrome 57中正式發布。

有沒有機會在aws lambda上運行Google Chrome?

是; 這是可能的。

編譯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

百勝會抱怨一些不存在的包裹。 隨你。 我沒有調查過他們。 但是,似乎沒有阻止我構建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

此時,我們需要對Chrome代碼進行非常小的更改。 默認情況下,在Linux上,Chrome假設在/dev/shm存在tmpfs。 Lambda函數沒有可用的tmpfs。 :-(

我們要更改的文件是src/base/files/file_util_posix.cc 修改GetShmemTempDir() ,使其始終返回OS temp dir( /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很開心。 還要注意,有人提到使用--disable-gpu標志,我們不需要libosmesa.so ,遺漏的東西會從我們的包zip中libosmesa.so大約4 MB。

我開始這個項目的目的是讓它更容易上手。 它配備了預制的無頭Chrome二進制文件,您可以在此處獲取。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM