はじめに
AWS Lambdaのfunctionを更新するたびにコンソールやS3からアップロードするのが面倒だったので、nodejsのパッケージをビルドしてLambdaへアップロードするシェルスクリプトを書いてみました。
リポジトリはこちら:
https://github.com/suhirotaka/utility/blob/master/shell/upload_node_lambda_function.sh
使い方
upload_node_lambda_function.sh <SOURCE_DIRECTORY> <FUNCTION_NAME>
SOURCE_DIRECTORYにソースが入っているディレクトリ、FUNCTION_NAMEにLambdaのfunction名を指定します。Lambdaのハンドラを指定しているファイルはsource_directoryの直下へ置いてください。
SOURCE_DIRECTORYのディレクトリ構成は以下のように、nodeのスクリプトとpackage.jsonを含めます。package.jsonに書かれた依存パッケージをnpm install
してから、jsファイルをzipで固めてLambdaへアップロードします。
source_directory - myFunction1.js
myFunction2.js
...
package.json
ちょっとハマったこと
- Lambdaへのアップロードでは、fileb://プロトコルを使用する必要があります。ずっとfile://を使ってアップロードできないなーと悩んでいたら、ちゃんとドキュメントに載っていました。binaryの"b"なんでしょうが、初めて見るプロトコルでした。。
- zipで固めるとき、
zip -r out.zip source_directory
のようにディレクトリごと固めてしまうと、Lambdaで"Module not found"のエラーになります。これも悩んだのですが、ハンドラをexportsしているファイルがパッケージのルートにないのが原因でした。zip -r out.zip *.js node_modules
のように書かないといけません。