VISASQ Dev Blog

ビザスク開発ブログ

Auth0テナントをTerraform管理したい

こんにちは、フルサポート開発の辰己です。 この時期はビザスクのテックブログの更新が盛り上がりますね。 乗るしかないこのビッグウェーブに!ということで今回は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.tfauth0_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.tfmodulesを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