
こんにちは、フルサポート開発の辰己です。 この時期はビザスクのテックブログの更新が盛り上がりますね。 乗るしかないこのビッグウェーブに!ということで今回はAuth0テナント設定をTerraform管理してみたので、その方法について記事にまとめます。
下準備(Auth0テナントの用意)
TerraformのAuth0 ProviderはAuth0 Management APIを利用します。 そのためTerraformで管理するためにはテナントを作成して、Auth0 Management APIを利用するためのMachine to Machine アプリケーションを作成する必要があります。 WEBコンソールからアプリケーションを作成したら準備完了です。
Auth0テナントをTerraform管理化に
準備ができたらAuth0テナントをTerraform管理化におくために必要なファイルを生成します。
https://registry.terraform.io/providers/auth0/auth0/latest/docs/guides/generate_terraform_config
上記の手順で生成できるauth0_import.tfとauth0_generated.tfが重要です。
auth0_generated.tfがAuth0テナントのTerraform構成です。auth0_import.tfは既存リソースをその構成にimportするために必要です。
これらのファイルが生成できればTerraformの適用が可能です。auth0_generated.tfを編集すれば実際にAuth0テナントのリソースを追加・変更することが可能になります。
ただ実運用に乗せるためにはいくらか修正が必要になったので、次にその内容をご紹介します。
実運用に向けての調整
実運用、つまりは開発環境、ステージング環境、本番環境のように環境ごとにAuth0テナントをTerraform管理していくために必要な対応を行いました。
リソース名からidなど固有の値を取り除く
生成したコードではリソース名に環境固有のidが含まれているケースがありました。
auth0_client_grantなどのリソースタイプでリソース名が{client_id}_*のようにclient_idを含んでいるケースがあり、これでは別環境で使うリソース名として不適切なのでclient_idの部分を削除する対応を行いました。
リソースタイプごとにファイルを分割する
今回はTerraform管理する前にAuth0テナントをある程度手動で設定してからTerrraform設定の生成を行いました。
そのため自動生成されるauth0_generated.tfがかなり巨大だったため、リソースタイプごとにファイルを分割して修正しやすくしました。
結果、以下のようなファイル群となりました。(多い。。。)
auth0_action.tf auth0_attack_protection.tf auth0_branding.tf auth0_client.tf auth0_client_credentials.tf auth0_client_grant.tf auth0_connection.tf auth0_connection_clients.tf auth0_custom_domain.tf auth0_email_provider.tf auth0_email_template.tf auth0_gurdian.tf auth0_pages.tf auth0_prompt.tf auth0_prompt_custom_text.tf auth0_resource_server.tf auth0_resource_server_scopes.tf auth0_tenant.tf auth0_trigger_actions.tf
環境ごとに変える値の変数化
アプリケーションのURLなど環境ごとに変更する必要がある値を変数化して、各環境ごとに値を取得してTerraformを適用できるようにしました。
機密情報をSecret Managerから取得するようにする
シークレット周りの設定については自動生成されないため、Google Cloud の Secret Managerから値を取得してTerraformを適用できるように修正を行いました。
Terraform構成
調整が終わってTerraformで管理を始めた際の構成が以下の通りです。 (実際の構成からAuth0に関係する部分のみを抜粋して簡略化しています。)
environments
├── development
│ ├── auth0_import.tf
│ ├── auth0_tenant.tf
│ ├── locals.tf
│ ├── main.tf
├── staging
│ ├── auth0_import.tf
│ ├── auth0_tenant.tf
│ ├── locals.tf
│ ├── main.tf
└── production
├── auth0_import.tf
├── auth0_tenant.tf
├── locals.tf
├── main.tf
modules
└── auth0
├── main.tf
├── outputs.tf
├── variables.tf
├── auth0_trigger_actions.tf
├── auth0_tenant.tf
├── ...(以下Auth0のリソースタイプごとのファイルが続く)
各環境のauth0_tenant.tfがmodulesをsourceとしてmoduleを定義します。
module "auth0_tenant" {
source = "../../modules/auth0"
auth0_domain = local.auth0.domain
environment = local.auth0.environment
custom_domain = local.auth0.custom_domain
application_url = local.auth0.application_url
}
最後に
これでAuth0のTerraform管理ができるようになりました。
これまでAuth0のDeploy CLIを使っていてDry Runできない課題がありましたが、terraform planで安全に変更できるようになりました。
再利用性の高いmoduleの設計まではできていないので、その辺りは今後の課題かと思います。
ここまで読んでいただきありがとうございました!
ビザスクではエンジニアの仲間を募集しています! 少しでもビザスク開発組織にご興味を持たれた方は、ぜひ一度カジュアルにお話ししましょう! developer-recruit.visasq.works