技術メモ

プログラミングとか電子工作とか

AWS Lambdaでrequestsなどのライブラリを使う

f:id:ysmn_deus:20190318182949p:plain

どうも、靖宗です。
たまには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にアップロードするだけです。MacLinuxではzipコマンドがあるかと思いますが、Windowsではないのでなにがしかの方法で圧縮して下さい。
なお、venvディレクトリは不要です。(サイズが大きいので間違えないように)
本来であればライブラリ名-バージョン-dist-infoみたいなディレクトリも要らないと思いますが、そこまでファイルサイズ大きくも無いですし、手間なら一緒に圧縮しても良いと思います。

Lambdaにアップロード

zipに固めたファイルをアップロードします。既存のLamndaか、新しく作ったLambdaの「関数コード」という所からアップロードします。

f:id:ysmn_deus:20190319000545p:plain

ランタイムをPythonにして置いて下さい(バージョンは適宜変更)。
また、上記のコードを利用していればハンドラの名前が異なっているので、ハンドラの名前も合わせて下さい。 (index,pyならindex..lambda_handler

適当なテストイベントを作成してテストを実行すれば、実行結果が表示されます。
きちんとライブラリが動作していれば実行結果は成功になり、ログに取得した情報が表示されるかと思います。

インストールされたライブラリをpipで-t .オプションを付けてインストールし直すことで、importなどの依存関係をそのまま引き継ぐことができます。