python-lambda-local を使って AWS Lambda 関数をローカル環境で実行する

# はじめに
Lambdaのプログラムをテストする際、毎回 Lambda 関数を更新して実行するのは面倒ではないですか？
そこで良い方法ないかなと調べていたところ、 **python-lambda-local** というツールを知りました。

https://github.com/HDE/python-lambda-local


# 仕様
Python 3.7+
今回試した環境のバージョンは 3.9.6 でした。
```bash:バージョン
$ python3 --version
Python 3.9.6
```


# インストール
pip でインストールすれば完了です。

```bash:インストール
$ pip install python-lambda-local
```


# オプション
使い方とオプションは以下になります。

```bash:使い方
$ python-lambda-local [-h] [-l LIBRARY_PATH] [-f HANDLER_FUNCTION]
                      [-t TIMEOUT] [-a ARN_STRING] [-v VERSION_NAME]
                      [-e ENVIRONMENT_VARIABLES] [--version]
                      FILE EVENT
```

|オプション                                      |説明              |
|---------------------------------------------|------------------|
|-h, --help                                   |ヘルプメッセージの表示 |
|-f HANDLER_FUNCTION                          |Lambda関数のハンドラー名。 デフォルトは *"handler"* |
|-t TIMEOUT, --timeout TIMEOUT                |Lambda関数がタイムアウトするまでの秒数。 デフォルトは 3 秒 |
|-a ARN_STRING, --arn-string ARN_STRING　       |Lambda関数のARN |
|-v VERSION_NAME, --version-name VERSION_NAME |Lambda関数のバージョン |
|-e ENVIRONMENT_VARIABLES, --environment-variables ENVIRONMENT_VARIABLES |環境変数 |
|--version                                     |ツールのバージョン |


# 実践
それでは実際にローカル環境でLambda関数を実行してみます。

## Lambda関数の作成
まずはじめに以下の内容で Lambda 関数を作成します。

```python:lambda_function.py
import json

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
```

## eventファイルの作成
次に実行する際に引数として与える json を作成します。

```json:event.json
{
  "key1": "value1",
  "key2": "value2",
  "key3": "value3"
}
```

ファイルは以下のように同じディレクトリで用意してください。

```bash:ls
$ ls
event.json		lambda_function.py	print.py
```

## Lambda関数の実行
以下のようにコマンドを実行してみてください。

```bash:実行
$ python-lambda-local -f lambda_handler lambda_function.py event.json
[root - INFO - 2024-05-30 23:23:27,592] Event: {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
[root - INFO - 2024-05-30 23:23:27,592] START RequestId: 0d3add3f-df1b-4adb-bf48-a046410fc137 Version: 
[root - INFO - 2024-05-30 23:23:27,716] END RequestId: 0d3add3f-df1b-4adb-bf48-a046410fc137
[root - INFO - 2024-05-30 23:23:27,716] REPORT RequestId: 0d3add3f-df1b-4adb-bf48-a046410fc137	Duration: 0.03 ms
[root - INFO - 2024-05-30 23:23:27,716] RESULT:
{'statusCode': 200, 'body': '"Hello from Lambda!"'}
```

末尾に `{'statusCode': 200, 'body': '"Hello from Lambda!"'}` が出力されていればOKです。
*lambda_function1.py* で記述した *retrun* が出力されています。

今度は先ほどのプログラムファイルに以下のように修正してください。

```python:lambda_function.py
import json

def lambda_handler(event, context):

    # 以下 ２ 行追加
    for each_key, each_value in event.items():
        print("key:" + each_key + ",value" + each_value)

    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
```

改めて `python-lambda-local`　を使って Lambda 関数を実行します。

```bash:実行
$ python-lambda-local -f lambda_handler lambda_function.py event.json
[root - INFO - 2024-05-30 23:36:55,281] Event: {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
[root - INFO - 2024-05-30 23:36:55,281] START RequestId: 2750a922-325d-443c-95d0-3c7ac550d438 Version: 
key:key1,valuevalue1
key:key2,valuevalue2
key:key3,valuevalue3
[root - INFO - 2024-05-30 23:36:55,416] END RequestId: 2750a922-325d-443c-95d0-3c7ac550d438
[root - INFO - 2024-05-30 23:36:55,416] REPORT RequestId: 2750a922-325d-443c-95d0-3c7ac550d438	Duration: 0.05 ms
[root - INFO - 2024-05-30 23:36:55,416] RESULT:
{'statusCode': 200, 'body': '"Hello from Lambda!"'}
```

今度は *print* で指定した *event.json* の内容も出力されることが確認できました。




# おわりに
`python-lambda-local` のおかげで Lambda のプログラムがとても簡単になりました。
似たようなツールはまだあるみたいなので、時間がある時に他も試してみたいと思います。

---

#### 参考
https://pypi.org/project/python-lambda-local/