Posted at

AWS Lambda のローカル開発環境を serverless-offline で構築して VSCode でデバッグできるようにする

AWS Lambda の node.js による API 開発のために SAM Local を使っていたのだけど、リクエストの度に docker コンテナを起動しなおすその仕組みは、FaaS のコンテナ実行を模している点はよいのですけど、レスポンスが遅くて、開発を加速させるには足かせになっていました。

そこで Serverless Framework の serverless-offline を使用して、 docker を使わずに Lambda を模することにしました。


Serverless Framework の導入

その導入方法は、

を参考にしました。

同じことを書けば、

テンプレで作成された serverless.yml を下のように修正。


  1. plugins に serverless-offline を追加

  2. handler を、 tsc の出力先に変更 (tsconfig で sourcemap も有効にしておくとデバッグできる)

  3. path にワイルドカードを指定できるよ(この場合 http://localhost:3000/api/hogehoge に反応する)

service: myservice

provider:
name: aws
runtime: nodejs10.x

plugins:
- serverless-offline

functions:
my-api:
handler: build/my-api/src/app.handler
events:
- http:
method: ANY
path: 'api/{proxy+}'
cors: true


VSCode でデバッグできるようにする

.vscode/launch.json に以下のように記述。


  1. preLaunchTask: tsc で実行前にビルド

  2. node_modules の serverless を起動、引数は offline start で。

  3. protocol: inspector でデバッグ監視しまーす

{

"version": "0.2.0",
"configurations": [
{
"name": "Debug",
"type": "node",
"request": "launch",
"preLaunchTask": "tsc",
"protocol": "inspector",
"cwd": "${workspaceRoot}",
"program": "${workspaceRoot}/node_modules/.bin/serverless",
"args": [
"offline",
"start"
]
}
]
}

これで F5 でデバッグ実行。ハンドラーにブレークポイントを仕掛けて、 curl http://localhost:3000/api/hello でも呼び出せば、VSCode で中断されるはずです。