前提条件
環境はMacOSを想定しています。
Linux環境であれば問題ないとは思いますが、
Windows環境の方はパスなどを適宜読み替えてください。
また、Dockerの事前導入が必須です。
各環境へのDocker導入については他に素晴らしい記事があるので割愛します。
概要
ローカル環境でLambda用に作成したスクリプト
を動かします。
経緯
私は今まで、AWSマネジメントコンソールから、
WebIDEを用いて、もしくはzip形式でアップロードし
実機のLambdaにデータを送信することでテストを行っていました。
しかし、開発中何度もコードを修正すると
いちいちコンソールを開いたりzipに固めてアップするのがかなり億劫になってきます。😫
また、Lambdaは動作分だけ料金が発生してしまうので、
重たい処理をバシバシ叩いているとコストが嵩んだりも😱
そこで、今回紹介する方法でローカル開発環境を用意し、
課金を発生させず、開発効率をガンガン上げていきましょう!
環境構築
Dockerの導入
各環境へのDocker導入については、
公式ドキュメント他、Web上に素晴らしい記事がたくさんあるので割愛します。
Dockerがインストールされた状態を用意してください。
インストールされていれば、以下のコマンドを実行できるハズです。
# Dockerが動作していることを確認
$ docker --version
Docker version 18.09.2, build 6247962
動作確認用スクリプト
ファイル構成
今回作成するのは
Lambdaのスクリプト、スクリプトが使用するLayerモジュール、環境変数ファイル
の3ファイルです。
AWS Lambda レイヤーについてはこちらを参照してください。
簡単に言うとLambda内のスクリプトに対して割り当てられるモジュール(ライブラリ)です。
今回の方法ではこのレイヤー機能を使用している場合でも動作させることができます。
something_dir
├── src
│ └── lambda_function.py
├── layer
│ └── layer_module.py
└── .env
ファイル内容は以下のとおりです。
"""メイン関数ファイル
"""
import os
import json
from layer_module import return_prefix
def lambda_handler(event, context):
"""環境名+eventの内容を標準出力に出す
"""
env = os.environ.get("ENV", "no_env")
# [環境名]: eventの中身
return return_prefix(env) + json.dumps(event)
"""Layerモジュール
"""
def return_prefix(env_name):
""" "[環境変数名]: "を返す
"""
return "[" + env_name + "]: "
ENV=LOCAL
ローカル環境で動かしてみる
早速スクリプトを動かしてみましょう。
Lambda環境を模倣するのに、Dockerを使用します。
既にOSSでLambCIという、Lambdaの環境を用意したイメージがありますので、これをお借りします。
このイメージの使い方はRun Examplesにてほぼ全て網羅されています。
docker run [--rm] -v <code_dir>:/var/task [-v <layer_dir>:/opt] lambci/lambda:<runtime> [<handler>] [<event>]
では以下のように指定し、Lambdaを動かしてみましょう。
cd something_dir
docker run --rm -v "$PWD"/src:/var/task -v "$PWD"/layer:/opt/python --env-file .env lambci/lambda:python3.6 lambda_function.lambda_handler '{"foo":"bar"}'
すると、以下のようなメッセージが現れるはずです。
START RequestId: 67154e64-2a74-4ce5-80ca-be4f9f158850 Version: $LATEST
END RequestId: 67154e64-2a74-4ce5-80ca-be4f9f158850
REPORT RequestId: 67154e64-2a74-4ce5-80ca-be4f9f158850 Duration: 36 ms Billed Duration: 100 ms Memory Size: 1536 MB Max Memory Used: 19 MB
"[LOCAL]: {\"foo\": \"bar\"}"
このように出ていれば成功です!
実行上の注意
Dockerコンテナをrunする時、
レイヤーを割り当てるディレクトリには注意が必要です。
公式にはレイヤーを割り当てる際、以下のようなオプションを付けるよう書いてありますが、
[-v <layer_dir>:/opt]
例えばPythonでは、以下のように割り当てる必要があります。
[-v <layer_dir>:/opt/python]
まとめ
今回は、環境変数&Lambdaレイヤーまで再現できるLambdaローカル環境を作りました。
このLambCIを使うと、ENVやLayer機能含めた
非常に実機に近い形で動かすことができるので、ぜひお試しください!😘