ヤマムギ

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

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

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

 - AWS ,

  関連記事

WordPressの年ごとのブログ投稿数を調べるSQL

毎年年末に使いそうなのでメモです。 [crayon-69d88cb30bbed0 …

AD Connectorを作成してシームレスにドメイン参加する

VPN接続先のADで管理されているドメインにEC2 Windowsインスタンスか …

Well-Architected Tool レンズヴァージョンアップ

当ブログのWell-Architectedレビューを久しぶりにやろうと思い、We …

AWS Cloud9で環境を共有する

(特にリモート環境では)画面共有をしたり、リポジトリを共有したり、コーディング環 …

AWS Step Functions まずはパラレルでLambdaを並列実行してみました

複数のlambdaの実行制御をLambdaでやってましたが、その部分をStep …

Rocket.ChatからOut Going Webhookを設定してみる

API GatewayとLambda とりあえず、どんなデータが飛んでくるのか見 …

IAMセッションポリシーの利用(GetFederationToken)

GetFederationTokenでのセッションポリシーは、呼び出し元のIAM …

AWS EC2 Amazon Linux にEC-CUBE3をnginx+MySql環境へインストール(手順検証中)

EC2インスタンスを作成する 少し古い記事で恐縮ですが試したい事があるのでAWS …

SIEM on Amazon OpenSearch Serviceを構築

このブログまわりのモニタリングをSIEM on Amazon OpenSearc …

Amazon Data Lifecycle Manager(DLM)が東京リージョンで使えるようになったのでLambdaでAMI自動取得から乗り換えた

EBSのスナップショットを自動で作成してくれるAmazon Data Lifec …