Uzabase Advent Calendar 2021 15日目は @overgoro56 が担当します。
今年の夏くらいにブラウザ操作の作業で自動化したいことがあってLambda + puppeteerをServerlessFramework使って構築してみたので紹介します。
Lambda + puppeteer で気をつける点
Lambdaデプロイパッケージのサイズ制限とpuppeteerのサイズとの戦いです。
250MBの制限とコンソールエディタ3MBの制限に気をつけます。
Lambda クォータ の一部抜粋
50 MB (zip 圧縮済み、直接アップロード)
250 MB (解凍後)
このクォータは、レイヤーやカスタムランタイムなど、アップロードするすべてのファイルに適用されます。
3 MB (コンソールエディタ)
今回やったこと
puppeteerをChromeのバイナリなしで利用する
PuppeteerのChromeは容量が大きので使わない設定を行う
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=TRUE
puppeteer-core
のインストールでやる方法でもよさそうですが、 PUPPETEER_DOWNLOAD_PATH
の環境変数の設定が必要そうだったりしたので今回は上記を使用しました。
chrome-aws-lambda を使う
Lambda用に軽量化されたchromiumを使って容量削減します。
chrome-aws-lambda
Lambdaを軽量化し、コンソールでコード編集できるようにする
折角スクリプト言語でLambda書くんだから、簡単に編集してデバッグできるようにしておきたいです。
node_modulesはLambdaレイヤーに退避
serverless-layers
のプラグインを導入します。
custom:
serverless-layers:
functions: # optional
- sampleHandler
dependenciesPath: ./package.json
layersDeploymentBucket: ${self:custom.envfile.environment.${self:provider.stage}.layersDeploymentBucket}
lambdaのコード以外をアップロードしないように除外する
以下のような形でソース以外除外する設定をします。
3MB制限に引っかかることは少ないかと思いますが念のため。
package:
patterns:
- '!**'
- src/**
serverless-prune-plugin
を入れておく
デプロイするごとにLambdaの各バージョンのコードを保持するため、容量が大きくなることを防いでおきます。
以下は直近10バージョンを残す設定。
custom:
prune:
automatic: true
number: 10
最後に
短いですが、上記の点を気をつけるだけでLambda + puppeteerが簡単にできます。
さすがServerlessFrameworkといったところです。
ローカル実行も簡単にできちゃいます。
今回紹介した内容のサンプルコードを以下のレポジトリにアップしておきました。
環境ごとに変数を切り替える設定も入れてるので実運用に用いやすいと思います。
よかったら参考にしていただけると嬉しいです。
eslint入れてないなど気になるところはありますがご容赦ください。
https://github.com/overgoro56/serverless-lambda-puppeteer