2017-03-07 43 views
9

Chrome w trybie bezgłowe już dostępne dla systemu Linux: https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.mdChrome - bez głowicy dla AWS Lambda?

to działa tylko z Canary teraz, ale nadchodzący urzędnika w Chrome 57.

Jakiekolwiek szanse, aby uruchomić Google Chrome na AWS lambda?

+1

Zastanawiałem się nad tym samym. Zrobiłem to, ale wygląda na to, że nie działa dobrze. Moje postępy są tutaj: https://github.com/adieuadieu/thingamajigs/tree/master/serverless-chrome-pdf Tutaj jest również wątek na ten temat: https://groups.google.com/a/chromium.org/d/msg/headless-dev/qqbZVZ2IwEw/Wr9wmgb1EQAJ –

Odpowiedz

10

Tak; to jest możliwe.

Kompilowanie wersji innej niż debugująca Headless Chrome daje plik binarny o rozmiarze ~ 125 MB i nieco mniej niż 44 MB, gdy jest spakowany gzip. Oznacza to, że mieści się w nieskompresowanym pliku o rozmiarze 250 MB i wielkości 50 MB limitation dla pakietu wdrażania funkcji.

Co jest (obecnie) wymagane, aby zmusić Chrome do kompilacji bez korzystania z pamięci współdzielonej w/dev/shm. Jest wątek na temat w grupie headless-dev google group here.

Oto kroki, których użyłem do zbudowania binarnej wersji bezgłowego Chrome, która będzie działać na AWS Lambda. Są one oparte na this i this.

  1. Tworzenie nowej instancji EC2 pomocą społeczności AMI z nazwą AMZN-AMI-HVM-2016.03.3.x86_64-GP2 (us-zachód-2-ami 7172b611).
  2. Wybierz typ instancji z co najmniej 16 GB pamięci. Czas kompilacji zajmie około 4-5 godzin na t2.xlarge lub 2-3ish na t2.2xlarge lub około 45 min na c4.4xlarge.
  3. Daj sobie wolumin główny, który ma co najmniej 30 GB (40 GB, jeśli chcesz skompilować kompilację debugowania - której nie możesz przesłać do Lambdy, ponieważ jest zbyt duży).
  4. SSH do nowej instancji i uruchom:
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 będą narzekać niektórych pakietach nie istniejących. Cokolwiek. Nie patrzyłem na nich. Nie wydawało mi się jednak, żebym powstrzymał mnie przed budowaniem headless_shell. Zignoruj ​​wulgarne małe Yum i przejdź dalej. Następnie:

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 

W tym momencie musimy wprowadzić bardzo małą zmianę w kodzie Chrome. Domyślnie w systemie Linux Chrome zakłada istnienie pliku tmpfs pod adresem /dev/shm. Nie ma tmpfs dostępnych dla funkcji Lambda. :-(

Plik musimy zmienić to src/base/files/file_util_posix.cc. Modyfikacja GetShmemTempDir() taka, że ​​zawsze zwraca dir temp OSS (/tmp). Prostym sposobem na to jest po prostu usunąć całą #if defined(OS_LINUX) bloku w funkcji GetShmemTempDir(). mniej drastyczna zmiana jest hardcode use_dev_shm do 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); 
} 

się z tą zmianą, że nadszedł czas, aby skompilować Picking rzeczy z powrotem w katalogu src ustawić kilka kompilacji argumenty, następnie (ostatnie polecenie) zacząć budować. proces:

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 

Wreszcie tworzymy archiwum odpowiednich plików, które będziemy musieli uruchomić w 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/ 

ciągu Lambda, prowadzony headless_shell ze zdalnego debugera interfejsu obsługującego wykonując:

/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 

Od/tmp jest tylko do zapisu miejsce w funkcji lambda, istnieje kilka flag właśnie mówienie Chrome gdzie zrzucić dane. Nie są konieczne, ale zachowują Chrome. Zauważ też, że to mentioned, że z flagą --disable-gpu, nie potrzebujemy libosmesa.so, której pominięcie zgnie się około 4 MB z naszego pakietu zip.

Rozpocząłem projekt this w celu ułatwienia rozpoczęcia. Wyposażony jest w fabrycznie wbudowaną binarną bezgłową wersję Chrome, którą można uzyskać here.