puppeteerをawsで動かす

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
  • puppeteer-coreとchrome-aws-lambdaのインストール

下記2つのコマンドを実行する。

npm install chrome-aws-lambda --save-prod
npm install puppeteer-core --save-prod
  • アップロード用nodejs.zipの作成

nodejsフォルダを作成してnode_modulesフォルダを移動し、nodejsフォルダごとzipにする。
f:id:noifuji:20210208101748p:plain

AWS lambdaに登録する

  • 新しいlambda functionを作成する。

AWSコンソールからLambdaを選択する。
f:id:noifuji:20210208100933p:plain
f:id:noifuji:20210208101402p:plain

  • レイヤーを作成する

AWSコンソール>Lambda>レイヤーをクリック。
f:id:noifuji:20210208102105p:plain
レイヤーの作成をクリックして、適当な名前を入力して先ほど作成したnodjs.zipをアップロードして作成をクリック。
一覧にレイヤーが追加されるので、ARNをコピーする。
「arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxxxxxxxxxxxxxxx:1」←こんなん。

  • lamda functionにレイヤーを追加する

AWSコンソール>Lambda>関数>作成した関数を選択し、レイヤー>レイヤーの追加
f:id:noifuji:20210208111259p:plain
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が動作してくれないようなので)
f:id:noifuji:20210208112727p:plain

  • 実行

画面上部の「テスト」をクリックし、下記のように入力して「作成」をクリック。
f:id:noifuji:20210208113025p:plain
再度「テスト」をクリックすると、実行結果が出力される。
f:id:noifuji:20210208113413p:plain
こんな感じででてたら成功。

参考

github.com