🧊

AWSのLambdaで、zipにしたコードを動かす時にハマったこと

短いコードならインラインで書いてしまってもいいですが、npmのモジュール使ったりするとインラインではダメで、zipで固めてアップロードする必要があります。

簡単にできると思いきや、スッと動いてくれなかったので・・。
ハマったポイントのメモ。

Cannot find module ...

たいだいハマるのがこのエラーな気がして、これが出た時にどの部分をあわせればちゃんと動くのかのメモです。

ハンドラー設定とファイル名と関数名

ハンドラー設定は、初期設定で`index.handler`ってなってるとこ。
あれと、zipで固めたコードのファイル名とその中でエクスポートしてる関数名が一致してないとダメ。

- index.js
- node_modules

こういうzipなら、`index.handler`にしないとダメ。

そしてもちろんこう。

// index.js
exports.handler = fuction(ev, ctx) {
	// ...
};

"index".jsでエクスポートしてる"handler"関数だから、ハンドラーの設定は"index.handler"になる。

なので、

// hello.js
exports.world = fuction(ev, ctx) {
	// ...
};

なら、ハンドラー設定のところは、`hello.world`にすれば動く。

モジュールの依存関係

- myFunc.js
  - github
    - mime

myFunc.jsで `require('github')` したなら、githubモジュールが依存してる`mime`も一緒に固めないとダメ。

なので、`node_modules/github`で`npm i --production`とかする必要がある。

どうでもいいもの

  • Lambda Function側の関数名
  • zipのファイル名(アーカイブ.zipで良い)

まぎらわしいですね。

チェックリスト

  • Handler名とファイル名と関数名が一致している
  • node_modules内の全てのモジュールの依存関係が解消されてzipの中に入ってる

それでも "Cannot find module '/var/task/index'"

ある日突然これでエラーが出て、少しハマった。

最終的には、ハンドラーのファイルに対して、

chmod +x index.js

してから`.zip`にすると動きました。