shou.com
JP / EN

serverless framework、lambdaをローカルで実行する(node.js)

Wed Aug 19, 2020
Wed Aug 19, 2020

環境

  • macOS Catalina
    • 10.15.4
  • serverless framework
    • Framework Core: 1.67.3 (standalone)
    • Plugin: 3.6.6
    • SDK: 2.3.0
  • node.js
    • v12.18.3
  • aws
    • aws-cli/1.18.0 Python/3.7.3 Darwin/19.4.0 botocore/1.15.0

lambdaをローカルで実行する

serverless frameworkを使ってlambdaの開発をしているときよく使う便利機能が、AWS - Invoke Localです。

これを使えばローカルでlambdaのコードを実行できます。

公式サイトにもある通り、以下のコマンド実行できるわけですが、

1
serverless invoke local --function functionName

最初はこれでこと足りるわけですが、実際の開発ではAWS Lambda レイヤーを使うことが多いので、フォルダ構造が以下のようになると思います。

-layer/nodejs/node_modules

-serverless.yml

このようなフォルダ構造だと単純にserverless invoke local --function functionNameを実行するとレイヤーにあるnpmが参照できずにエラーになるので、invoke local実行時にレイヤーを参照するようにパスを作ってやる必要があります。

ググってみるとシンボリックを使って実装している人もいたのですが、僕の場合はpackage.jsonにスクリプトを書いて実行するようにしました。

1
2
3
4
5
6
7
{
  "name": "serverless-framework-cli",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
		"local": "export NODE_PATH=\"layer/nodejs/node_modules\" && npx serverless invoke local --function changePassword"
  }
}

こうしとけばあとはnpm run localを実行するだけでローカルでlambdaを実行することができます。

まぁ、僕の場合はレイヤーに置く必要ないServer FrameworESLintをrootディレクトリで管理してるからできるわけですけど、全てレイヤーにまとめている場合はシンボリックを使った方がいいでしょうかね?

See Also