TL;DR
- AWSマネジメントコンソール上ではLambdaのコードを編集しない
- コードは全てバージョン管理が有効になったローカルIDE上で開発し、docker-lambdaを利用して迅速にテストできるようにする
ローカルでLambdaを開発するフローを考える
最も単純なLambdaの開発プロセス
- AWSマネジメントコンソールを利用した最も単純なLambda開発のフローを整理すると、以下のフローになります
- ローカルでコードを書く
- AWSマネジメントコンソールにログイン
- 関数を新規作成、ローカルで編集したコードをブラウザ上のエディタにコピー&ペースト
- 関数の実行テスト
- 失敗した場合は原因を特定してローカルのコードを再編集(ここで直接ブラウザ上のエディタを編集したくなるが、ローカルのコードと同期が取れなくなってしまう)
- 修正したコードををブラウザ上のエディタにコピー&ペースト
- 成功するまで4〜6を繰り返す必要がある(!)。手作業でコピペするのは辛く、イケてない。
- Lambda上で動作することが保証されているコードを一回だけ動かすようなケースであれば、上記までのやりかたでもそこまで不便な点は感じないかもしれません。
- しかし実際の業務においてはコーディングとテスト実行を幾度も繰り返すことになるはずです。その場合、上記フローでの開発作業には以下のような問題があります
- AWSマネジメントコンソール上でコードを修正してしまうと、バージョン管理されているローカルのコードと同期が取れなくなってしまう
- Lambda Layersの開発・テストをする場合、圧縮してデプロイなど非効率的で手間のかかる作業が必要になる
dockerコンテナを利用した効率的なlambda開発
- https://github.com/lambci/docker-lambda
- リアルなLambda実行環境を模した、Lambdaのローカル開発環境のサンドボックスを提供してくれるOSSプロジェクト。詳細はリンク先を。
- ローカル環境でコーディングしているLambda function、Layersを都度コンテナ内で実行して確認することができるので、効率的なLambdaの開発が可能になります。
- リアルなLambda実行環境とは、Lambda関数が実行される際にマネージドでLambdaのコードがデプロイされるAMIのことです。
- ファイル構造
- 権限
- 環境変数
- ユーザ
- プロセス
- など
docker-lambdaを利用したLambdaの開発プロセス
Lambdaが正常に動作することのテストを、以下の2ステップまで圧縮できます。
- ローカルでコードを書く
- docker-lambda上で実行テスト(
docker run
するだけで実行完了!) - デプロイ
- lambda関数のテストが、以下のコマンドだけで完了するのです。感動しますね。
docker run --rm \
-v <code_dir>:/var/task:ro,delegated \
[-v <layer_dir>:/opt:ro,delegated] \
lambci/lambda:<runtime> \
[<handler>] [<event>]
docker-lambdaを利用したLambda function実行の例
- docker-lambdaのREADMEに記載にある通り、コンテナ内の
/var/task
に関数のハンドラー、/opt
にLayersのコードをマウントして実行することで、コンテナ内で関数を実行されることができます。 - これでいちいちLayerを圧縮する必要も、ローカルのコードを都度マネジメントコンソールのエディタ上にペーストする必要もなくなります。
- 以下のサンプルでは、ハンドラーが
/develop/lambda-local-proj/function
、Layersが/develop/lambda-local-proj/layer
に存在しており、それをdocker-lambdaの指定のディレクトリにマウントして起動しています。 - ランタイムにPythonを利用しています。
# function、layerのディレクトリをマウントして実行
(venv) 6477:lambda-local-proj sentorei$ docker run --rm -v /Users/sentorei/develop/lambda-local-proj/function:/var/task:ro,delegated -v /Users/sentorei/develop/lambda-local-proj/layer:/opt:ro,delegated lambci/lambda:python3.8 lambda_function.lambda_handler
# ステータスコード200が返され、正常に実行できていることが確認できる
START RequestId: 9f1133d8-9bf4-1629-a2c2-832baf3cc23a Version: $LATEST
END RequestId: 9f1133d8-9bf4-1629-a2c2-832baf3cc23a
REPORT RequestId: 9f1133d8-9bf4-1629-a2c2-832baf3cc23a Init Duration: 1835.48 ms Duration: 588.13 ms Billed Duration: 600 ms Memory Size: 1536 MB Max Memory Used: 31 MB
{"statusCode":200,"body":"\"Hello from Lambda!\""}
- 煩雑なテスト作業から脱出し、ぜひ皆さんも快適なLambda開発を始めましょう。