今回Lambda関数のテストをローカル環境でできないかなと調べていまして、Amazonが公式に公開しているdockerイメージ(aws-lambda-python)を使用すれば簡単に動かせるらしいということを知りました。
ただ、これを説明しているサイトだとイメージの作成、ポートの指定とかコマンド直打ちでやってるのが多くてめんどくさい(みんなバラバラのイメージ名、ポート番号だと正直めんどくさい)なあと思ったので、このあたりをdocker-composeで簡単かつ自動で動くようにしちゃおうというものです。
「aws-lambda-python 使い方」とか調べても出てこなかったので、参考にしていただければ幸いです。
環境
- Windows 10
- Docker for Windows
- Git Bash
前提
上記がすべてインストール済みであること。
今回のディレクトリ構成
proj/
├ app.py
├ docker-compose.yml
└ Dockerfile
方法
app.pyに実行する内容を書きます。今回はシンプルに文字列を返すだけのものにしてます。
def handler(event, context):
return 'Hello World! from Lambda'
Amazon公式ドキュメントに書いてある内容を貼り付けます。
FROM public.ecr.aws/lambda/python:3.8
COPY app.py ${LAMBDA_TASK_ROOT}
CMD [ "app.handler" ]
これで公式サイトに書いてある方法で実行できるのですが、正直2,3ステップ踏むのが面倒だなあと感じたのでこの先の手順を自動化します。
version: "3.9"
services:
lambda:
build: .
ports:
- "9000:8080"
試してみる。
ここまでやったら準備は整ったので、いよいよ進めます。
今回のプロジェクトファイルのあるディレクトリで以下を実行。
$ docker-compose up -d
これだけで9000番ポートでLambdaを実行できるようになりました。
最後に確認してみます。
$ curl http://127.0.0.1:9000/2015-03-31/functions/function/invocations -s -d '{}'
"Hello World! from Lambda"
これ、windowsのコマンドプロンプトでやると以下のようなエラーが発生するので、気を付けてください。(なので、環境のところで敢えてGit Bashと書きました。)
{"errorMessage": "Unable to unmarshal input: Expecting value: line 1 column 1 (char 0)", "errorType": "Runtime.UnmarshalError", "stackTrace": []}