LoginSignup
20
23

More than 5 years have passed since last update.

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

Posted at

前回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をリモートで開発、実行、デプロイする

20
23
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
23