APIの環境別変数の設定方法

開発環境、テスト環境、本番環境などで設定を変更したいことがあると思います。外部システムのURLなどを開発用と本番用で変えるなどがあると思います。

その為に、TemPlat Consoleでは環境別に変数の切り替えれるように準備されています。ここではその環境別変数に関して説明します。

想定する環境に関して

まず最初にTemPlatで想定している環境とその名前の定義を整理しておきます。

環境名環境日本語名環境の説明
dev開発環境開発をしている開発PC上の環境を指します。
stgステージング環境
(テスト環境)
通常はTemPlat ConsoleがデプロイするGCP環境がステージング環境兼、本番環境となります。ただ、本番運用開始後、TemPlat Consoleのデプロイ先をステージング環境として、本番環境を分けることもできます。
prd本番環境ステージング環境と本番環境をわける場合に使用する環境の想定です。TemPlat ConsoleがビルドしたAPIモジュールはDockerコンテナとして作成されますので、そのコンテナを別途CloudRun環境を手動で作成してデプロイすることで、本番環境を分けて作ることができます。

環境の概念図を書いてみると以下のようになります。

環境の概念図

環境の切り替え方法

環境を切り替える方法を説明します。今実行している環境が何環境かを判断するのには、ENVという名前の環境変数を使用しています。環境変数が何も設定されていなければ、初期値として定義されている環境変数が利用されます。

開発環境では基本初期値を使っておき、ステージング環境や本番環境ではENV環境変数で初期値を上書きするのがよいと思います。CloudRun環境でENV環境変数を設定する方法をここでは説明します。

GCPコンソールへアクセスして「Cloud Run」の管理画面を開きます。そこにTemPlat ConsoleからデプロイされるCloud Runサービスがあると思います。ここにENV変数として「stg(ステージング環境)」と設定したいと思います。

サービス一覧が表示されたらサービス名をクリックして詳細画面を開きます。

詳細ページを開いたら、「新しいリビジョンの編集とデプロイ」を選択します。

ここで、変数が定義できますので、ENVという名前で「stg(ステージング環境)」や「prd(本番環境)」という値を設定してください。

TemPlat組込みの環境変数と変更方法

TemPlat Consoleにも予め以下の環境変数が組み込まれています。まずはこれらの環境変数の説明と変更方法を説明します。この組み込み環境変数の初期値は
/src/app/.env
に設定されています。

# GCP Project Config
PROJECT_ID=yoyaku-get
CREDENTIAL_FILE_PATH=/app/secret.json
IMAGE_BUCKET_NAME=yoyaku-get-images
LOG_LEVEL=DEBUG #DEBUG,INFO,WARN,ERROR,OFF

# SendGrid Config
SEND_GRID_API_KEY=xxxxxxxxxxxxxxx

# Stripe Config
STRIPE_SECRET_API_KEY=xxxxxxxxxxxxxxx
PROJECT_IDGCPのプロジェクトID
CREDENTIAL_FILE_PATHGCPのクレデンシャルファイルのパス
IMAGE_BUCKET_NAMEGCPの画像を置くStorageバケット名
LOG_LEVELログレベル、指定できるのは以下DEBUG,INFO,WARN,ERROR,OFF
SEND_GRID_API_KEYSendGridのAPIキー
STRIPE_SECRET_API_KEYStripeのAPIキー

環境に応じてこれらの変数を変えたいことがあると思います。例えば、カード決済サービスであるStripeでは、本番環境とは別に開発環境がセットで用意されていますので、こちらも開発やテスト時にはStripeの開発環境に接続して、本番環境のみStripeも本番環境へ接続するように設定したいところです。

そのための環境別の定義ができるファイルが用意されています。ファイルの場所は以下のツリーを確認ください。

上記ファイルに環境別に変更したい変数を記載すると、その環境では初期定義が上書きされて、変更した変数の値が利用できるようになります。StripeのAPIキーを例に説明します。開発環境とステージング環境は、Stripeの開発環境へ。本番環境だけStripeの本番環境へ接続する場合の各ファイルの設定は以下となります。

.env

初期値としては、Stripeの開発環境のAPIキーを設定します。

STRIPE_SECRET_API_KEY=(Stripeの開発環境のAPIキー)

.dev.envおよび.stg.env

この2ファイルには「STRIPE_SECRET_API_KEY」は指定しません。指定しないと「.evn」に設定している値が使われます。

.prd.env

本番環境用の環境定義ファイルにのみStripeの本番環境のAPIキーを設定します。本番環境ではここで設定した値が利用されます。

STRIPE_SECRET_API_KEY=(Stripeの本番環境のAPIキー)

ユーザ固有の環境変数の定義方法

ここまではTemPlat Consoleが事前に用意していた環境変数の変更方法でしたが、アプリケーションで他にも環境別に変更したい値があれば環境変数を追加することができます。

設定方法はTemPlat Consoleの環境変数と基本同じです。
初期値を.envファイルに追加で定義をして環境別に変更したいものを、.dev.env、.stg.env、.prd.envに定義すれば追加ができます。

ユーザ固有環境変数の定義例

.env

# GCP Project Config
PROJECT_ID=yoyaku-get
CREDENTIAL_FILE_PATH=/app/secret.json
IMAGE_BUCKET_NAME=yoyaku-get-images
LOG_LEVEL=DEBUG #DEBUG,INFO,WARN,ERROR,OFF

# SendGrid Config
SEND_GRID_API_KEY=xxxxxxxxxxxxxxx

# Stripe Config
STRIPE_SECRET_API_KEY=xxxxxxxxxxxxxxx

# ユーザ固有の環境変数
TEST_VARIABLE=テスト用変数値(初期値)

.stg.env

# ユーザ固有の環境変数
TEST_VARIABLE=テスト用変数値(ステージング環境用)

.prd.env

# ユーザ固有の環境変数
TEST_VARIABLE=テスト用変数値(本番環境用)

ユーザ固有環境変数のコードからの使い方

環境変数を追加した場合、APIのソースコード上からどうやって利用するかを説明します。環境変数の取得はGo言語標準に提供しているOSの環境変数取得関数を使ってアクセスできます。

// envValueに環境変数の値が入る
envValue := os.Getenv("TEST_VARIABLE")

サンプルとしてAPIの戻り値でリクエストパラメータで指定された変数の値を返すような実装をみてみましょう。ここでは検索用APIを変更してDB検索ではなく環境変数を見るように変更しています。

func (h *environmentHandler) searchEnvironments(c echo.Context) error {
  params := &model.EnvironmentSearchCondition{}
  if err := c.Bind(params); err != nil {
    result := &model.Response{}
    result.Error = constant.InvalidRequestParameters
    util.Logger.Error(result.Error, err)
    return c.JSON(http.StatusBadRequest, result)
  }
  util.Logger.Debug(fmt.Sprintf("receive request:%#v", params))
  var environments []*model.Environment
  // ★★ 環境変数へのアクセスは os.Getenv()を使用
  envValue := os.Getenv(*params.EnvironmentName)
  environment := model.Environment{
    Name:  params.EnvironmentName,
    Value: &envValue,
  }
  environments = append(environments, &environment)
  res := model.Environments{
    Environments: environments,
    Count:        1,
  }
  return c.JSON(http.StatusOK, res)
}

SwaggerUIでの確認

実際の環境変数を取得する上記コードを実行した結果を載せておきます。

続いてユーザ定義の環境変数を取得してみます。