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.
- 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).
- 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.
- 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).
- 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.
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 –