AWS Lambda の node.js による API 開発のために SAM Local を使っていたのだけど、リクエストの度に docker コンテナを起動しなおすその仕組みは、FaaS のコンテナ実行を模している点はよいのですけど、レスポンスが遅くて、開発を加速させるには足かせになっていました。
そこで Serverless Framework の serverless-offline を使用して、 docker を使わずに Lambda を模することにしました。
Serverless Framework の導入
その導入方法は、
を参考にしました。
同じことを書けば、
テンプレで作成された serverless.yml
を下のように修正。
- plugins に serverless-offline を追加
- handler を、 tsc の出力先に変更 (tsconfig で sourcemap も有効にしておくとデバッグできる)
- 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
に以下のように記述。
- preLaunchTask: tsc で実行前にビルド
- node_modules の serverless を起動、引数は
offline start
で。 - 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 で中断されるはずです。