はじめに
サーバーレスなどでLambdaを使うとかっこいいけど、ローカルで実行しづらく
かと言ってAWSにデプロイして動かしてデバッグするというのは時間と手間がかかるので
なんかいい方法ないかなと模索した結果のまとめです。
前提
- LambdaをPythonで書いている(多分他の言語でも大丈夫)
- デプロイは、ECR経由でDockerイメージで実施
- lambci/docker-lambdaを使う
方法
依存ライブラリなどなし
READMEにあるように、
docker run --rm -v "$PWD":/var/task:ro,delegated \
lambci/lambda:python3.8 lambda_function.lambda_handler
とするだけ。
event に渡したいJSONパラメータがあるのであれば、lambda_handler の後に指定するだけよいです(これもREADMEにある通り)
この辺は、いろんな人が記事書いているので、特筆することもないかなと思います。
依存ライブラリなどあり
lambci/docker-lambdaを単純に使うだけだと実はできなくて、ちょっとした裏技(?)が必要です。
実はこの辺書いている記事を見つけられなくて、ちょっと時間かかりました。
実行用のDockerイメージを用意する
FROM lambci/lambda:build-python3.8
COPY requirements.txt ${LAMBDA_TASK_ROOT}
RUN pip install --upgrade pip \
&& pip install -r requirements.txt
RUN yum -y install poppler-utils
ENTRYPOINT ["/var/rapid/init", "--bootstrap", "/var/runtime/bootstrap", "--enable-msg-logs"]
今回はサンプルとして poppler-utils を入れています。
あと、requirements.txt はこんな感じ。
pdf2image==1.16.0
実行用のDockerイメージを作成する
docker build -t hogehoge:debug .
実行する
docker run --rm -v "$PWD":/var/task:ro,delegated \
hogehoge:debug lambda_function.lambda_handler
実は、指定するDockerイメージを差し替えただけです。
もし、Lambdaの中でAWS内のリソース(S3やECR)にアクセスする場合は、env ファイルを用意して指定するとよいです。
AWS_ACCESS_KEY_ID=AKIQURAH5AQUP45R44T4
AWS_SECRET_ACCESS_KEY=YRFJeT1F219dR8BiFrQmybf3MPyHWBQ19WvZrMAw
AWS_DEFAULT_REGION=ap-northeast-1
docker run --rm -v "$PWD":/var/task:ro,delegated \
--env-file env hogehoge:debug lambda_function.lambda_handler
最後に
この方法を知っているだけでLambdaのデバッグが簡単にできるので個人的にオススメです。