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

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

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

想定する環境に関して

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

環境名環境日本語名環境の説明
dev開発環境開発をしている開発PC上の環境を指します。
stgステージング環境
(テスト環境)
ステージング環境。本番運用開始後、本番環境にTemPlat Consoleのデプロイ先にしたままだと、ソース自動生成が気軽できず改修や追加開発がやりづらいです。
その様な場合デプロイ先をステージング環境として、本番環境を分けることができます。
TemPlat Consoleでは本番環境に加えて、ステージング環境も自動デプロイの対象となっていますので、ビルドによりCloudRun環境に即デプロイされます。
prd本番環境通常、TemPlat ConsoleがデプロイするGCP環境で、本番環境。
TemPlat Consoleでの自動デプロイの対象となっていますので、ビルドによりCloudRun環境に即デプロイされます。

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

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

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

# GCP Project Config
PROJECT_ID=templat-test-2021-324622
CREDENTIAL_FILE_PATH=/app/secret.json
LOG_LEVEL=DEBUG #DEBUG,INFO,WARN,ERROR,OFF

# Image Config
IMAGE_BUCKET_NAME=templat-test-2021-324622-images

# File Config
FILE_BUCKET_NAME=templat-test-2021-324622-files

# SendGrid Config
SEND_GRID_API_KEY=SEND_GRID_API_KEY

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

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

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

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

.env

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

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

.env.devおよび.env.stg

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

.env.prd

本番環境用の環境定義ファイルにのみ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=テスト用変数値(初期値)

.env.stg

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

.env.prd

# ユーザ固有の環境変数
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での確認

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

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

(参考)環境変数の確認および切替方法

通常TemPlat Consoleからデプロイされる本番環境(prod)、およびステージング環境(stg)に関してはこちらの作業は特に不要です。もしご自身でprod/stgとは違うCloudRun環境を作る際に参考にしてください。

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

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

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

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

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

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