BLOGブログ

AWS Lambdaの開発環境を構築~docker-lambdaの紹介~

AWSのLambdaで開発をする際、ローカル環境で特にデバッグ環境を構築していない場合
CloudWatch Logsで行う場合が多いのではないかと思いますが、反映されるまでに数十秒かかることもあり、これを繰り返し行うことで開発スピードが低下してしまいます。

 

今回は Lambdaのデバッグ効率を上げるdocker-lambdaの設定手順を紹介します。
名前からイメージ出来る通り、Dockerで疑似的にLambdaを実行するという物になります。

 

なお、本記事は以下に該当する主にエンジニアの方が閲覧することを想定して記載しています。

  • CLIに抵抗の無い方
  • Dockerを使ったことがある(既に環境がある)方
  • AWS Lambdaを使って(みようと思って)いる方
 

Dockerを予めインストールし、以下の手順でサンプルの実行を行ってください。

  1. docker-lambdaのダウンロード
  2. サンプルスクリプトの作成
  3. サンプルデータの作成
  4. サンプルの実行
 

1. lambci/docker-lambdaのダウンロード

まずはDockerホストからGitHubに登録されているdocker-lambdaのリポジトリをクローンします。

$ pwd
/home/docker
$ git clone https://github.com/lambci/docker-lambda.git
 

2. サンプルスクリプトの作成

次に、動作確認用のサンプルスクリプトをAWSコンソールから取得します。
「AWSコンソール」→「Lambda」→「Create a Lambda function」→「hello-world」
より適当な名前でLambdaを登録し、以下のようなテンプレートコードを取得します。

例)Node.js 4.3バージョン 1
 

上記のサンプルコードをコピーしてそのままDockerホストに設置します。

# Node.js 4.3バージョン
$ vi /var/task/example.js
'use strict';

console.log('Loading function');

exports.handler = (event, context, callback) => {
    //console.log('Received event:', JSON.stringify(event, null, 2));
    console.log('value1 =', event.key1);
    console.log('value2 =', event.key2);
    console.log('value3 =', event.key3);
    callback(null, event.key1);  // Echo back the first key value
    //callback('Something went wrong');
};

# Python 2.7バージョン
$ vi /var/task/example_function.py
from __future__ import print_function

import json

print('Loading function')


def lambda_handler(event, context):
    #print("Received event: " + json.dumps(event, indent=2))
    print("value1 = " + event['key1'])
    print("value2 = " + event['key2'])
    print("value3 = " + event['key3'])
    return event['key1']  # Echo back the first key value
    #raise Exception('Something went wrong')
 

3. サンプルデータの作成

そしてLambdaコンソールに登録されている「Hello World」テストデータを同じくDockerホストに設置します。
「Actions」→「Configure test event」→「Sample event template」→「Hello World」

$ vi /var/task/input.json
{
  "key3": "value3",
  "key2": "value2",
  "key1": "value1"
}
 

4. サンプルの実行

docker-lambdaの説明に記載されている例を参考に入力データを引数に渡して実行します。

$ cd /var/task

# Node.js 4.3バージョン
$ docker run -v "$PWD":/var/task lambci/lambda example.handler $(printf '%s' $(cat input.json))
START RequestId: f4618bdd-a27c-1a73-0628-bf1c786970c8 Version: $LATEST
2017-02-08T03:08:56.768Z        f4618bdd-a27c-1a73-0628-bf1c786970c8    Loading function
2017-02-08T03:08:56.771Z        f4618bdd-a27c-1a73-0628-bf1c786970c8    value1 = value1
2017-02-08T03:08:56.772Z        f4618bdd-a27c-1a73-0628-bf1c786970c8    value2 = value2
2017-02-08T03:08:56.772Z        f4618bdd-a27c-1a73-0628-bf1c786970c8    value3 = value3
END RequestId: f4618bdd-a27c-1a73-0628-bf1c786970c8
REPORT RequestId: f4618bdd-a27c-1a73-0628-bf1c786970c8  Duration: 19.51 ms      Billed Duration: 100 ms Memory Size: 1536 MB    Max Memory Used: 23 MB 

# Python 2.7バージョン
$ docker run -v "$PWD":/var/task lambci/lambda:python2.7 example_function.lambda_handler $(printf '%s' $(cat input.json))
START RequestId: 86e060f1-4676-451a-9704-20a3086cbd5d Version: $LATEST
Loading function
value1 = value1
value2 = value2
value3 = value3
END RequestId: 86e060f1-4676-451a-9704-20a3086cbd5d
REPORT RequestId: 86e060f1-4676-451a-9704-20a3086cbd5d Duration: 1 ms Billed Duration: 100 ms Memory Size: 1536 MB Max Memory Used: 13 MB
 

比較用としてAWSコンソールからLambdaをテスト実行してみます。

例)Node.js 4.3バージョン 2
 

最後に

このように、Lambdaに設置するコードをそのまま簡単に実行出来るため簡単な確認を行う際にはオススメです。

関連する記事

記事を書いた人

kibe

ジムに通い肉体改造に挑むエンジニア。 主にインフラ・ビッグデータに関連する仕事を行っているためエンジニア向けの記事を投稿。 最近はFPVに興味あり。