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 も見に行くと思うのでフルパスは必要ないと思いますが、今回のようにドライバを呼び出すときはフルパスが必要かな、と思いました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
from selenium import webdriver def lambda_handler(event, contxt): options = webdriver.ChromeOptions() options.binary_location = "/opt/python/bin/headless-chromium" options.add_argument("--headless") options.add_argument("--no-sandbox") options.add_argument("--single-process") driver = webdriver.Chrome( executable_path="/opt/python/bin/chromedriver", chrome_options=options ) driver.get('https://www.yamamanx.com/aws-lambdapython3-selenium-chrome-headless/') return driver.title |
Layersにはバージョンもあるようなので独自モジュールでもバージョン管理しながら使えますね。
いやあこれはLambdaが出たときから欲しかった機能なのでありがたいです。
最後までお読みいただきましてありがとうございました!
「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。
「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第2版」という本を書きました。
「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。
「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。
「AWSではじめるLinux入門ガイド」という本を書きました。
開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
Amazon CloudWatch RUMはじめました
新機能 – Amazon CloudWatch RUM をご紹介 2021年12 …
-
EC2インスタンスプロファイルによってAssumeRoleされた認証情報の有効期限は短くできるのでしょうか
「EC2インスタンスプロファイルによってAssumeRoleされた認証情報の有効 …
-
Amazon S3アクセスポイント経由からアクション可能なポリシー
S3アクセスポイントを使うことで、複雑で長いバケットポリシーを避け、アクセスポイ …
-
WordPress W3 Total Cache のDatabaseCacheをAmazon ElastiCacheのmemcachedに格納する
このブログのアーキテクチャは現在こちらです。 データベースは、Amazon Au …
-
VyOSでssm-userからvyosユーザーに切り替える
EC2 VyOSで/etc/resolv.confを設定しました VyOSにSS …
-
Amazon SNSサブスクリプションフィルターを設定してPython(boto3)からPublish
上記のような構成でRocketChatを使うとき使わないときがあります。 都度都 …
-
DynamoDB IAMポリシーで特定項目だけを許可する
検証記録です。 対象テーブル 書籍のサンプルで作ったこちらです。 所属バンドの楽 …
-
S3 VPCエンドポイント設定前と設定後を確認
S3のVPCエンドポイントを設定した際に、S3バケットのAPIエンドポイントへの …
-
クロスリージョンでEFSをマウントしてみる
ニーズがあるかどうかはさておき、クロスリージョンでのEFSファイルシステムをマウ …
-
Projectタグを強制するSCPでアクションやリソースを限定しないとき成り立つのか
ふと疑問に思ったので試しました。 予想は、拒否されてしまう、です。 [crayo …