どうも、靖宗です。
たまにはAWSの話なんかも。
AWSでpipでインストールされるライブラリを使用する
よくある欲求で、なおかつウェブ上に結構ドキュメントはあると思いますが、自分のメモ用に。
基本的にAWS Lambdaでは標準ライブラリ以外は使えませんが、zipファイルに固めてアップロードすれば利用できることが知られています。
基本的にはvenv
仮想環境で開発されてる方には「当たり前やろ!」と怒られそうですが、Pythonのようにバージョンに左右される言語を利用するときは開発は極力venvなど環境をローカルとは切り離して開発するのが未然にトラブルを防ぐ手段です。
venvで必要なライブラリだけインポートして、それらをzipに固めます。venvは導入済みとし、今回はrequests
モジュールを使う関数を作成します。
(venv) project_name>pip install requests
とりあえず動かす
Lambdaで実行したいファイルを作成します。一応ここではindex.pyとしておきます。
import re import requests INFO_URL = "https://www.python.org/" def lambda_handler(event, context): response = requests.get(INFO_URL) math_ob = re.search(r'<div class=\"shrubbery\">([\s\S]*?)</div>', response.text) if math_ob: return { 'statusCode': response.status_code, 'body': math_ob.group(1) } else: return { 'statusCode': 500, 'body': "" }
引数などにかかわらずpythonの公式サイトのニュースを取得してくるような関数になってます。
一応動作確認しておきます。同フォルダでPythonを仮想環境で実行。
(venv) >python Python 3.7.2 ~~~ Type "help", "copyright", "credits" or "license" for more information. >>> from index import * >>> lambda_handler(None, None) {'statusCode': 200, 'body': ... >>>
正常に動作すればとりあえずヨシ。(ホントはテストとかを入れときたいですが、とりあえずこれで行きます。)
必要ファイルをローカルにインストール
します。まずはrequirements.txtを作成しておきます。
(venv) >pip freeze > requirements.txt
requirements.txt
からローカルにライブラリをインストールします。
(venv) >pip install -r requirements.txt -t .
これを実行するとローカルに色々ファイルが出てくると思います。
ここまで来れば、後はzipに固めてLambdaにアップロードするだけです。MacやLinuxではzipコマンドがあるかと思いますが、Windowsではないのでなにがしかの方法で圧縮して下さい。
なお、venv
ディレクトリは不要です。(サイズが大きいので間違えないように)
本来であればライブラリ名-バージョン-dist-info
みたいなディレクトリも要らないと思いますが、そこまでファイルサイズ大きくも無いですし、手間なら一緒に圧縮しても良いと思います。
Lambdaにアップロード
zipに固めたファイルをアップロードします。既存のLamndaか、新しく作ったLambdaの「関数コード」という所からアップロードします。
ランタイムをPythonにして置いて下さい(バージョンは適宜変更)。
また、上記のコードを利用していればハンドラの名前が異なっているので、ハンドラの名前も合わせて下さい。
(index,pyならindex..lambda_handler
)
適当なテストイベントを作成してテストを実行すれば、実行結果が表示されます。
きちんとライブラリが動作していれば実行結果は成功になり、ログに取得した情報が表示されるかと思います。
インストールされたライブラリをpipで-t .
オプションを付けてインストールし直すことで、importなどの依存関係をそのまま引き継ぐことができます。