AWS Lambdaの開発環境を構築~docker-lambdaの紹介~
AWSのLambdaで開発をする際、ローカル環境で特にデバッグ環境を構築していない場合
CloudWatch Logsで行う場合が多いのではないかと思いますが、反映されるまでに数十秒かかることもあり、これを繰り返し行うことで開発スピードが低下してしまいます。
今回は Lambdaのデバッグ効率を上げるdocker-lambdaの設定手順を紹介します。
名前からイメージ出来る通り、Dockerで疑似的にLambdaを実行するという物になります。
なお、本記事は以下に該当する主にエンジニアの方が閲覧することを想定して記載しています。
Dockerを予めインストールし、以下の手順でサンプルの実行を行ってください。
- docker-lambdaのダウンロード
- サンプルスクリプトの作成
- サンプルデータの作成
- サンプルの実行
1. lambci/docker-lambdaのダウンロード
まずはDockerホストからGitHubに登録されているdocker-lambdaのリポジトリをクローンします。
$ pwd /home/docker $ git clone https://github.com/lambci/docker-lambda.git2. サンプルスクリプトの作成
次に、動作確認用のサンプルスクリプトをAWSコンソールから取得します。
「AWSコンソール」→「Lambda」→「Create a Lambda function」→「hello-world」
より適当な名前でLambdaを登録し、以下のようなテンプレートコードを取得します。例)Node.js 4.3バージョン上記のサンプルコードをコピーしてそのまま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バージョン最後に
このように、Lambdaに設置するコードをそのまま簡単に実行出来るため簡単な確認を行う際にはオススメです。