AWS Lambdaでnodeを動かす時にnode_modulesをどうするか
向かうべき道は色々考えられるが,実際に試してみたのは以下.
1. node_modulesをzipに含めてアップロードする
2. browserifyを使って1つのjsファイルにバンドルする
node_modulesをzipに含めてアップロードする
ローカルでnpm install
(or yarn install
) してこさえたnode_modulesディレクトリをzipにアーカイブしてそれをLambdaにアップロードするという方法.
zipファイルを作るのは地味に面倒に思えますが,Apexを使うとかなり楽にzipファイルの作成とアップロードができます.しかし得てしてzipファイルの容量が大きくなりがちなのでS3経由でデプロイするなどの方法を採る必要があるかもしれません.
また,ネイティブ拡張を利用しているライブラリが含まれている場合だとLambdaの実行環境 (アーキテクチャ) と同一の環境上で npm insall
してnode_modulesを作る必要があるでしょう.
可能な限りnode_modulesの容量を小さくするために npm/yarn install --production
でdevDependenciesを外すというのも良い考えです.
pros
- 手っ取り早い・わかりやすい
cons
- アーカイブの容量が大きくなりがち
browserifyを使って1つのjsファイルにバンドルする
ようこそ地獄へ.
node_modulesをアップロードする方法は容量が大きく,スマートではない……おれはもっと格好良い,小洒落た方法でやりたいんだ……ということでbrowserifyを使って1つのjsファイルに依存をバンドルし,それをアップロードするという方法が思いつくでしょう.
とりあえずLambdaで動くbundled jsを構築するには以下のようにコマンドを実行してやる必要があります.
$ browserify --node --standalone 'your-app-name' index.js -o bundle.js
--node
と --standalone 'your-app-name'
を指定して実行すると,運が良ければ動くjsが生成されます.運が悪いと動かない.動かない時はどうするか? おそらくおとなしく諦めたほうが良いでしょう……人生は短い…… (不毛すぎる)
もちろんネイティブ拡張を利用しているライブラリが含まれている場合だと動かないので,そういうときはnode_modulesをzipにバンドルする手法を採用する必要があります.
あるいはbrowserifyの代わりにwebpackを使うという方法も考えられる.僕はやっていません.
pros
- node_modulesをバンドルする方法と比較して容量が小さくなる
- おしゃれ
cons
- ハマりがち
- ネイティブ拡張を利用していると使えない