概要
Lambdaのローカルテスト環境をDockerで作成しました。本記事ではPythonで書いています。
公式ドキュメントを読んでも上手くいかなかったので、記事にします。
用意するもの
- Dockerコマンドを実行できる環境
構築手順
ディレトリ構成
(プロジェクトルートディレクトリ)/
├── Dockerfile
├── requirements.txt (不要なら作成しなくて良い)
└── app.py
ファイル作成
FROM public.ecr.aws/lambda/python:3.8
COPY app.py ${LAMBDA_TASK_ROOT}
COPY requirements.txt .
RUN pip3 install -r requirements.txt --target "${LAMBDA_TASK_ROOT}"
CMD [ "app.handler" ]
import sys
def handler(event, context):
return 'Hello, This is Lambda Test'
※本記事ではrequirements.txt
は空で環境作成します。
何か必要なモジュールがあれば追記して次の動作確認をしてください。
環境構築・動作確認
1. イメージ作成
テストでhello-world
という名前のイメージにしていますが、お好きな名前で問題ございません。
$ docker build -t hello-world .
2. コンテナ作成
ローカルはポート9000で公開していますが、こちらもお好きなポートで大丈夫です。コンテナ内の8080ポートについては変更しないでください。
$ docker run -p 9000:8080 hello-world
~~
02 Mar 2022 15:57:27,797 [INFO] (rapid) exec '/var/runtime/bootstrap' (cwd=/var/task, handler=)
3. 動作確認
別ターミナルを起動し、curl
で作成した関数を実行します。/2015-03-31/functions/function/invocations
のパスについてはDockerfileで指定したイメージによるものなので特に考えずに設定してください。
app.py
で設定したレスポンスが表示されます。
$ curl -d '{}' http://localhost:9000/2015-03-31/functions/function/invocations
"Hello, This is Lambda Test"
コンテナ作成を実行したターミナルのログには以下が表示されます。環境などによって表示が異なりますのでご承知おきください。
02 Mar 2022 15:57:27,797 [INFO] (rapid) exec '/var/runtime/bootstrap' (cwd=/var/task, handler=)
02 Mar 2022 16:00:22,977 [INFO] (rapid) extensionsDisabledByLayer(/opt/disable-extensions-jwigqn8j) -> stat /opt/disable-extensions-jwigqn8j: no such file or directory
02 Mar 2022 16:00:22,977 [WARNING] (rapid) Cannot list external agents error=open /opt/extensions: no such file or directory
START RequestId: f96f05b2-cf54-4ebf-94d7-d8399c37afcd Version: $LATEST
END RequestId: f96f05b2-cf54-4ebf-94d7-d8399c37afcd
REPORT RequestId: f96f05b2-cf54-4ebf-94d7-d8399c37afcd Init Duration: 0.21 ms Duration: 65.85 ms Billed Duration: 66 ms Memory Size: 3008 MB Max Memory Used: 3008 MB
まとめ
Docker+Lambdaのローカルテスト環境が簡単に作成できました。
テストを書く際はapp.pyを編集したり、requirements.txtに必要なモジュールを記載してからビルドしてください。