Google Cloud Functionsで環境変数を設定する方法です.
herokuでいうheroku config:set
を実現したかったのでやってみました.
環境変数になるRuntime Configの設定
Cloud Functionsと同じくまだベータ版ですが,Runtime Configというものを使うことで実行時の変数をセットできます.
コンフィグ(config)と変数(variable)
Runtime Configでは,変数をまとめるコンフィグという概念があります(グループのようなもの.)
例えば,service-a
とservice-b
というコンフィグにそれぞれTOKEN
とHOST
いう変数を持たせる場合,次のように構成したりできます.
service-a (config)
|- TOKEN=abc123 (variable)
`- HOST=host-a (variable)
service-b (config)
|- TOKEN=xyz987 (variable)
`- HOST=host-b (variable)
とりあえず今回はコンフィグも変数も1つでやってみます.
値の設定
heroku
という名前のコンフィグを新しく作るには次のようなコマンドを使います.
$ gcloud beta runtime-config configs create heroku
heroku
コンフィグにTOKEN
という名前の変数をabc123
という値で作るには次のようなコマンドを使います.
$ gcloud beta runtime-config configs variables set TOKEN abc123 --config-name heroku --is-text
Cloud Functionsから環境変数として読み出す
Node.jsで作ったファンクションからこの値を読み出すには次のようにします.
ライブラリ
@google-cloud/rcloadenvを使います.
次のようにインストールしておきます.
$ npm i --save @google-cloud/rcloadenv
環境変数の読み出し
試しに次のようなhttpトリガーのCloud Functionsを作りました.
Runtime Configから先程設定した変数を取得し,httpレスポンスとして返しています.
const rcloadenv = require('@google-cloud/rcloadenv');
exports.getToken = (req, res) => {
rcloadenv.getAndApply('heroku', {})
.then((env) => {
console.log('TOKEN', env.TOKEN);
res.send(`TOKEN=${env.TOKEN}`);
})
.catch((err) => {
console.error('ERROR:', err);
});
};
これをデプロイし,httpアクセスしてみます.
$ gcloud beta functions deploy getToken --trigger-http
$ curl https://[YOUR_REGION_AND_PROJECT].cloudfunctions.net/getToken
TOKEN=abc123
変数値を変更してアクセスすると値が変わっていることが確認できます.
$ gcloud beta runtime-config configs variables set TOKEN xyz987 --config-name heroku --is-text
$ curl https://[YOUR_REGION_AND_PROJECT].cloudfunctions.net/getToken
TOKEN=xyz987
注意
npmのページのサンプルのようにrcloadenv.getAndApply('heroku')
としてしまうと,(ソースを見たところgetAndApply
の第2引数はデフォルトでprocess.env
で,それがRemote Configより優先されてしまうので)gcloud
コマンドによる変数値の変更がファンクションに適用されませんでした.
そこで,元々の環境変数の値は無視してrcloadenv.getAndApply('heroku', {})
としています.