Python
AWS
lambda

【AWS】Lambdaでpipしたいと思ったときにすべきこと

More than 1 year has passed since last update.

はじめに

 Lambda関数を Python で書いていると、Lambda関数内でサードパーティのライブラリを使いたくなるときがあります。しかし、Lambda では pip を使ってライブラリをインストールすることはできません。今回はそんな状況で役に立つ方法を紹介します。

 具体的には Lambda に用意されているファイルアップロード機能を使います。つまりファイルをアップロードするときにサードパーティのライブラリをアップロードすることで、Lambda関数内からライブラリを使えるようにします。

今回は Python の HTTPライブラリである requestsを使ってみようと思います。

関連記事

 Lambda関数の基本的な作成方法は以下の記事を参考にしてください。

手順

  1. ローカルで作業用ディレクトリを作成する
  2. ライブラリをインストールする
  3. 作業用ディレクトリ内で Lambda関数を書く
  4. Zip で圧縮する
  5. 圧縮したファイルをアップロードする
  6. 使用する関数の設定

作業用ディレクトリの作成

 まずは作業用ディレクトリを作成します。名前は workspace とでもしておきましょう。ディレクトリを作成したら、その中に移動します。

$ mkdir workspace
$ cd workspace

ライブラリのインストール

 workspace の中に移動したら、pip を使用してライブラリをインストールします。以下のようにします。

$ pip install requests -t .

tオプションをつけることで、ライブラリのインストール場所を指定することができます。今回はカレントディレクトリ(workspace)にインストールしています。

Lambda関数の作成

ライブラリをインストールしたら、次は Lambda関数を書きます。ファイル名は lambda_function.py、関数名は lambda_handler としておきます。ファイル名と関数名は後で使用するので覚えておきます。

lambda_function.py
import requests

def lambda_handler(event, context):
    res = requests.get("http://www.yahoo.co.jp/")
    return res.status_code

コードは上記のようになります。内容はYahooのトップページをGETしてステータスコードを返すという簡単なものです。ページを正常に取得できればステータスコードとして200番が返ります。

>>> from lambda_function import lambda_handler
>>> lambda_handler(None, None)
200
>>> 

Zipで圧縮

 zip コマンドを使って workspace 内のすべてのファイルを圧縮します。圧縮するファイル名はupload.zipとでもしておきます。

$ zip -r upload.zip *

ファイルのアップロード

 zip コマンドで圧縮したら圧縮したファイルを Lambda にアップロードします。関数の設定画面中の 「Lambda function code」 という項目に、「Code entry type」があります。デフォルトでは「Edit code inline」となっていますが、ここを「Upload a .ZIP file」を選択します。選択すると「Upload」ボタンが現れるので、先ほど作成したファイル(upload.zip)をアップロードします。
スクリーンショット 2015-11-20 10.44.39.png

使用する関数の設定

 ファイルのアップロードが終了したら、Handlerに使用する関数を設定します。関数は「ファイル名.関数名」という形式で指定することができます。先ほど作成した Lambda関数のファイル名は、lambda_function、関数名はlambda_handlerであったので「lambda_function.lambda_handler」と指定します。
スクリーンショット 2015-11-20 10.51.24.png

以上で設定は完了です。「Next」ボタン、「Create function」ボタンを選択して関数を作成してください。

テスト

 テスト画面からテストをしてみてください。ステータスコードが返ってきていれば成功です。お疲れさまでした。
スクリーンショット 2015-11-20 10.57.20.png

参考

* Lambdaのドキュメント
* pipのオプション