puppeteerをAWS Lambdaで利用する
AWS Lambda
は、いわゆるFaaS(Function as a Service)
の1つです。AWS Lambda
を使用することで、サーバーのプロビジョニングや管理をすることなく、コードを実行できます。
なんらかのイベントをトリガーとして、処理を行うためには適しているサービスです。
しかし、puppeteer
をAWS Lambda
上で何かの処理を自動化する場合、以下の制約がネックになります。
- デプロイパッケージサイズ
- 50 MB(zip圧縮済み、直接アップロード)
- 250 MB(解凍、レイヤーを含む)
- 3 MB(コンソールエディタ)
puppeteer
を普通に利用するとchronium
を同梱しているため、どうしても50MBの制限を超えてしまいます。この制限を回避するためには以下で公開いただいているような、軽量なChromium Binary
を利用する必要があります。
- alixaxel/chrome-aws-lambda: Chromium Binary for AWS Lambda and Google Cloud Functions
- adieuadieu/serverless-chrome: 🌐 Run headless Chrome/Chromium on AWS Lambda
今回は、chrome-aws-lambda
を利用する手順を紹介します。
1. AWS Lambda Layerに登録するZIPアーカイブ(chromium + puppeteer)を作成
AWS Lambda Layer
とは、ライブラリ、カスタムランタイム、またはその他の依存関係を含むZIPアーカイブです。
このAWS Lambda Layer
を利用してデプロイパッケージを小さくすることで、AWS Lambda
上でpuppeteer
を利用可能とします。
chrome-aws-lambda
を利用する場合は、以下のコマンドを実行してAWS Lambda Layer
に登録するZIPアーカイブを作成します。
git clone --depth=1 https://github.com/alixaxel/chrome-aws-lambda.git && \
cd chrome-aws-lambda && \
make chrome_aws_lambda.zip
2. AWS Lambda Layerに作成したZIPアーカイブを登録
AWS Console > AWS Lambdaから、レイヤーを作成します。
![レイヤーの作成](https://res.cloudinary.com/meganii/image/upload/v1593931417/nhwkjaeerejr4jyikps3.png)
ここで、先ほど作成したchrome_aws_lambda.zip
を指定します。また、互換性のあるランタイムとしてNode.js 10.x
, Node.js 12.x
を指定して登録します。
![レイヤーの作成 レイヤー設定](https://res.cloudinary.com/meganii/image/upload/v1593931471/zrgujpawchwznghdnc2c.png)
3. AWS Lambda関数の作成とレイヤー追加
続いて、ぽちぽちと関数を作成していきます。
![関数を作成](https://res.cloudinary.com/meganii/image/upload/v1593931605/vonwhatp33fu5n5dmwjy.png)
![puppeteerをAWS Lambdaで利用する](https://res.cloudinary.com/meganii/image/upload/v1593931652/snysklv7zdoyvyjzskya.png)
任意の名前で関数を作成した後、「レイヤーの追加」から先ほど登録したレイヤーを追加します。(ここでは一度登録し直したためバージョン2になっていますが、初期登録の場合はバージョン1になります)
![puppeteerをAWS Lambdaで利用する](https://res.cloudinary.com/meganii/image/upload/v1593931781/vrecpy09jzld9ksytb8p.png)
![puppeteerをAWS Lambdaで利用する](https://res.cloudinary.com/meganii/image/upload/v1593931806/ati0jpfrvnzxdcfk3cjn.png)
続いて、実際のコードを登録します。ここでは下記のサンプルコードを利用します。
![puppeteerをAWS Lambdaで利用する](https://res.cloudinary.com/meganii/image/upload/v1593931858/bq3i6xdablib3kykqvkq.png)
const chromium = require('chrome-aws-lambda');
exports.handler = async (event, context, callback) => {
let result = null;
let browser = null;
try {
browser = await chromium.puppeteer.launch({
args: chromium.args,
defaultViewport: chromium.defaultViewport,
executablePath: await chromium.executablePath,
headless: chromium.headless,
ignoreHTTPSErrors: true,
});
let page = await browser.newPage();
await page.goto(event.url || 'https://example.com');
result = await page.title();
} catch (error) {
return callback(error);
} finally {
if (browser !== null) {
await browser.close();
}
}
return callback(null, result);
};
4. 実行時の設定変更
chrome-aws-lambda
の要求するメモリは、最小512MB, 推奨1600MB以上とされています。
ここでは、最小512MBと、タイムアウトをデフォルトの3秒から1分に設定を変更しました。
(タイムアウトをデフォルトの3秒のままにしていたら、puppeteer
が起動するまでに3秒以上かかり、タイムアウトのエラーが発生しました)
![puppeteerをAWS Lambdaで利用する](https://res.cloudinary.com/meganii/image/upload/v1593931904/rgqkqakaqzlen6fudbxw.png)
![AWS Lambdaの設定変更](https://res.cloudinary.com/meganii/image/upload/v1593932034/zsccctcunpcj21nwgtf9.png)
5. テスト実行
以下の「テスト」をクリックして、新しいテストイベントの設定を行います。今回は、デフォルトのまま登録します。
![puppeteerをAWS Lambdaで利用する](https://res.cloudinary.com/meganii/image/upload/v1593933340/twwitz4tc4jevbzjvkho.png)
![puppeteerをAWS Lambdaで利用する](https://res.cloudinary.com/meganii/image/upload/v1593933363/conuwb4ch7xbdch18i6s.png)
関数コードの「Test」を実行すると、正しくレスポンスが返ってきました。Response: "Example Domain"
![puppeteerをAWS Lambdaで利用する](https://res.cloudinary.com/meganii/image/upload/v1593933440/jqlrhillne20jzntp6qz.png)
まとめ
上記の手順により、puppeteer
をAWS Lambda
で実行する方法を確立できました。
これにより、AWS Lambda
の柔軟な実行環境を手に入れました。
後はイベント駆動でスクレイピングや任意の処理を組み込むなど、できることは多そうです。
Related contents
![Eyecatch](https://res.cloudinary.com/meganii/image/upload/c_scale,f_auto,q_auto/v1594902885/tech_ben4sq.png)
TECH
2020.04.20
![Eyecatch](https://res.cloudinary.com/meganii/image/upload/c_scale,f_auto,q_auto/v1594902885/tech_ben4sq.png)
TECH
2020.01.30
![Eyecatch](https://res.cloudinary.com/meganii/image/upload/c_scale,f_auto,q_auto/v1594902885/tech_ben4sq.png)
TECH
2017.08.27
![Eyecatch](https://res.cloudinary.com/meganii/image/upload/c_scale,f_auto,q_auto/v1594902885/tech_ben4sq.png)
TECH
2017.08.22
![Eyecatch](https://www.meganii.com/images/nopicture.png)
TECH
2014.03.15
![Eyecatch](https://www.meganii.com/images/nopicture.png)
TECH
2014.02.11