今月お仕事で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