Apexで環境変数を切り替える話
Apexについて
あとclassmethodのblog記事とか読むといいと思います。
http://dev.classmethod.jp/cloud/aws/how-to-manage-aws-lambda-functions-with-apex/
やりたいこと1 devとかprodとかで環境変数を切り替えたい
このへん のやり方とかつらつら見てたんですが、最新(現在v0.13.0)だと公式でサポートされていました。
├── functions
│ └── function-name
│ ├── index.js
│ └── package.json
└── project.json
なところを、
├── README.md
├── functions
│ └── function-name
│ ├── index.js
│ └── package.json
├── project.development.json
├── project.json
├── project.production.json
└── project.staging.json
てな感じに分けて、
$ apex deploy -e development
とすればproject.development.jsonが読み込まれるし、
$ apex deploy -e staging
とすればproject.staging.jsonが読み込まれます。
VPCが違うとか、RDSの接続先が違うとかはこれで解消。
やりたいこと2 手元で実行する際もどうにかしたい
- Lambdaの環境変数はprocess.env.KEYに渡される
- poroject.jsonのenvironmentをprocess.envに突っ込めばいい
- 手元実行なのかLambdaで実行しているのかを判断したい
- Lambda上でしか使われない環境変数があるかどうかで判断すればいい
- https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/current-supported-versions.html#lambda-environment-variables
といったあたりを踏まえて、↓のような処理を追加。
※ 別途project.local.json作ってます。
if (!process.env.AWS_LAMBDA_FUNCTION_NAME) {
var path = '../../project.local.json';
if (process.env.NODE_ENV) {
path = '../../project.' + process.env.NODE_ENV + '.json';
}
var parsedObj = JSON.parse(fs.readFileSync(path, 'utf8'));
Object.keys(parsedObj.environment).forEach(function (key) {
process.env[key] = process.env[key] || parsedObj.environment[key];
});
}
これで手元でもLambdaでも同じノリで設定が書けるようになりました。
まとめ
PHP書くって当初聞いていたんですが、なぜかNode.jsを書いています。