Help us understand the problem. What is going on with this article?

Serverlessのお約束(1)

More than 3 years have 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で標準で利用できるモジュール一覧#インストールされているもの

fullkawa
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away