今月お仕事でAWSのLambdaでバッチ処理を書きました。
今回は node.js(v8.10) でローカル開発する際の備忘録として書き残します。
ローカル環境はMacです。
ローカル用の踏み台ファイル(proxy.js)の用意
上のURLを参考にして、作業ディレクトリ内にproxy.js
を用意します。
なぜ踏み台が必要かも説明されています。
今後はこのファイルを通して
$ node proxy.js
と実行すれば、ローカルでindex.js
の処理を実行する事ができるようになります。
dotenvで環境変数を管理できるようにする
バッチ処理中にAPIを使用する事も多いです。
その際ファイル内にパスワード等を直書きするのはよろしくありません。
Lambdaは環境変数を専用の場所から設定できますのでそこで管理しましょう。
ローカルではdotenv
を使用して管理すると良いでしょう。
作業ディレクトリで以下を実行してdotenv
を導入します。
$ npm install dotenv
先ほど用意した proxy.js
に下の行を追加します。
'use strict'
require('dotenv').config() //<- これを追加。.envから環境変数を取得
// ...
作業ディレクトリ内に.env
を作成し、次のように記述すると環境変数を設定できます。
REDSHIFT_USER="user"
REDSHIFT_PASS="password"
index.js
で次のように指定すれば.env
の変数を使用できます。
//...
const REDSHIFT_USER = process.env.REDSHIFT_USER
const REDSHIFT_PASS = process.env.REDSHIFT_PASS
//...
git管理をしているなら.gitignore
に.env
を含めないようにするとベターです。
上でも書いたようにLambdaの環境変数は専用の場所から設定するので
.env
はLambda環境までアップロードしません。
故にdotenv
のようなローカルでのみ使うようなライブラリは
proxy.js
で読み込めばindex.js
を汚さずに済むようになります。
zip化の処理を書く
処理が完成したらLambdaにアップロードする為のzipファイルを作成しないといけません。
zipファイルは10MBを越えるとS3
経由からアップロードしなくてはいけなくなります。
zip化する際に軽くする為に不要なファイルやnode_module
の中のライブラリを除かないといけません。
特に気をつけなくてはいけないのはaws-sdk
という
AWSのツールを簡単に操作する為のライブラリです。これが38MB近くあります。
これをzipに含めると圧縮しても10MB以下に抑えるのが難しくなります。
幸いな事に、Lambdaではaws-sdk
が最初からインストールされている為、
このライブラリを使う為にnode_modules
に含めておく必要はありません。
ですので、zipForLambda.sh
を作業ディレクトリ内に作成し次のように記します。
cd `dirname ${BASH_SOURCE:-$0}`
zip -r lambda index.js node_modules/ -x "node_modules/aws-sdk/*" "node_modules/dotenv/*"
# 他にも含めたいファイルがあるなら追加していく↑ 他に除きたいファイルがあるならここから追加していく↑
そして、次を実行すれば
$ bash zipForLambda.sh
Lambdaにアップロードする為のファイルlambda.zip
が書き出されます。
入っているのはindex.js
と必要なnode_modules
だけです。
dotenv
もLambdaで不要なのでzipに含めませんでした。
また、proxy.js
.git
.gitignore
等も不要なので含めていません。
lambdaでは処理の実行前にnpm install
をしてくれません。
ですのでpackage.json
等も不要です。
まとめ
これでローカルで開発する為の環境が整いました。
開発フローは次のようになります。
-
index.js
に処理を書く。 - 必要な環境変数が出てきたら
.env
に記述。index.js
で受け取る。 -
$ node proxy.js
を実行して動作確認。 - 完成したら
$ bash zipForLambda.sh
を実行してzip化。 -
lambda.zip
をAWS Lambdaにアップロードしてテスト。
となります。
必要なファイルが増えた際zipForLambda.sh
を更新するのを忘れないようにしてください。
zipForLambda.sh
内にaws-cli
を使用したlambdaへのアップロードコマンドも含めるのもいいと思います。
参考
proxy.js
https://symfoware.blog.fc2.com/blog-entry-2218.html
bash zipコマンドの書き方の参考
https://qiita.com/yudoufu/items/48cb6fb71e5b498b2532
https://superuser.com/questions/312301/unix-zip-directory-but-excluded-specific-subdirectories-and-everything-within-t
AWS Lambdaへの環境変数の設定方法
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/env_variables.html