FirebaseベースのFunctionsを利用した場合の環境変数の設定方法は?

FirebaseベースのFunctionsを利用した場合の環境変数の設定方法は?

2020年11月6日


FirebaseベースのFunctionsを利用した場合の環境変数の設定方法は?

Firebaseベースのファンクションを利用して、バックエンドの処理を実装する場合に環境依存の変数の値をどのように設定するかを解説しています。

環境変数を利用する理由はいくつかあります。実際のコードを特定の環境依存にしないための工夫というのが一番大きな理由です。

環境変数を利用してプログラムを管理しやすくする

環境変数を利用するとプログラムの管理がやりやすくなるという利点があります。

例えば、Webサイトを作る場合サイトのタイトルをプログラム中に直接書いてしまう方法をハードコーディングといいます。

export function Sample() {
    return (
        <h1>Silicon Valley Super WareValley Super Ware</h1>
        <h3>XXX-XXX-XXXX</h3>
    )
}

のような例です。この例ではこのようにハードコーディングしている場所が二箇所なので余り大きな問題にはなりません。しかし、他にも、住所などいろいろな情報をプログラム中にハードコーディングしている場合、別の組織のWebサイトとして転用する場合に修正が面倒になります。

少し管理しやすいように、サイトによって変わる情報の部分をまとめることができます。

const TITLE = "Silicon Valley Super Ware";
const PHONE = "xxx-xxx-xxxx";
export function Sample() {
    return (
        <h1>{TITLE}</h1>
        <h3>{PHONE}</h3>
    )
}

のようにすると、定数を宣言してる部分にサイトによって変わる情報がまとまっているので少し管理しやすくなります。しかし、実際はプログラムの一部である点は変わりないので、プログラムのソースコードの修正が必要になります。

そこで、こうしたサイトによって変えなければいけない部分をまとめてしまって、その部分だけを変更すればプログラムを修正しなくても、別のサイトに転用ができるようにしたのが環境変数という概念です。

「dotenv」を使う

npmのモジュールで「dotenv」というモジュールがあります。これを利用するとプログラムとは別にこうした、サイトによって変わる情報を設定する事ができます。 インストールは他のnpmのモジュールと同様に、以下のコマンドを実行するだけです。

$ npm install dotenve

利用する際は、プログラムのソースコードで

require('dotenve').config();

の一行を追加するだけです。

あとは、Firebaseのプロジェクトフォルダの下にあるfunctionsの下に「.env」というファイルを作成して必要な情報を設定するだけです。

「.env」ファイルの例です

DB_DEBUG=true
DB_TITLE=Silicon Valley Super Ware
DB_PHONE = xxx-xxx-xxxx

これを先ほどのコードに適用すると

const DEBUG = process.env.DB_DEBUG === "true"? true : false;
const TITLE = process.env.DB_TITLE? process.env.DB_TITLE : "";
const PHONE = process.env.DB_PHONE? process.env.DB_PHONE : "";
export function Sample() {
    return (
        <h1>{TITLE}</h1>
        <h3>{PHONE}</h3>
    )
}

のように書き直すことができます。こうすると、プログラムのソースコードに触れることなく必要な設定を簡単に変えられることになります。「.env」の中身だけ変えればよいので管理が楽になります。

ReactやVueはCLIを使うとあらかじめ組み込まれている

ReactやVueの場合は、CLIを利用してプロジェクトを作成すると、この「dotenve」の機能が予め組み込まれています。プロジェクトフォルダに「.env」というファイルを作って、同じような要領で設定して変数の値をプログラムから呼び出すことができるようになっています。

「.env」の例

Reactの場合は、「REACTAPP」を最初につけて記述します。

REACT_APP_DEBUG=true
REACT_APP_TITLE=Silicon Valley Super Ware"
REACT_APP_PHONE=Silicon Valley Super Ware"

Vueの場合は、「VUEAPP」を最初につけて記述します。

VUE_APP_DEBUG=true
VUE_APP_TITLE=Silicon Valley Super Ware"
VUE_APP_PHONE=Silicon Valley Super Ware"

読み出し方は同じで、「.env」で宣言した変数名に「process.env.」をつけて呼び出します。

Functionsの場合はあらかじめ組み込まれていない!

Firebaseのファンクション(functions)の場合は、あらかじめ設定されていないため、「dotenv」をインストールして呼び出すようにします。

バックエンドで利用する場合に有効なのが、利用するサービスの秘密鍵(API key / Secrete key)などの情報です。これらの情報は利用者ごとに違うのでそのたびに設定を変更する必要があります。これを、環境変数で定義しておけば、プログラム自体は変更しないで多くの利用者に対応することができます。

このように、「ハードコーディング」を避けるとプログラムの管理が非常に効率的にできるようになります。

Firebaseには独自の環境変数を設定する機能がある!

この「dotenv」を利用した環境変数の設定はとても便利です。実はFirebaseは独自に別の方法で環境変数を設定する方補法を提供してます!この機能は、テスト環境と実際に利用する環境を簡単に切り替えることができるので、「dotenv」の設定と合わせて利用すると便利です。

設定はコマンドラインから行います。

$ firebase functions:config:set [Name].[Subname]="value"

のように設定します。 例えば、以下のように利用します。

$ firebase functions:confg:set Stripe.key="0123456789"

のように設定すると、

$ firebase function:config:get
{
    "Stripe": {
        "key": : "0123456789"
    }
}

のように設定されます。上の例は「get」コマンドで設定を読み取っています。

この情報にプログラムからアクセスする場合は以下のように記述します。

return request({
    headers: {
      'Authorization': `Bearer ${functions.config().Stripe.key}`
    },
  });

また設定を解除したい場合は、

$ firebase functions:config:unset Stripe.key

で設定を削除できます。

この機能の便利なところは、コマンドラインから設定を変更できる点にあります。

例えば、Stripeのオンライン決済サービスの場合、開発用に実際に決済を行わないテスト用の秘密鍵(Secret key)の利用が可能です。この機能を使うと、最初にまずデプロイしてテストモードで機能を確認後に、実際の秘密鍵に置き換えることが可能になります。再度、公開用のイメージを作成しなおして、再度デプロイする必要はありません。

このように上手く利用するととても便利な機能です。

開発用のPCでローカルのサーバーでテストする場合は別途設定が必要です!

この機能便利ですが、コマンドラインで設定した内容は実際のインターネットで稼働しているFirebaseのサーバーに適用されています。これを、テスト用のローカルサーバーで利用するにはFirebaseのプロジェクトフォルダに設定情報が入ったファイル(.runtimeconfig.json)が必要になります。 これは、Firebaseのサーバーに設定されている情報をリダイレクトで取り込んで作成するのが簡単です。

$ firebase functions:config:get > .runtimeconfig.json

Windows Power Shellで実行する場合はリダイレクトの設定が少し違いますので注意してください。 Windows Power Shellで実行する場合は以下のコマンドを実行します。

$ firebase functions:config:get | ac .runtimeconfig.json

また、実際の稼働中の環境とは別に、開発・テスト目的で同じようなプロジェクトを作成した場合は、別のプロジェクトに設定をコピーすることもできます。

$ firebase functions:config:clone --from <fromProject>

コピー先のプロジェクトフォルダで実行します。

まとめ

環境変数を活用するとプログラムの保守性が大きく向上します。 プログラム自体に変更を加えなくても、別の設定での再利用が簡単にできるのが大きな理由です。 Firebaseのバックエンドで環境変数を利用する場合、Firebaseも独自の環境変数の設定機能を提供しています。 これは、稼働中のシステムでも設定の変更が可能なので、うまく活用すると非常に強力な機能です。

テスト用と本番用の機能の切り替えのほかに、デバッグ用のメッセージの表示、非表示の切り替えなどにも利用可能です。実際に稼働中のシステムで問題が起きた場合など、デバッグ用のメッセージを表示できるように切り替えることができると、デバッグにも利用できます。

Firebaseは、実際に活用する本質的な機能の他にも、こうした開発者や運営者を支援するような機能も実装しています。こうした部分もFirebaseを活用する大きなメリットです。

Copyright(c) 2017-2020 by Silicon Valley Super Ware, all rights reserved.

コメント

このブログの人気の投稿

ユーザーインターフェースの設計

足し算以外もできるようにする

改良版足し算プログラム