はじめに

WebアプリケーションのテストにHeadless Chromeを使いたいと思いました。
Lambdaで動かせると安いし起動も早いかなぁと思ってたのですがどうも動かないようです。 考えていた構成としてコンテナにChromeをインストールしてlambdaでコンテナを起動するというものでした。

結論

lambdaでは /tmp 以外が読み書きできないのでChromeが動かないようです。
具体的には /dev/fd とか /run に書き込めないって怒られます。

回避策

結局やりたかったことは手軽にheadlessをserverless環境で動かしたいということなのでECS Fargateの上で動かしました。
lambdaに比べると起動時間がだいぶ遅くなりましたが我慢しました。
EC2にECS clusterを構築すると多少早くはなりますが、ずっと起動しておくものでもないのでコスト的にFargateを利用しています。

参考

最新のGoogle Chromeとchromedriverを動かすDockerfile例

FROM debian:latest

WORKDIR /tmp

RUN set -e \
    && apt-get update \
    && apt-get upgrade -y \
    && sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \
    && apt-get install -y wget gnupg unzip \
    && wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
    && apt-get update \
    && apt-get install -y google-chrome-stable udev \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* \
    && CHROME_VERSION=$(google-chrome --version | awk '{print $3}' ) \
    && echo "Chrome version: ${CHROME_VERSION}" \
    && wget -q -O /tmp/chromedriver.zip https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/${CHROME_VERSION}/linux64/chromedriver-linux64.zip \
    && unzip /tmp/chromedriver.zip \
    && cp chromedriver-linux64/chromedriver /usr/local/bin

WORKDIR /

CMD ["適当ななにか"]