公式ドキュメントにきちんと書かれていない 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で標準で利用できるモジュール一覧#インストールされているもの