LoginSignup
19
15

More than 5 years have passed since last update.

AWS Lambdaをローカル環境で動作確認しよう!

Last updated at Posted at 2019-04-25

前提条件

環境は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 

ファイル内容は以下のとおりです。

lambda_function.py
"""メイン関数ファイル
"""
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_module.py
"""Layerモジュール
"""
def return_prefix(env_name):
    """ "[環境変数名]: "を返す
    """
    return "[" + env_name + "]: "
.env
ENV=LOCAL

ローカル環境で動かしてみる

早速スクリプトを動かしてみましょう。

Lambda環境を模倣するのに、Dockerを使用します。
既にOSSでLambCIという、Lambdaの環境を用意したイメージがありますので、これをお借りします。

lambci/docker-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機能含めた
非常に実機に近い形で動かすことができるので、ぜひお試しください!😘

19
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
15