ヤマムギ

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が出たときから欲しかった機能なのでありがたいです。


最後までお読みいただきましてありがとうございました!

「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。

「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。

「AWS認定資格試験テキスト AWS認定AIプラクティショナー」という本を書きました。

「AWS教科書 AWS認定デベロッパーアソシエイト テキスト&問題集 」という本を書きました。

「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。

「AWSではじめるLinux入門ガイド」という本を書きました。

 - AWS ,

  関連記事

AWS WAF Web ACLとルールをv1(Classic)からv2に自動移行しました

新しいものは、課題が解決されていたり、機能追加されたりするのでいいものです。 長 …

Pepperで撮影した写真をAmazon Rekognitionで分析してその結果をPepperがしゃべる ~(1)AWS編~

Pepperの機能を使えるところは使って、何かしたいなあと思ってまして。 目(カ …

EC2インスタンスWindowsでセッションマネージャーを使う

WindowsのEC2インスタンスでセッションマネージャーを使ってみたことがない …

T2.microからT3.nanoに変更(メモリエラーも対応)

このブログのEC2インスタンスをT2.micro 1インスタンスからT3.nan …

T3.nanoで仮想メモリ割当をユーザーデータで実行する

T3.nanoはメモリがだいたい500MBです。 実行する処理によってはメモリエ …

AWS CodPipelineの実行モードの動作確認しました

AWS CodePipelineの3つの実行モード(SUPERSEDED(優先済 …

Amazon CloudSearchからAmazon Elasticsearch Serviceへ変えました

全文検索をする必要がありまして、本当はCloudSearchを使い続けたいのです …

AWS CloudWatch LogsエージェントでAmazon EC2上のNginxのaccess.log , error.log , php-fpm error.log , Linuxのmessages , secureログを収集する

参考ページ クイックスタート: 実行中の EC2 インスタンスに CloudWa …

AlexaにAWSの最新Feedを読み上げてもらう(Lambda Python)

年末にAmazon Echo Dotを購入しましたので、練習がてらAlexaスキ …

EC2 Amazon Linux 2 にAmazon LinuxからWordPressを移行

このブログを新しいインスタンスに移行することにしました。 2015年5月にAma …