[Auth0] 可変設定値をファイルで管理して複数テナントに同じ構成でデプロイする

可変設定値のみを記載したconfig.jsonファイルを作成すれば複数テナントに同じ構成でデプロイするのが簡単になります
2021.02.01

こんにちは、CX事業本部の小林です。

Auth0ではテナントの設定値をyamlファイルにエクスポートしてコードで管理できます。

開発用・ステージング用・本番用など複数のテナントを管理している場合、各環境で可変となる設定値のみを記載したファイルを作成することで、各環境のテナントごとにエクスポートして別々に管理…ということをしなくて済みます。

本記事では、開発用と本番用の2つのテナントを例として複数テナントを効率良く管理する方法をご紹介します。

前提

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.15.6
BuildVersion:   19G2021

$ node -v
v14.15.4

$ npm -v
6.14.10

$ yarn -v
1.22.10

準備

auth0-deploy-cliをインストールします。

$ npm i -g auth0-deploy-cli

$ a0deploy --version
5.5.0

Auth0のExtensionsでAuth0 Deploy CLIをインストールします。こちらの手順は以下の記事に記載がありますのでご参照ください。

各環境ごとに設定ファイルconfig.jsonを作成します。今回は開発テナント用のconfig.dev.json、本番テナント用のconfig.prd.jsonを作成しました。

AUTH0_DOMAINAUTH0_CLIENT_IDは各環境のテナントの情報を記載します。

config.dev.json

{
  "AUTH0_DOMAIN": "hoge-dev.jp.auth0.com",
  "AUTH0_CLIENT_ID": "XXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "AUTH0_ALLOW_DELETE": false
}

config.prd.json

{
  "AUTH0_DOMAIN": "hoge-prd.jp.auth0.com",
  "AUTH0_CLIENT_ID": "XXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "AUTH0_ALLOW_DELETE": false
}

開発テナントの設定値をベースとするので、開発テナントの設定を以下のコマンドでエクスポートします。AUTH0_CLIENT_SECRETconfig.dev.jsonに記載しても良いのですが秘密情報のため環境変数に設定して-xオプションで読み込むようにしました。

export AUTH0_CLIENT_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxx
a0deploy export -c config.dev.json -x ${AUTH0_CLIENT_SECRET} -f yaml -o tenants

エクスポートが完了すると、tenantsディレクトリ配下に設定ファイル等のエクスポート結果が格納されます。tenant.yamlにテナントの様々な設定値が記載されています。

$ tree -L 1
.
├── pages/ # Universal Loginをカスタマイズしたためhtmlファイルが出力されている
└── tenant.yaml # テナント設定が一式されている

各環境ごとの設定値をconfig.jsonに記載する

AUTH0_KEYWORD_REPLACE_MAPPINGSというプロパティ名のオブジェクト内に各環境ごとに可変となる設定値を記載します。

config.dev.json

{
  "AUTH0_DOMAIN": "hoge-dev.jp.auth0.com",
  "AUTH0_CLIENT_ID": "XXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "AUTH0_ALLOW_DELETE": false,
    "AUTH0_KEYWORD_REPLACE_MAPPINGS": {
    // プロパティ名は自由
    // 複数値の場合は配列で
    "APP_NAME": "hoge-spa-dev",
    "ALLOWED_URLS": ["http://localhost:3000", "http://localhost:4000"],
    "API_IDENTIFER": "https://api-dev.example.com"
  }
}

config.prd.json

{
  "AUTH0_DOMAIN": "hoge-prd.jp.auth0.com",
  "AUTH0_CLIENT_ID": "XXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "AUTH0_ALLOW_DELETE": false,
    "AUTH0_KEYWORD_REPLACE_MAPPINGS": {
    "APP_NAME": "hoge-spa-prd",
    "ALLOWED_URLS": ["http://hoge.example.com"],
    "API_IDENTIFER": "https://api-prd.example.com"
  }
}

tenant.yamlの設定項目を変数化する

開発テナントからエクスポートしたtenant.yamlを編集します。各環境ごとに可変となる設定値を、前述のconfig.${環境名}.json内のAUTH0_KEYWORD_REPLACE_MAPPINGSに記載したプロパティ名で置き換えます。

文字列を展開する場合は##プロパティ名##または@@プロパティ名@@と記載します。展開する値が配列またはオブジェクトの場合は@@プロパティ名@@を使用します。

tenants/tenant.yaml

  - name: '##APP_NAME##'
    allowed_clients: []
    allowed_logout_urls: @@ALLOWED_URLS@@
    allowed_origins: @@ALLOWED_URLS@@
    app_type: spa
    callbacks: @@ALLOWED_URLS@@
    client_aliases: []
    cross_origin_auth: false
    custom_login_page_on: true

なお、環境変数の値も文字列と同様##環境変数名##で展開されます。

tenants/tenant.yaml

  # export ENV=dev
  - name: 'hoge-spa-##ENV##'
    allowed_clients: []
    allowed_logout_urls: @@ALLOWED_URLS@@
    allowed_origins: @@ALLOWED_URLS@@
    app_type: spa
    callbacks: @@ALLOWED_URLS@@
    client_aliases: []
    cross_origin_auth: false
    custom_login_page_on: true

インポート

各環境ごとにENVAUTH0_CLIENT_SECRETを環境変数にセットしてインポートします。

export ENV=dev
export AUTH0_CLIENT_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxx

a0deploy import -c config.${ENV}.json -x ${AUTH0_CLIENT_SECRET} -i tenants/tenant.yaml
export ENV=prd
export AUTH0_CLIENT_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxx

a0deploy import -c config.${ENV}.json -x ${AUTH0_CLIENT_SECRET} -i tenants/tenant.yaml

おわりに

可変設定値のみを記載したconfig.jsonファイルを作成すればエクスポートして管理するテナント設定ファイルが最小限となります。非常に便利なのでぜひ試してみてください。

参考