ottijp blog

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

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
都内でアプリケーションエンジニアをしています
© 2026, ottijp