awsで動作させるには?
puppeteerをawsで動作させるには、現状専用のライブラリ(chrome-aws-lambda)を使う必要がある。(AWS lambdaにアップロードできるファイルサイズの制限があるため。)
本記事では、chrome-aws-lambdaを使用してpuppeteerをlambda上で動作させる方法を解説する。
【開発について】
aws上で開発するのは不便なので、ローカルでpuppeteerを使って開発するのがいいと思います。
ただ、ローカルのコードとlambda用のコードがちょっと違うので、書き換えるのを忘れないようにしましょう。
AWSアカウントの作成
下記からアカウントを作成する。
AWS 無料アカウントを作成しましょう
puppeteerのライブラリを準備する。
- node.jsのインストール
下記からnode.jsをインストールする。
Node.js
- nodeプロジェクトの作成
適当なフォルダを作成して、下記を実行後、Enterを連打。
npm init
下記2つのコマンドを実行する。
npm install chrome-aws-lambda --save-prod
npm install puppeteer-core --save-prod
- アップロード用nodejs.zipの作成
nodejsフォルダを作成してnode_modulesフォルダを移動し、nodejsフォルダごとzipにする。
AWS lambdaに登録する
- 新しいlambda functionを作成する。
AWSコンソールからLambdaを選択する。
- レイヤーを作成する
AWSコンソール>Lambda>レイヤーをクリック。
レイヤーの作成をクリックして、適当な名前を入力して先ほど作成したnodjs.zipをアップロードして作成をクリック。
一覧にレイヤーが追加されるので、ARNをコピーする。
「arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxxxxxxxxxxxxxxx:1」←こんなん。
- lamda functionにレイヤーを追加する
AWSコンソール>Lambda>関数>作成した関数を選択し、レイヤー>レイヤーの追加
ARNを指定を選択して、先ほどコピーしたARNをペーストして追加。
- index.jsをコピーする
lambda関数のエディタがあるので、index.jsに下記のコードをコピペする。
(yahooのタイトルを取得してくるサンプルです。)
const chromium = require('chrome-aws-lambda'); exports.handler = async(event, context, callback) => { const URL = "https://www.yahoo.co.jp/"; const browser = await chromium.puppeteer.launch({ args: chromium.args, defaultViewport: chromium.defaultViewport, executablePath: await chromium.executablePath, headless: chromium.headless, ignoreHTTPSErrors: true, }); const page = await browser.newPage(); console.log("start"); await page.goto(URL); console.log("open page"); await page.waitForSelector('title', { timeout: 60000 }); let result = await page.evaluate(selector => { return document.querySelectorAll(selector)[0].textContent; }, "title"); console.log(result); page.waitForTimeout(1000); browser.close(); return callback(null, result); }
- タイムアウトとメモリを変更する。
基本設定を下記のように変更します。(デフォルトのメモリでは、puppeteerが動作してくれないようなので)
- 実行
画面上部の「テスト」をクリックし、下記のように入力して「作成」をクリック。
再度「テスト」をクリックすると、実行結果が出力される。
こんな感じででてたら成功。