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

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を押して実行してみます。

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

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

コメント

株式会社CONFRAGE ITソリューション事業部をもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む

タイトルとURLをコピーしました