はじめに
Lambdaのプログラムをテストする際、毎回 Lambda 関数を更新して実行するのは面倒ではないですか?
そこで良い方法ないかなと調べていたところ、 python-lambda-local というツールを知りました。
仕様
Python 3.7+
今回試した環境のバージョンは 3.9.6 でした。
$ python3 --version
Python 3.9.6
インストール
pip でインストールすれば完了です。
$ pip install python-lambda-local
オプション
使い方とオプションは以下になります。
$ 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 関数を作成します。
import json
def lambda_handler(event, context):
# TODO implement
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
eventファイルの作成
次に実行する際に引数として与える json を作成します。
{
"key1": "value1",
"key2": "value2",
"key3": "value3"
}
ファイルは以下のように同じディレクトリで用意してください。
$ ls
event.json lambda_function.py print.py
Lambda関数の実行
以下のようにコマンドを実行してみてください。
$ 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 が出力されています。
今度は先ほどのプログラムファイルに以下のように修正してください。
import json
def lambda_handler(event, context):
# 以下 2 行追加
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 関数を実行します。
$ 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 のプログラムがとても簡単になりました。
似たようなツールはまだあるみたいなので、時間がある時に他も試してみたいと思います。
参考