LoginSignup
14
13

More than 5 years have passed since last update.

Serverlessのお約束(1)

Posted at

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

14
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
13