Help us understand the problem. What is going on with this article?

Cloud Functionsで環境変数を設定する方法

More than 1 year has passed since last update.

Google Cloud Functionsで環境変数を設定する方法です.
herokuでいうheroku config:setを実現したかったのでやってみました.

環境変数になるRuntime Configの設定

Cloud Functionsと同じくまだベータ版ですが,Runtime Configというものを使うことで実行時の変数をセットできます.

コンフィグ(config)と変数(variable)

Runtime Configでは,変数をまとめるコンフィグという概念があります(グループのようなもの.)
例えば,service-aservice-bというコンフィグにそれぞれTOKENHOSTいう変数を持たせる場合,次のように構成したりできます.

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レスポンスとして返しています.

index.js
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', {})としています.

ottijp
都内でアプリケーションエンジニアをしています
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away