こんにちは。DSOC R&Dグループの高橋寛治です。
今回は、AWS Lambdaを利用したAPI開発の際の開発環境構築について紹介します。
AWS Lambdaのおさらい
前回の記事で触れましたが、環境構築に必要な知識について簡単におさらいします。
AWS Lambdaは、Amazon Linuxが動作しているインスタンスに任意のコードをアップロードして動作させます。
動作の制約は、タイムアウトがあることと使用メモリーの設定により動作時間が変化することです。
Lambda関数の発火は、対象となるイベントが発生した際にイベントの内容がjsonで引数として渡され、実行されます。
開発環境に求められることは、LambdaのAmazon Linuxと同じもしくはほぼ同等であること、タイムアウトや使用メモリー量について考慮できること、イベントを受け取って処理することです。
もちろん上記の条件が無くとも開発することは可能ですが、デバッグが大変になり開発効率が落ちることや、Amazon Linuxにインストールされていない任意のモジュールやバイナリーの動作が困難になります。
どんな方法があるか
環境構築は、2つに大きく別れると思います。 環境構築の方法は、大きく2つに別れると思います。 同等の環境を準備する方法と、LambdaのWebサービス上で開発する方法です。
同等の環境を準備するには、以下の方法が挙げられます。
- Dockerコンテナ
- 同じAmazon LinuxのEC2インスタンス
- VirtualBoxなどの仮想マシンでAmazon Linuxを準備
jsonで記述されたイベントを受け取り実行することをシミュレートするものも必要です。
私がAWS Lambdaを使い始めたときに、python-lambda-localの情報が多かったことと、Amazon Linuxの入ったEC2インスタンスがあったため、python-lambda-localとEC2インスタンスを用いて開発を行いました。
また、開発環境の準備について、最近はDockerコンテナを用いるAWS Serverless Application Modelが、サンプルを見たところ、便利で開発からデプロイまでできそうです。
もう一つの方法である、LambdaのWebサービス上での開発ですが、エディターがリッチになってきたため、標準モジュールを用いて簡単なアプリケーションを作成する分には、それで事が足りてしまいます。
これらを実際に試してみて、また結果を記事として書ければと思います。
python-lamdba-localとEC2インスタンスを使った環境例
次に、python-lambda-localとEC2インスタンスを用いた開発環境の一例を紹介したいと思います。
EC2インスタンスの用意
まず、Amazon Linux AMIのEC2インスタンスを用意します。
インスタンスタイプは、Lambda関数の実行環境ということで小さくて構いません(私はt2.smallを使っています)。
EC2インスタンスで作業するために、Lambdaに付与したいIAMロールをEC2インスタンスに割り当てて、同等の権限で作業できます。
python-lambda-localの導入と実行
次に、python-lambda-localをEC2インスタンスに導入します。
まずPython環境の構築ですが、プロジェクトのディレクトリーにVirtualenvなどを用いてPython3.6の環境を構築することをお勧めします。
python-lambda-localは、pipでインストールできます。
$ pip install python-lambda-local
実行例ですが、main.pyのlambda_handler
メソッドに対して event.json
をイベントとして投げる例です。
$ python-lambda-local --function lambda_handler main.py event.json -t 10
これを実行するとターミナルにログが吐かれます。
[root - INFO - 2018-01-22 10:55:35,977] Event: event.jsonの中身
[root - INFO - 2018-01-22 10:55:35,977] START RequestId: f2edf3ff-1533-475e-b7e1-fbfb0c71efe5
[request-f2edf3ff-1533-475e-b7e1-fbfb0c71efe5 - INFO - 2018-01-22 10:55:35,978] logger.infoの内容
[root - INFO - 2018-01-22 10:55:37,014] END RequestId: f2edf3ff-1533-475e-b7e1-fbfb0c71efe5
[root - INFO - 2018-01-22 10:55:37,014] REPORT RequestId: f2edf3ff-1533-475e-b7e1-fbfb0c71efe5 Duration: 1036.43 ms
これは、AWS Lambda上で実行した際にCloudWatchで閲覧できるログと同等です。タイムアウトも設定できますが、マシンの速度がAWS Lambdaと同じとは限らないため、あくまでも目安となります。
AWS LambdaのCPU性能は、メモリー割り当て量を増やせば増やすほど、高速になるようです(参考)。
私の開発体制
少々、無駄のある構成ですが、EC2インスタンスとpython-lambda-localを用いた私の開発体制を紹介します。
コーディングは、ローカルのPyCharmのリモート機能を用いて行います。EC2インスタンス上のPython環境を読み込み自動で補完してくれます。また、Auto Upload機能により更新したファイルは、自動でEC2にアップロードしてくれます。
次に、Lambda関数の実行についてですが、以下のような記述のrun.pyというスクリプトを作成します。
import subprocess
subprocess.call(
" ".join([PYTHON_LAMBDA_LOCALのパス, '--function lambda_handler', 'main.py', 'event.json', '-t 10']),
shell=True)
PyCharmの設定によりEC2インスタンス上でrun.pyを実行することで、PyCharmから手軽にリモートで動作確認を行うことができます。
便利な環境で開発を
効率良く開発を進める上で、同等の環境で開発することやデバッグが行いやすいことは重要です。
新しいツールを使うためには、学習コストもそれなりに要するため、開発規模やそのときに取れる工数によって、何を選ぶか決めています。
今回は、Amazon LinuxのEC2インスタンスとpython-lambda-localを組み合わせた例の紹介を行いました。
次回の記事では、エラー処理について紹介したいと思います。
執筆者プロフィール
過去記事
▼第6回
「API GatewayとAWS Lambda PythonでAPI開発」Vol. 1:API GatewayとAWS Lambdaを知る
▼第5回
快適なシェル環境の再構築を自動化する
▼第4回
第16回情報科学技術フォーラム(FIT2017)で登壇
▼第2回
R&D論文読み会勉強会
▼第1回
言語処理100本ノック勉強会
text:DSOC R&Dグループ 高橋寛治