serverless-offlineを導入してVS CodeでデバッグするLambda開発環境を整えてみた
はじめに
こんにちは、SHIFTの開発部門に所属している Katayama です。
前回の記事「 serverlessのLambda開発環境としてserverless-webpackでトランスパイル、ESLint、エイリアス利用を設定してみた」ではサーバレスで開発するための開発環境の初期設定を行ってみた。
今回は、開発する上で必須になるであろう debug(デバッグ)を利用できるようにするための、サーバレスの設定を行ってみたいと思う。
※なお本記事の内容は、サーバレスの基本的な設定(serverlessのLambda開発環境としてserverless-webpackでトランスパイル、ESLint、エイリアス利用を設定してみたに書かれているような設定)は完了済みである事を前提にしている。
VS Code 上でサーバレスでデバッグを利用できるようにする
サーバレスでデバッグを行うには、serverless-offlineというライブラリを利用する。この serverless-offline は AWS Lambda と API Gateway をエミュレートしてローカル開発をしやすくするようなライブラリだが、Debug processに書かれている通り、このライブラリを利用する事で簡単にデバッグを可能にできる。
まず、serverless-offline をインストールし、serverless.yaml の plugins に以下のように追記する。
plugins:
# 他のプラグイン
- serverless-offline
続いて、上記で導入した serverless-offline を利用して Lambda 関数をローカルでエミュレーションして起動するために、launch.json の設定と、npm scripts の設定を行う。設定としては以下のようになる。
// launch.json
{
"configurations": [
{
"cwd": "${workspaceFolder}",
"name": "Debug Serverless Offline",
"request": "launch",
"runtimeArgs": ["debug"],
"runtimeExecutable": "yarn",
"sourceMaps": true,
"type": "node"
}
]
}
// package.json
"scripts": {
...
"debug": "SLS_DEBUG=* && node --inspect node_modules/serverless/bin/serverless offline start",
...
},
少し launch.json の設定と package.json について補足する(基本的に launch.json についてはLaunch configuration attributesに書かれている通り)。
runtimeExecutable
Node.js のプログラムを node で直接起動するのではなく、直接 npm scripts や他のタスクランナーツールを使用する事ができるが、どのプログラムを使用するのか?を設定する項目。
PATH 上で利用可能な任意のプログラム(例えば'npm', 'mocha', 'gulp'など)が使用でき、今回は yarn を指定している。
runtimeArgs
runtimeExecutable のプログラムに渡す引数を設定するための項目。
今回は npm scripts の debug というスクリプトを実行したいので、debug になっている。
実際にデバッグが起動すると、以下のように yarn debug を実行するのと同じ事になる。
serverless offline start
これはserverlessのLambda開発環境としてserverless-webpackでトランスパイル、ESLint、エイリアス利用を設定してみたに以下のように書いていた通り、serverless-webpack の設定がある場合には offline start が推奨なため offline start になっている(今回は前回の記事の続きであり、serverless-webpack の設定がなさせている前提)
上記のような設定を行い、デバッグ実行してみると以下の動画のように意図通りデバッグが実行できる事が確認できる(動画のように、デバッガの worker の作成が失敗する事があるが、リトライすれば問題ない)。
まとめとして
今回は VS Code 上でサーバレスアプリケーションの開発を行う際に、デバッグを行うための設定についてみてきた。サーバレスの開発においてもデバッグを行いたい場面は出てくると思うので、デバッグが必要になった際には今回設定したような方法で快適に開発をしていきたいと思った。
おまけ
serverless-offline を使った場合のローカル開発環境での Lambda の呼び出し
AWS - Invoke Localに書かれている通り、以下のようにローカル開発環境でも Lambda を実行する事ができる。
study@localhost:~/workspace/serverless (main *)
$ yarn invoke:local
yarn run v1.22.19
$ sls invoke local --function hello
{
"statusCode": 200,
"body": "{\n \"message\": \"Go Serverless v3.0! Your function executed successfully!\",\n \"input\": \"\"\n}"
}
Done in 3.00s.
開発上、上記のように Lambda をローカルの開発環境上で実行するのは必須になるが、serverless-offline を導入すると、少し上記とは違った形で、ローカルの開発環境で Lambda 関数の実行ができる。
具体的には、以下のように localhost のエンドポイントで Lambda 関数がエミュレーションされて立ち上がる。
そのため、AWS CLI の--endpoint-urlを指定して、Lambda 関数を呼び出す事ができるようになる。
[root@localhost serverless]# npx sls offline start
Starting Offline at stage dev (ap-northeast-1)
Offline [http for lambda] listening on http://localhost:3002
Function names exposed for local invocation by aws-sdk:
* hello: aws-node-project-dev-hello
[root@localhost serverless]# aws lambda invoke --payload '{ "name": "Bob" }' --endpoint-url http://localhost:3002 --function-name aws-node-project-dev-hello --cli-binary-format raw-in-base64-out response.json
{
"StatusCode": 200
}
// response.json
{
"statusCode": 200,
"body": "{\n \"message\": \"Go Serverless v3.0! Your function executed successfully!\",\n \"input\": {\n \"name\": \"Bob\"\n }\n}"
}
《この公式ブロガーの記事一覧》
お問合せはお気軽に
https://service.shiftinc.jp/contact/
SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/
SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/
SHIFTの導入事例
https://service.shiftinc.jp/case/
お役立ち資料はこちら
https://service.shiftinc.jp/resources/
SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/