AWS Lambda(node.js)をローカルでデバッグする方法あれこれ
Lambda(node.js)をローカルでデバッグしたいので探してみました。
- AWS Cloud9
- AWS SAM
- エントリポイント
- テストフレームワーク
詳しく調べていませんがCloud9でLambdaがデバッグできるようです。
Cloud9もAWSのサービスですからLambdaデバッグ開発には一番向いている開発環境だと思われます。
がCloud9はAWSサービスである以上、料金が発生しますしCloud9自体の学習コストもかかります。なによりローカルでデバッグしたいです。
次にAWS SAMですが、こちらもデバッグができます。AWS SAMを使うにはDockerが必要です。そういったマシン環境でないケースがあるのでこちらは除外します。
という事でまず簡単なエントリポイントを作ってデバッグしてみます。
エントリポイントを作れば簡単にデバッグすることができます。
デバッグ用のエントリポイントdebug.jsを作成します。テストしたいのはindex.jsのhandlerメソッドとします。エディタはVSCodeです。
debug.js
const handler = require('./index.js').handler; handler();
index.js
'use strict' exports.handler = function (event, context, callback) { console.log(JSON.stringify(`Event: event`)) }
launch.json
{ "version": "0.2.0", "configurations": [ { "type": "node", "request": "launch", "name": "Launch Program", "skipFiles": [ "<node_internals>/**" ], "program": "${workspaceFolder}\\debug.js" // debug.jsにしておく } ] }
これでF5を押せばデバッグができてブレークポイントにも止まるようになります。
contextがエミュレート出来ない
Lambdaのcontextオブジェクトをエミュレートすることができません。
このオブジェクトにはLambda名などいろいろな情報があり、このオブジェクトを完全にエミュレートするのは無理だと思います。
テストフレームワークMochaを使う
エントリポイントを作成するのもありですが、純粋にMochaを使いましょう。
npm i --save-dev mocha
Mochaでテストを実行します。Mochaのテストコードはtestフォルダ配下の*.test.jsというファイル群にします。
index.test.js
'use script' const handler = require('../index').handler const assert = require('assert'); describe('あんなテスト', ()=> { it('こんなテスト', ()=> { const event = {} handler(event, undefined, function(err, res) { assert.strictEqual(res, 'confrage') // 検証 }) }) })
index.js
'use strict' const AWS = require('aws-sdk') const s3 = new AWS.S3() exports.handler = function (event, context, callback) { s3.listBuckets().promise().then(e=>{ callback(null, e.Buckets[0].Name); }) }
VSCodeのlaunch.jsonを以下の通り変更します。
programをmochaにして、引数にワイルドカードのテストファイル名を渡します。これで複数ファイルのテストが実行可能となります。
launch.json
{ "version": "0.2.0", "configurations": [ { "type": "node", "request": "launch", "name": "Launch Program", "skipFiles": [ "<node_internals>/**" ], "program": "${workspaceFolder}\\node_modules\\mocha\\bin\\mocha", // mochaにする "args": [ "${workspaceFolder}\\test\\*.test.js" // mochaの引数としてワイルドカードの引数を渡す ] } ] }
F5を押して実行してみます。
こんな感じで実行ができ、この時にブレークポイントをはっておけばデバッグが可能です。
Mochaのデフォルトタイムアウトは2000msなので、デバッグする場合はデフォルトタイムアウトを長い時間に変更しておくべきです。デフォルトタイムアウトはlaunch.jsonで変更可能です。100000msにした例です。
launch.json
{ "version": "0.2.0", "configurations": [ { "type": "node", "request": "launch", "name": "Launch Program", "skipFiles": [ "<node_internals>/**" ], "program": "${workspaceFolder}\\node_modules\\mocha\\bin\\mocha", // mochaにする "args": [ "--timeout", "100000", // 単位はms "${workspaceFolder}\\test\\*.test.js" // mochaの引数としてワイルドカードの引数を渡す ] } ] }
ただMochaを使ってもcontextオブジェクトのエミュレートは不可能です。
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント