その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

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
  • ハマりがち
  • ネイティブ拡張を利用していると使えない

結論

おとなしくnode_modulesをバンドルする方法のほうが楽なのではないか.
あるいは外部モジュールに依存せずにLambda Functionを書くという強い気持ちを持つ (つらい).