Node.js
lambda
serverless

Serverlessのお約束(1)

More than 1 year has passed since last update.

公式ドキュメントにきちんと書かれていない or 扱いが小さいが、よく使われそうなケースやハマリどころ等について書いてみたいと思います。
まずはパッケージ(外部ライブラリ)について。※(2)を書くとは言っていない

前提

この記事は以下の環境について記述しています。

  • Serverless Framework 0.5.x
  • Node.js 4.x

package.json

Node.jsにおけるパッケージ管理ツールと言えばnpm。Serverlessで作成したプロジェクトにはルートディレクトリ直下にpackage.jsonがあります。
しかし、だからといってルートディレクトリでnpm installしてはいけません。その状態からsls function deployをするとnode_modulesを含まない状態でパッケージング、デプロイされます。

sls function deployでデプロイしたファンクションに含まれるファイル
※ package.jsonもnode_modulesも含まれていないことに注目

  • _serverless_handler.js
  • event.json
  • handler.js
  • s-function.json

よって、パッケージを利用するファンクション内にnode_modulesが出来るよう、そこにpackage.jsonファイルを用意する必要があります。

project-name you$ cd function_name
function_name you$ npm init
function_name you$ npm install (パッケージ名) --save

発生するエラー

aws-sdkのようにLambdaがデフォルトで用意しているモジュールであれば問題ありませんが、それ以外のパッケージをrequireしている場合(かつnode_modulesをデプロイに含めていない場合)、下記のエラーがCloudWatchのログに出力されます。

Unable to import module '_serverless_handler': Error at Function.Module._resolveFilename (module.js:325:15) at Function.Module._load (module.js:276:25) at Module.require (module.js:353:17) at require (internal/module.js:12:17) at Object.<anonymous> (/var/task/handler.js:4:12) at Module._compile (module.js:409:26) at Object.Module._extensions..js (module.js:416:10) at Module.load (module.js:343:32) at Function.Module._load (module.js:300:12) at Module.require (module.js:353:17)

一見'_serverless_handler'がないと怒られているように見えるので、あるはずだけどな?と戸惑います。
しかし、Lambdaの管理画面から「Test」をすると本当の原因(足りないモジュールの名前等)を確認することができます。

"errorMessage": "Cannot find module 'node-uuid'",

Lambdaにデフォルトで用意されているモジュールは以下のドキュメントでご確認ください。
Lambda 実行環境と利用できるライブラリ

公式の情報ではありませんが、他にもいくつか使えるモジュールがあるようです。
AWS Lambdaで標準で利用できるモジュール一覧#インストールされているもの