2017-03-07 125 views
9

鉻與已經可用於Linux無頭模式: https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.mdChrome - 無AWS的Lambda?

它與加納利只適用的權利,但它在Chrome 57

到AWS上運行的λ谷歌瀏覽器的任何機會來了官方?

+1

我想知道同樣的事情。我對它進行了一次破解,但它似乎還沒有正常工作。我的進展在這裏:https://github.com/adieuadieu/thingamajigs/tree/master/serverless-chrome-pdf這裏也有一個關於此主題的主題:https://groups.google.com/a/chromium.org/d/MSG /無頭-dev的/ qqbZVZ2IwEw/Wr9wmgb1EQAJ –

回答

10

是;這是可能的。

編譯的Headless Chrome非調試版本產生一個二進制gzip壓縮時的〜125 MB,和不到44 MB。這意味着它適用於功能部署包中的250 MB未壓縮和50 MB大小limitation。 'S(目前)需要什麼樣的

是迫使瀏覽器不使用共享內存的/ dev/shm的編譯。 Theres關於headless-dev谷歌組here的話題。

這裏是我用來建立無頭的Chrome二進制文件將在AWS LAMBDA工作步驟。它們基於thisthis

  1. 使用社區AMI與名AMZN-AMI-HVM-2016.03.3.x86_64-GP2(美國西2 AMI-7172b611)創建一個新的EC2實例。
  2. 選擇一個具有至少16 GB內存的實例類型。在t2.xlarge上編譯時間大約需要4-5個小時,在t2.2xlarge上需要2-3個小時,在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 

百勝會抱怨有些包不存在。隨你。我沒有看過他們。雖然似乎沒有阻止我構建headless_shell。忽略whiney小百勝並繼續前進。下一步:

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)。一個簡單的方法做,這是隻刪除整個#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); 
} 

隨着這種變化,是時候來編譯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 

最後我們做出相關的文件(S),我們就需要在運行LAMBDA的壓縮包。

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開心。還請注意,與--disable-gpu標誌一起,我們不需要libosmesa.so,它的遺漏會從我們的軟件包zip中刪除大約4 MB。

我已經開始this項目,目的是讓它更容易上手。它帶有一個預先構建的無頭Chrome二進制文件,您可以獲得here