LoginSignup
118
107

More than 5 years have passed since last update.

AWS Lambda上のheadless chromeをPythonで動かす

Last updated at Posted at 2018-04-27

はじめに

  • この記事では、AWS Lambda上でheadless chromeをPythonで動かす方法を紹介します。
  • AWS Lambdadockerを使うので、導入してあることを前提とします。
  • 今回書いたコードはhttps://github.com/nabehide/lambda_headless_chrome_pythonにあげました。
  • Lambdaにデプロイするファイルの作成はMac OS上で行いました。
  • 以下、適当なフォルダを作成して、その中で作業していきます。

$ mkdir lambda_headless_chrome_python
$ cd lambda_headless_chrome_python
  • もしくは、githubからサンプルコードをクローンしてきてください。
$ git clone https://github.com/nabehide/lambda_headless_chrome_python.git
$ cd lambda_headless_chrome_python

手順

lambda_function.py 作成

  • googleにアクセスして、ページのタイトルを取ってくるだけの操作をやってみます。
lambda_function.py

from selenium import webdriver


def lambda_handler(event, context):
    options = webdriver.ChromeOptions()

    # のちほどダウンロードするバイナリを指定
    options.binary_location = "./bin/headless-chromium"

    # headlessで動かすために必要なオプション
    options.add_argument("--headless")
    options.add_argument("--disable-gpu")
    options.add_argument("--window-size=1280x1696")
    options.add_argument("--disable-application-cache")
    options.add_argument("--disable-infobars")
    options.add_argument("--no-sandbox")
    options.add_argument("--hide-scrollbars")
    options.add_argument("--enable-logging")
    options.add_argument("--log-level=0")
    options.add_argument("--single-process")
    options.add_argument("--ignore-certificate-errors")
    options.add_argument("--homedir=/tmp")

    driver = webdriver.Chrome(
        "./bin/chromedriver",
        chrome_options=options)
    driver.get("https://www.google.co.jp")
    title = driver.title
    driver.close()
    return title

serverless-chromiumのダウンロード

  • serverless-chrome というLambda上で動くheadless-chromiumを使わせていただきます。
  • 最新版はPythonで動かない(2018年4月27日現在 [参照])ため、v1.0.0-37を入れます。

$ mkdir -p bin/
$ curl -SL https://github.com/adieuadieu/serverless-chrome/releases/download/v1.0.0-37/stable-headless-chromium-amazonlinux-2017-03.zip > headless-chromium.zip
$ unzip headless-chromium.zip -d bin/
$ rm headless-chromium.zip

chromedriverのダウンロード

  • 上でダウンロードしたChromiumのバージョンに対応したchromedriverのバージョン(2.37)を選んでダウンロードします。
$ curl -SL https://chromedriver.storage.googleapis.com/2.37/chromedriver_linux64.zip > chromedriver.zip
$ unzip chromedriver.zip -d bin/
$ rm chromedriver.zip

seleniumのダウンロード

  • seleniumなど、pipでインストールするパッケージは、Lambdaにアップロードするファイルに含まれていないといけません。
  • しかし、例えばMacの環境でpipを使うと、Mac環境で実行可能なファイルがダウンロードされることになります。
  • そこで、Amazon Linux2で実行可能なものをダウンロードするために、dockerを使います。
  • lambda/lambci という、Lambdaの環境にPythonが入ったものを使わせていただきます。
  • 下記のDockerfileを作成します。
Dockerfile
FROM lambci/lambda:build-python3.6

ENV AWS_DEFAULT_REGION ap-northeast-1
ENV APP_DIR /var/task

ADD . .

CMD pip install -r requirements.txt -t $APP_DIR && \
  zip -9 deploy_package.zip lambda_function.py && \
  zip -r9 deploy_package.zip *
  • docker image を作成して、パッケージングします。
$ docker build -t lambda_headless_chrome .
$ docker run -v "${PWD}":/var/task lambda_headless_chrome
  • これでlambdaにアップロードするzipファイル deploy_package.zipができます。

Lambdaで実行する

  • AWSコマンドラインインターフェース(CLI)を導入していない場合は、下記コマンドで導入します。
$ pip install awscli
  • 下記コマンドでapiキーなども設定しておきます。
$ aws configure
  • AWSコンソールでS3のバケットとroleを作成します。roleのpolicyに AWSLambdaFullAccess をアタッチしておきます。
  • deploy_pakcage.zipをLambdaにアップロードして、関数を作成します。(リージョンやロール、バケットの名前などは適宜変えて実行します。)
$ aws s3 cp deploy_package.zip s3://YOUR_BUCKET_NAME
$ aws lambda create-function --region ap-northeast-1 --function-name lambda_headless_chrome_python --runtime python3.6 --role YOUR_ROLE_NAME --code S3Bucket=YOUR_BUCKET_NAME,S3Key=deploy_package.zip --handler lambda_function.lambda_handler --memory-size 512 --timeout 300
  • lambdaにアクセスすると、lambda_headless_chrome_python という関数ができているので、「テスト」ボタンで実行確認ができます。

さいごに

AWS Lambda上でheadless chromeをPythonで動かす方法を書きました。
あとはlambda_function.pyを好きなように書いて、requirements.txtに必要なパッケージを追加して、実行するだけです!

118
107
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
118
107