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

前回[Python開発環境構築 ー PyCharm × Anaconda](https://qiita.com/tanj/items/d88a3084a092bb106a97)でPythonの開発環境を構築しましたが、そのままでLambdaを開発すると、コード編集するたびにzipしてupload、invokeで挙動を確認することになり、生産性が落ちてしまうので、コマンド一発でやる方法を~~[python-lambda-local](https://github.com/HDE/python-lambda-local)~~と[lambda-uploader](https://github.com/rackerlabs/lambda-uploader)で試します。
##環境
* Windows Server 2012 (EC2利用)
* Anaconda (Python実行環境)
* PyCharm (IDE)
* ~~[python-lambda-local](https://github.com/HDE/python-lambda-local)(ローカル環境エミュレータ)~~
* [lambda-uploader](https://github.com/rackerlabs/lambda-uploader)(AWS Lambda にデプロイ)

##python-lambda-localとは
lambda関数をローカル環境で実行できるドライバー的ななツール
インストールも簡単で、コマンドラインでpipを実行すればよい

```shell
> pip install python-lambda-local

> python-lambda-local --version
python-lambda-local 1.0.5
```

##lambda-uploaderとは
ローカル環境で作ったlambdaコードをZIPして、AWS Lambdaにアップロードするデプロイツール
インストールは同じくコマンドラインでpipを実行すればよい

```shell
> pip install lambda-uploader

> lambda-local --version
1.2.0
```

実は前回[Python開発環境構築 ー PyCharm × Anaconda](https://qiita.com/tanj/items/d88a3084a092bb106a97)でAnacondaインストールするときにミスったことがあり、なんと「Add Anaconda to my PATH environment variable」のチェックをせずに進んでしまいました。
それが原因で、以下の実行で、「内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ　ファイルとして認識されません」エラーがでて、慌ててPATH追加をしました。

```shell
> python-lambda-local --version
> lambda-local --version
```
Pathに%ProgramData%\Anaconda3\Scripts\を追加します。
※pythonを実行する環境PATHも必要なので、%ProgramData%\Anaconda3\も忘れずに。
![image1.png](https://qiita-image-store.s3.amazonaws.com/0/191079/30a36ad5-2873-fa28-fea2-2a7cdbdf168d.png)

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

```python3: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（イベントトリガー）を用意する必要があります。

```json:event.json
{
  "id": "prodid_0001",
  "product": "pullover jacket",
  "sex": "kids",
  "price": "3000"
}
```
実行はPyCharmのTerminalを使うと便利です。

```shell
> python-lambda-local -f lambda_handler lambda_function.py event.json
```
![image2.png](https://qiita-image-store.s3.amazonaws.com/0/191079/fe5fa7cd-109d-2700-7ac0-17d0bb361061.png)
残念ですが、エラーが多発でなかなかうまくいかないですね。
![image3.png](https://qiita-image-store.s3.amazonaws.com/0/191079/089fb94e-299c-ce36-aed8-f48f5ddb88f5.png)

エラーをググってみると、
signal.signal(signal.SIGALRM, signal_handler)
AttributeError: module 'signal' has no attribute 'SIGALRM'
![image4.png](https://qiita-image-store.s3.amazonaws.com/0/191079/ea9e0376-e8e9-0fd0-3769-7a01c814b7e3.png)
Windows環境ではSIGALRMをCallできないようです。こちら参照：[18.8. signal — 非同期イベントにハンドラを設定する
](https://docs.python.jp/3/library/signal.html)ここで、windows環境でpython-lambda-localの利用を断念しました。
test.pyなどで呼び出せるか別で試しましょう。

##lambda-uploader実行
lambda-uploaderももしかしてWindows環境じゃダメではないかとドキドキしつつやってみました。
こちらは無事、想定通りの動きをしてくれて最低限アップロードができました。

###事前準備として

1.awscliを使えるようにします。
awscliはすでにインストール済みなので、

```shell
> 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](https://qiita-image-store.s3.amazonaws.com/0/191079/948cd467-ac64-aa44-99f2-cfd7e35a765e.png)
profile名がlambda-dev

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

```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に、

```text
requests
future
```
を記載して保存。
上記で準備したファイルをsamplelambdaフォルダの直下に配置します。
![image6.png](https://qiita-image-store.s3.amazonaws.com/0/191079/9db03f28-b3d7-1626-aa05-b2eca69df24d.png)

###lambda-uploader実行
```shell
> lambda-uploader --profile lambda-dev
```
![image7.png](https://qiita-image-store.s3.amazonaws.com/0/191079/555adbc3-35cb-cc2b-6d8f-76729058c4cf.png)
無事完了しました。

##Lambda実行
ローカルでInvokeできないので、アップロード後、AWS Management Console画面で実行
TestEventを作成し
![image8.png](https://qiita-image-store.s3.amazonaws.com/0/191079/c65ced47-ae84-3f63-46fd-452f1743551f.png)
「Test」ボタンを押します。
![image9.png](https://qiita-image-store.s3.amazonaws.com/0/191079/2460ee7e-2d6c-0df6-2ac9-cd41f929bc64.png)

##参考記事
[AWS Lambda Pythonをローカル環境で実行](https://dev.classmethod.jp/cloud/aws/invoke-aws-lambda-python-locally/)
[lambda-uploaderを使ってAWS Lambdaをリモートで開発、実行、デプロイする](https://qiita.com/Esfahan/items/08fa6af8811dada4cb2a)