見出し画像

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 を他の plugin と一緒に利用する場合、Usage with other plugins に書かれている通り、 "sls offline" コマンドよりも "sls offline start" が推奨される(以下、公式からの引用)。

上記のような設定を行い、デバッグ実行してみると以下の動画のように意図通りデバッグが実行できる事が確認できる(動画のように、デバッガの 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}"
}

《この公式ブロガーの記事一覧》


執筆者プロフィール:Katayama Yuta
認証認可(SHIFTアカウント)や課金決済のプラットフォーム開発に従事。リードエンジニア。
経歴としては、SaaS ERPパッケージベンダーにて開発を2年経験。 SHIFTでは、GUIテストの自動化やUnitテストの実装などテスト関係の案件に従事したり、DevOpsの一環でCICD導入支援をする案件にも従事。その後現在のプラットフォーム開発に参画。

お問合せはお気軽に
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/