AWS Lambda(node.js)をローカルでデバッグする方法あれこれ

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();

view raw
gistfile1.txt
hosted with ❤ by GitHub

index.js

'use strict'
exports.handler = function (event, context, callback) {
console.log(JSON.stringify(`Event: event`))
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

launch.json

{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch Program",
"skipFiles": [
"<node_internals>/**"
],
"program": "${workspaceFolder}\\debug.js" // debug.jsにしておく
}
]
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

これでF5を押せばデバッグができてブレークポイントにも止まるようになります。

contextがエミュレート出来ない

Lambdaのcontextオブジェクトをエミュレートすることができません。

このオブジェクトにはLambda名などいろいろな情報があり、このオブジェクトを完全にエミュレートするのは無理だと思います。

テストフレームワークMochaを使う

エントリポイントを作成するのもありですが、純粋に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') // 検証
})
})
})

view raw
gistfile1.txt
hosted with ❤ by GitHub

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);
})
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

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の引数としてワイルドカードの引数を渡す
]
}
]
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

F5を押して実行してみます。

AWS Lambda(node.js)をローカルでデバッグする方法あれこれ

こんな感じで実行ができ、この時にブレークポイントをはっておけばデバッグが可能です。

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の引数としてワイルドカードの引数を渡す
]
}
]
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

ただMochaを使ってもcontextオブジェクトのエミュレートは不可能です。

  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA