Python
lambda

AWS Lambda Pythonをローカル環境で実行&デプロイ

前回Python開発環境構築 ー PyCharm × AnacondaでPythonの開発環境を構築しましたが、そのままでLambdaを開発すると、コード編集するたびにzipしてupload、invokeで挙動を確認することになり、生産性が落ちてしまうので、コマンド一発でやる方法をpython-lambda-locallambda-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\も忘れずに。
image1.png

python-lambda-local実行

早速python-lambda-localを実行して、lambda_function.pyをInvokeします。

lambda_function.py
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(イベントトリガー)を用意する必要があります。

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

image2.png
残念ですが、エラーが多発でなかなかうまくいかないですね。
image3.png

エラーをググってみると、
signal.signal(signal.SIGALRM, signal_handler)
AttributeError: module 'signal' has no attribute 'SIGALRM'
image4.png
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ファイルが作成されます。
image5.png
profile名がlambda-dev

2.Lambda関数の設定情報lambda.jsonを作成

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フォルダの直下に配置します。
image6.png

lambda-uploader実行

> lambda-uploader --profile lambda-dev

image7.png
無事完了しました。

Lambda実行

ローカルでInvokeできないので、アップロード後、AWS Management Console画面で実行
TestEventを作成し
image8.png
「Test」ボタンを押します。
image9.png

参考記事

AWS Lambda Pythonをローカル環境で実行
lambda-uploaderを使ってAWS Lambdaをリモートで開発、実行、デプロイする