さて、今回はAWS Lambdaでpythonの開発体制を取るためにローカルで開発したものをアップするということを実施してみます。
【関連記事】
・AWS LambdaでS3にファイルがアップロードされたのを検知する
・AWS LambdaでS3にファイルがアップロードされたら、加工して別フォルダにファイルを作成する(Python)
・外部のライブラリを利用してのAWS Lambdaの設定
今まで開発してきた中で、外部ライブラリなどを使うと都度zipのアップロードで開発が大変ということがありました。
そこで、ローカルで開発したものをデプロイするという手法を試すために、python-lambda-local と lambda-uploader というツールを使い開発を行っていきます。
尚、開発は以下の環境で実施しています。
・AmazonLinuxでpyenvを利用してPython3.6の仮想環境の構築(Vagrant)
python-lambda-localのインストール
pythonでローカル環境で開発を行えるツールです。
https://github.com/HDE/python-lambda-local
1 2 3 |
$ sudo pip install python-lambda-local |
lambda-uploaderのインストール
こちらはAWS lambdaにローカルからデプロイを行うためのツールです。
https://github.com/rackerlabs/lambda-uploader
1 2 3 |
$ sudo pip install lambda-uploader |
開発環境のファイル準備
ローカルからデプロイを行うためには以下の4つのファイルが必要になります。
requirements.txt | pipモジュールが書かれたファイル。 モジュール名だけの記載でもいいし、バージョンを指定するときは「<モジュール名>==<バージョン>」のように記載。 |
event.json | テスト時に投げるPOSTリクエストの内容で、GETリクエストのテストの場合は空でも問題ありません。 |
lambda.json | lambdaの設定ファイルで関数名やロールなどを記載する。 |
lambda_function.py(最初に実行するファイル名) | 実行される関数ファイル。 |
ではローカル環境で試してみます。
「python-lambda-local」に virtualenv の環境で使ってと書いてあるのでそちらの環境で実施してみます。
1 2 3 4 5 6 |
$ mkdir sampleFunction2 $ cd sampleFunction2 $ pyenv local python3.6 (python3.6)$ |
こちらで以下の4つのファイルを作成しました。
1 2 3 |
requests |
1 2 3 4 5 |
{ "url" : "http://developer-collaboration.com/" } |
1 2 3 4 5 6 7 8 9 10 11 |
{ "name": "sampleFunction2", "description": "LambdaFunciton Test", "region": "ap-northeast-1", "handler": "lambda_function.lambda_handler", "role": "arn:aws:iam::111111111111:role/MyLambdaExecRole", "timeout": 300, "memory": 128 } |
1 2 3 4 5 6 7 |
import requests def lambda_handler(event, context): response = requests.get(event['url']) return 'Status : %d' % response.status_code |
ローカルでの試験
ファイルが準備できたところでローカルでの試験を実施してみます。
python-lambda-local の利用方法は以下になります。
1 2 3 |
python-lambda-local [-f HANDLER_FUNCTION] FILE EVENT |
引数の説明は以下になります。
HANDLER_FUNCTION | イベントハンドラの名前になります。 今回の設定では「lambda_handler」となります。 |
FILE | 実行するpythonのファイル名です。 今回の設定では「lambda_function.py」となります。 |
EVENT | イベント用のjsonファイルです。 |
さて、こちらを実行すると以下のようになります。
1 2 3 4 5 6 7 8 9 |
(python3.6)$ python-lambda-local -f lambda_handler lambda_function.py event.json [root - INFO - 2018-09-05 05:11:51,464] Event: {u'url': u'http://developer-collaboration.com/'} [root - INFO - 2018-09-05 05:11:51,464] START RequestId: 5a98d77d-f54e-46e8-8b35-e6f9190de29a [root - INFO - 2018-09-05 05:11:54,183] END RequestId: 5a98d77d-f54e-46e8-8b35-e6f9190de29a [root - INFO - 2018-09-05 05:11:54,183] RESULT: Status : 200 [root - INFO - 2018-09-05 05:11:54,183] REPORT RequestId: 5a98d77d-f54e-46e8-8b35-e6f9190de29a Duration: 2717.98 ms |
無事、結果が出力されました。
デプロイ
ローカルでの試験が無事に終わったところでデプロイを行います。
1 2 3 4 5 6 |
(python3.6)$ lambda-uploader λ Building Package λ Uploading Package λ Fin |
コマンド一つで非常に簡単にデプロイが行えました。
AWSマネージメントコンソールでの試験
さて、デプロイしたファイルが実際に上がっているかと、動くかの試験をしてみます。
今回は最初の確認なのでAWSマネージメントコンソールで実施しましたが、ローカル環境からawsコマンドを叩くようなツールを作成し確認を行うなども慣れて来ると実施できます。
さて、AWSマネージメントコンソールに接続すると、無事関数が作成されており関数を確認すると以下のようになっていました。
今回、イベントなどは必要ないのでそのままテストを実施します。
「テストイベントの選択」をクリックし、「テストイベントの設定」を実施します。
テストイベントでは event.json に書いたように以下を設定します。
さて、それでは実際のテストを実施してみます。
「テスト」をクリックすると以下のような実行結果が出てきます。
こちらで関数の実行から返された結果が出ており、無事想定通りの結果となっていることを確認できました。
とりあえずは簡単なテストをしてみましたが、AWS Lambda ではローカルの開発環境などが非常に苦労しそうなので少しでも開発のしやすい手法を取れればと思います。
【関連記事】
・AWS LambdaでS3にファイルがアップロードされたのを検知する
・AWS LambdaでS3にファイルがアップロードされたら、加工して別フォルダにファイルを作成する(Python)
・外部のライブラリを利用してのAWS Lambdaの設定
このブログは株式会社CoLabMixによる技術ブログです。
GCP、AWSなどでのインフラ構築・運用や、クローリング・分析・検索などを主体とした開発を行なっています。
Ruby on RailsやDjango、Pythonなどの開発依頼などお気軽にお声がけください。
開発パートナーを増やしたいという企業と積極的に繋がっていきたいです。
お問い合わせやご依頼・ご相談など