ヤマムギ

growing hard days.

*

AWS LambdaでChrome HeadlessドライバをAWS Lambda Layersから使う

   


この記事はSelenium/Appium Advent Calendar 2018に参加した記事です。

新機能のAWS Lambda Layersが発表されました。

これまでAWS Lambdaのコードファイルが50MBぎりぎりだとか悩まなくてもよくなりますし、コードを更新するたびに重たいアップロードをしなくてもよくなります。
AWSもストレージ容量が減らせるのではないでしょうか。

LambdaでChrome Headlessドライバを使ってスクレイピングをしているのですが、コードのzipファイルが48MBとかなので、制限ぎりぎりです。
これ以上何かを増やすと制限にひっかかります。
そして、ファイルが大きすぎてマネジメントコンソールから直接コードが編集できませんし見えません。

そこで登場したAWS Lambda Layers。
これは使うしかないでしょうということで、試してみました。

過去記事の「AWS Lambda(Python3)でSelenium + Chrome Headless + でwebスクレイピングする」の構成をLambda Layerを使ってやってみました。

AWS Lambda Layersの作成

前述の記事のリンクからドライバをダウンロードして、zipに固めますが、ここで注意点があります。

AWS Lambda Layers公式を見ると、pythonディレクトリを含むとあります。

なので、それにならって、今回は次のようなディレクトリ構成で、headlessディレクトリ以下をzipにしました。

マネジメントコンソールでLamda Layersを作成します。

AWS Lambdaの左ペインのメニューに[Layers]があります。

[Layersの作成]から作成します。

名前を任意で設定して、zipをアップロードします。
ファイルの最大サイズはLambdaの制限と同じく50MBでした。
ランタイムは複数設定することができますが、今回はPython3.6にしました。

AWS Lambdaの設定

LambdaでLayersを選択して[Layersの追加]から先程作成したLayersを選択します。

Lambda関数側にはChrome Headlessドライバだけを含まずに、seleniumなど必要なモジュールはzipで固めてアップロードします。

今まではファイルが大きすぎて見えなかったコードが見えるようになりました。

テストは成功です。

コードは次のコードで検証しました。

今回はまった点としてはドライバのパスです。
実行コードと一緒に固めていたときはカレントディレクトリからの相対パスで、「.bin/headless-chromium」というような指定をしていましたが、Layersではディレクトリが変わります。

コードに書いているように、 /opt/python となりました。
(pythonは公式サイト通りにpythonというディレクトリを作ったからだと思いますが)
Lambdaが実行されているディレクトリは、 /var/task なので、そのあたりは考慮する必要があります。

モジュールのimportとかは、/opt/python も見に行くと思うのでフルパスは必要ないと思いますが、今回のようにドライバを呼び出すときはフルパスが必要かな、と思いました。

Layersにはバージョンもあるようなので独自モジュールでもバージョン管理しながら使えますね。
いやあこれはLambdaが出たときから欲しかった機能なのでありがたいです。


最後までお読みいただきましてありがとうございました!
【PR】 「AWS認定試験対策 AWS クラウドプラクティショナー」という本を書きました。

 - AWS ,

ad

ad

  関連記事

「AWS認定試験対策 AWS クラウドプラクティショナー」の出版が確定したのでAmazon著者セントラルに登録した

初の執筆本、「AWS認定試験対策 AWS クラウドプラクティショナー」の出版が確 …

AWS EC2でAMI(Amazon Machine Image)を作成しておく

前回まででひとまずRedmineを構築するところまで出来たので、念のためスナップ …

Amazon EC2(Amazon Linux 2)にRedmine3.4をインストール

久しぶりに新しい環境でRedmineを構築したくなり、せっかくなのでAmazon …

JAWS-UG Osaka 第14回勉強会 「DIY」 〜自社内システムを作る側からの物申す〜に参加、運営、登壇しました

先日、JAWS-UG Osaka 第14回勉強会 「DIY」 〜自社内システムを …

AWS Data Pipelineを使ってDynamoDBのアイテムを全件S3バケットに書き出した

ちょっと試してみたくてやってみました。 手順はこちらのチュートリアルを参考にすす …

リザーブドインスタンスはじめました

このブログも2014年9月にはじめたので、もうすぐ3年。 1件~17件とばらつき …

MySQL WorkbenchからRDSに接続する

MySQL WorkbenchからAWS RDSのMySQLに接続するために、「 …

Developers Summit 2018 「AWSのフルマネージドな環境でCI/CDをやってみよう!AWS Cloud9からAWS Fargateへの継続的デプロイをご紹介」を聞きました

※写真は展示のAmazon Echoです。 以下は、思ったことや気になったことを …

php-fpm で Out of memoryが発生した際にメール通知する(AWS CloudWatch , Amazon SNS)

AWS CloudWatch LogsエージェントでAmazon EC2上のNg …

「re:CAP ~サーバーワークス re:Invent 2018 報告会~」でre:Invent2018について思われたことを聞かせていただいた

サーバーワークスさんのre:Invent re:CAPにおじゃましました。 re …