前回Python開発環境構築 ー PyCharm × AnacondaでPythonの開発環境を構築しましたが、そのままでLambdaを開発すると、コード編集するたびにzipしてupload、invokeで挙動を確認することになり、生産性が落ちてしまうので、コマンド一発でやる方法を~~python-lambda-local~~とlambda-uploaderで試します。
##環境
- Windows Server 2012 (EC2利用)
- Anaconda (Python実行環境)
- PyCharm (IDE)
python-lambda-local(ローカル環境エミュレータ)- lambda-uploader(AWS Lambda にデプロイ)
##python-lambda-localとは
lambda関数をローカル環境で実行できるドライバー的ななツール
インストールも簡単で、コマンドラインでpipを実行すればよい
> pip install python-lambda-local
> python-lambda-local --version
python-lambda-local 1.0.5
##lambda-uploaderとは
ローカル環境で作ったlambdaコードをZIPして、AWS Lambdaにアップロードするデプロイツール
インストールは同じくコマンドラインでpipを実行すればよい
> pip install lambda-uploader
> lambda-local --version
1.2.0
実は前回Python開発環境構築 ー PyCharm × AnacondaでAnacondaインストールするときにミスったことがあり、なんと「Add Anaconda to my PATH environment variable」のチェックをせずに進んでしまいました。
それが原因で、以下の実行で、「内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されません」エラーがでて、慌ててPATH追加をしました。
> python-lambda-local --version
> lambda-local --version
Pathに%ProgramData%\Anaconda3\Scripts\を追加します。
※pythonを実行する環境PATHも必要なので、%ProgramData%\Anaconda3\も忘れずに。
##python-lambda-local実行
早速python-lambda-localを実行して、lambda_function.pyをInvokeします。
import json
def lambda_handler(event, context):
print("start")
print("id:" + event['id'])
print("product:" + event['product'])
print("sex:" + event['sex'])
print("price:" + event['price'])
事前準備として、event.json(イベントトリガー)を用意する必要があります。
{
"id": "prodid_0001",
"product": "pullover jacket",
"sex": "kids",
"price": "3000"
}
実行はPyCharmのTerminalを使うと便利です。
> python-lambda-local -f lambda_handler lambda_function.py event.json
エラーをググってみると、
signal.signal(signal.SIGALRM, signal_handler)
AttributeError: module 'signal' has no attribute 'SIGALRM'
Windows環境ではSIGALRMをCallできないようです。こちら参照:18.8. signal — 非同期イベントにハンドラを設定する
ここで、windows環境でpython-lambda-localの利用を断念しました。
test.pyなどで呼び出せるか別で試しましょう。
##lambda-uploader実行
lambda-uploaderももしかしてWindows環境じゃダメではないかとドキドキしつつやってみました。
こちらは無事、想定通りの動きをしてくれて最低限アップロードができました。
###事前準備として
1.awscliを使えるようにします。
awscliはすでにインストール済みなので、
> aws configure --profile lambda-dev
AWS Access Key ID [None]: {Your Access Key Id}
AWS Secret Access Key [None]: {Your Secret Access Key}
Default region name [None]: ap-northeast-1
Default output format [None]: json
を入れていけば、ユーザディレクトリの.awsフォルダにcredentialsファイルが作成されます。
profile名がlambda-dev
2.Lambda関数の設定情報lambda.jsonを作成
{
"name": "samplelambda",
"description": "samplelambda",
"region": "ap-northeast-1",
"handler": "lambda_function.lambda_handler",
"role": "arn:aws:iam::xxxxxxxxxxxx:role/lambda_access_execution",
"timeout": 300,
"memory": 128
}
3.必要な外部ライブラリ一覧requirements.txtを作成
requirements.txtに、
requests
future
を記載して保存。
上記で準備したファイルをsamplelambdaフォルダの直下に配置します。
###lambda-uploader実行
> lambda-uploader --profile lambda-dev
##Lambda実行
ローカルでInvokeできないので、アップロード後、AWS Management Console画面で実行
TestEventを作成し
「Test」ボタンを押します。
##参考記事
AWS Lambda Pythonをローカル環境で実行
lambda-uploaderを使ってAWS Lambdaをリモートで開発、実行、デプロイする