ヤマムギ

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認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。

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

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

 - AWS ,

ad

ad

  関連記事

AWS CodeStarで静的webサイトのテンプレートプロジェクトを作成する

執筆環境の検討中です。 CodeCommitは使うつもりで、コミットしたときにE …

API GatewayからLambdaを介さずにSNSトピックへ送信

やりたいこと APIリクエストをまずLambdaで受けて、SNSトピックへ送信す …

RDS自動バックアップの自動クロスリージョンコピー

このブログのRDS for MySQLはAWS Backupで大阪リージョンから …

Amazon Connectの新規作成からプッシュボタン入力と発信元電話番号をLambdaで処理するまで

とりあえずやりたいことはタイトルに書いたとおり、「電話をかけて、プッシュボタンに …

執筆環境(PyCharm, CodeCommit, CodePipeline, S3, Lambda, 署名付きURL)

2018年から、年に1回ぐらい商業本の執筆をさせていただいております。 2020 …

新しいVPCウィザード(2022年)がすんごく便利になってました

VPCウィザードがすんごく便利になってました。 ウィザードの左ペインで設定を選択 …

前からできましたっけ??CloudWatch Logsの保持設定を複数まとめて設定

AWSの個人アカウントで要らなさそうなリソースの断捨離をしてます。 CloudW …

AWS Well-Architected フレームワークによるクラウド ベスト プラクティスのセッションを聞いたので自アカウントの環境を確認してみる

AWS Summit Tokyo 2017で「AWS Well-Architec …

特定AWSアカウント特定リージョンのCloudFormationスタックを削除するLambda(Python)

やりたいこと 特定アカウント内特定リージョン内のCloudFormationスタ …

ユーザーガイドの方法でGithubからCodeCommitへリポジトリを移行する

GitリポジトリをAWS CodeCommitに移行するを参照しました。 環境 …