Yuta NakataのBlog

Python / AWS / ITについて役立つ情報を発信します

AWS Lambda(Python) をローカルで実行する方法

はじめに

AWS Lambdaは、サーバーレスアプリケーション開発において、とても重宝します。

15分でタイムアウトや、メモリサイズ・エフェメラルストレージに制限があったり、サードパーティーライブラリのインストールがLayerという方法から行うなど、それなりの制限やクセはありますが、アプリケーション開発で有用であることに疑いの余地はありません。

Lambda初心者であれば、まずはマネジメントコンソール(通称:マネコン)をポチポチ操作するところから始まると思いますが、CI/CIの観点などから、実際のサービス開発においてはこの方法は現実的ではなく、SAM(Serverless Application Model)を用いて、開発することになると思います。

このとき、

Lambdaを用いて開発行う -> AWS Upload -> 動作確認

は、動作確認するための時間的なコストが高く、手軽に試験することができません。

もっと簡単に・手軽にlambdaのソースコードが正しいか確認したい!!!

これを実現するために使用し、今回紹介するのがpython-lambda-localです。

インストールする方法

python-lambda-localPyPiに登録されていますので、簡単にインストールすることができます。

以下のコマンドでインストールしてみてください。

pip install python-lambda-local

これで事前準備は完了です。

実行してみた

以下のようなディレクトリ構成があるとします。

sample-app/
├── app
│   └── lambda_function.py
└── test
    └── event.json

各ファイルには、以下の内容が記載されているものとします。

def lambda_handler(event, context):
    return "Hello world"
{}

この状態の各ファイルにおいて、

% pwd
/sample-app

% ls 
app/  test/

の場所において、

python-lambda-local -f lambda_handler app/lambda_function.py test/event.json

と実行すると、

% python-lambda-local -f lambda_handler app/lambda_function.py test/event.json 
[root - INFO - 2023-09-09 14:59:41,124] Event: {}
[root - INFO - 2023-09-09 14:59:41,124] START RequestId: ab09e349-14ac-4799-b649-f23ffda615a5 Version: 
[root - INFO - 2023-09-09 14:59:41,267] END RequestId: ab09e349-14ac-4799-b649-f23ffda615a5
[root - INFO - 2023-09-09 14:59:41,267] REPORT RequestId: ab09e349-14ac-4799-b649-f23ffda615a5  Duration: 0.03 ms
[root - INFO - 2023-09-09 14:59:41,267] RESULT:
Hello world

といった形で実行することができます!

上記のコマンドのPOINTは、

python-lambda-local -f <関数名> <対象のコード名> <関数内のeventで読むためのjsonファイル>

となります。

これで基本的な使い方はOKです!

環境変数を加える

lambdaの中で環境変数を加えているケースがあるかと思います。 この場合の実現方法も合わせて、お教えします。

1.ディレクトリ構成

.
├── app
│   └── lambda_function.py
├── env
│   └── env.json
└── test
    └── event.json

2.env/env.jsonの中身

{
    "BUCKET_NAME": "my-bucket"
}

3. lambda_function.pyの中身

import os

def lambda_handler(event, context):
    bucket = os.environ["BUCKET_NAME"]
    print("bucket :",bucket)
    return "Hello world"

4. 実行コマンド

python-lambda-local -f lambda_handler app/lambda_function.py test/event.json -e env/env.json

といったように、-eでファイルを指定してあげればOKです!

サンプルコード

Githubにあげておきます。

github.com

制限

あくまでも、動作確認のためのツールですので、デプロイなどはできないようです。 最新情報はこちらから、ご確認ください。

pypi.org

参考になった方はぜひ、コメントなどお待ちしております!