TerraformのAuth0プロバイダーがAuth0で完全にサポートされるようになりました #Auth0JP

TerraformでAuth0の管理をやってみます
2020.06.30

Auth0がHashiCorpとのパートナーシップを結び、Auth0とTerraformとの統合がサポートされるようになりました。

インポート/エクスポートできる機能がAuth0にありますが、Auth0独自のyamlファイルとauth0-deploy-cliというクライアントツールが必要です。

TerraformだけでAuth0リソースの作成と構成を含むアプリケーションの構成を管理できて、尚且つサポート対象となったため、Terraformを使用している人にとっては嬉しいアップデートと思います。

やってみる

今回はAuth0の構成管理のみをTerraformで試してみようと思います。 必要なものは、

です。

Auth0での事前準備

TerraformがAuth0でクライアントとAPIを作成できるようにするには、 TerraformがAuth0と通信できるようにするAuth0 Machine-to-Machineアプリケーションを手動で作成する必要があります.

Auth0のダッシュボードにログインし、Applicationsに移動後、Create Applicationボタンを押します。

Nameにアプリケーションの名前、typeMachine to Machine Applicationsを選択してCreateボタンを押します

M2Mアプリケーションには、少なくとも1つの承認済みAPIが必要です。 アプリケーションからの呼び出しを許可するAPIにAuth0 Management APIを選択し、SCOPESに全ての権限を与えます。

作成したアプリケーションの詳細画面に移動するので、settingsタブをクリックし、 Domain、Client ID、Client Secretの値をコピーしておきます.

Terraformのプロバイダーを作成

お使いのPCのターミナルソフトを起動し、ディレクトリを作成します。

mkdir <path_to_your_dir> && cd $_

前の手順でコピーしたDomain、Client ID、Client Secretを環境変数に設定します。

$ export TF_VAR_auth0_domain={AUTH0_DOMAIN}
$ export TF_VAR_auth0_client_id={CLIENT_ID}
$ export TF_VAR_auth0_client_secret={CLIENT_SECRET}

その後、テキストエディタでmain.tfを作成し、以下の内容を記述します。

variable "auth0_domain" {}
variable "auth0_client_id" {}
variable "auth0_client_secret" {}

provider "auth0" {
  domain        = var.auth0_domain
  client_id     = var.auth0_client_id
  client_secret = var.auth0_client_secret
}

Terraformのプロバイダーを定義しています。

プロバイダーについて

Auth0プロバイダーについて

リソース一覧

Terraformで作成できるAuth0リソース一覧です。

リソース名 内容
auth0_client_grant 構成済みのAuth0クライアントで使用されるクライアントの許可を作成および管理
auth0_client 認証にAuth0を使用するアプリケーションをセットアップし、これらのアプリケーションに許可されるコールバックURLとシークレットを構成 
auth0_connection クライアントとユーザーで使用する接続を構成および管理
auth0_custom_domain テナント内でカスタムドメインを作成および管理
auth0_email_template 送信されるメールの外観、使用感、送信者IDをカスタマイズするメールテンプレートを構成を管理
auth0_email 電子メールベースのワークフローを管理。電子メールプロバイダーを構成して、Auth0の認証ワークフローの一部であるすべての電子メールを、選択したサポートされている大量の電子メールサービスを介してルーティング
auth0_resource_server 承認済みアプリケーションから使用できるAPIを設定
auth0_role ユーザーに割り当てることができる権限のコレクションを作成および管理
auth0_rule Rule(認証パイプラインの一部として安全な隔離されたサンドボックスで実行されるカスタムJavaScriptスニペット作成)を管理
auth0_rule_config Ruleで使用する変数を作成および管理
auth0_hook Hook(Auth0の動作をカスタマイズできる)を管理
auth0_prompt ログインエクスペリエンスのバージョンの選択など、Auth0プロンプトを管理
auth0_tenant ロゴとサポート連絡先情報の設定、エラーページの設定、デフォルトのテナント動作の構成など、Auth0テナントを管理
auth0_user パスワードのリセット、ユーザーの作成、プロビジョニング、ブロック、削除など、ユーザーIDを管理

各リソースのページに使用例が記載されているので参考にしてください。

ユーザーを追加してみる

実際にTerraformを使ってユーザーを追加してみます。

以下のコードをmain.tfに追加します。

resource "auth0_user" "user" {
  connection_name = "Username-Password-Authentication"
  user_id = "terraform|123457890"
  name = "テラフォームメン"
  given_name = "メーン"
  family_name = "テラフォーム"
  nickname = "テラフォーマー"
  email = "test@test.com"
  email_verified = true
  password = "passpass$12$12"
}

追加後、ターミナルで以下のコマンドを実行します。

terraform init

Terraform環境を準備して、構成に必要なプラグインとプロバイダーをインストールしています。 実行後、成功なら Terraform has been successfully initialized! とターミナルに表示されているはずです。

次は以下のコマンドを実行し、Terraformが実行中に実行する変更、追加、削除などのプレビューを確認します。

terraform plan

実行結果には以下の内容が含まれています。 main.tfに追加したリソース(今回はユーザー)を作りますよ というふうに教えてくれていますね。

------------------------------------------------------------------------

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # auth0_user.user will be created
  + resource "auth0_user" "user" {
      + connection_name = "Username-Password-Authentication"
      + email           = "test@test.com"
      + email_verified  = true
      + family_name     = "テラフォーム"
      + given_name      = "メーン"
      + id              = (known after apply)
      + name            = "テラフォームメン"
      + nickname        = "テラフォーマー"
      + password        = (sensitive value)
      + picture         = (known after apply)
      + user_id         = "terraform|123457890"
    }

Plan: 1 to add, 0 to change, 0 to destroy.

------------------------------------------------------------------------

追加したいリソースの確認ができたので以下のコマンドを実行して実際に作成してみます。

terraform apply

terraform planを実行した時と同じような内容が出力されます。 applyの場合は最後に、このアクションを実行しますか? というプロンプトが表示されます。 yesと入力すると実際に残りの処理が実行されます。

ユーザーが作られると、以下の結果が出力されます。

auth0_user.user: Creating...
auth0_user.user: Creation complete after 0s [id=auth0|terraform|123457890]

Auth0のダッシュボードでもユーザーが追加されているか確認してみます。 Usersのページに移動します。

テラフォームメンというユーザーが追加されています!

ユーザーを削除してみる

今度は作ったユーザーを削除してみます。 以下のコマンドを実行し、プレビューを表示させてみましょう。

terraform plan -destroy

作成時と同じように、削除するリソースの内容が表示されます。

------------------------------------------------------------------------

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  - destroy

Terraform will perform the following actions:

  # auth0_user.user will be destroyed
  - resource "auth0_user" "user" {
      - blocked         = false -> null
      - connection_name = "Username-Password-Authentication" -> null
      - email           = "test@test.com" -> null
      - email_verified  = true -> null
      - family_name     = "テラフォーム" -> null
      - given_name      = "メーン" -> null
      - id              = "auth0|terraform|123457890" -> null
      - name            = "テラフォームメン" -> null
      - nickname        = "テラフォーマー" -> null
      - password        = (sensitive value)
      - phone_verified  = false -> null
      - picture         = "https://s.gravatar.com/avatar/b642b4217b34b1e8d3bd915fc65c4452?s=480&r=pg&d=https%3A%2F%2Fcdn.auth0.com%2Favatars%2Fdefault.png" -> null
      - roles           = [] -> null
      - user_id         = "auth0|terraform|123457890" -> null
      - verify_email    = false -> null
    }

Plan: 0 to add, 0 to change, 1 to destroy.

------------------------------------------------------------------------

リソースの一部だけ削除するときは

terraform plan -destroy -target auth0_user.user

といったように、-target オプションを使って指定できます。

現在のリソースを確認するには、

terraform state list

で可能です。

では実際に削除してみます。 以下のコマンドを実行してみましょう。

terraform destroy -target auth0_user.user

追加した時と同じように削除するかのプロンプトが表示されるので、yesを入力して実行します。

削除されると、以下のような出力が表示されます。

auth0_user.user: Destroying... [id=auth0|terraform|123457890]
auth0_user.user: Destruction complete after 1s

Auth0のダッシュボードで確認すると、削除されていることがわかります。

Auth0のログにも削除実行の結果が表示されています。

terraform destroy で削除しましたが、 main.tfで追加したリソースの箇所を削除し、terraform applyを実行することで削除することもできます。 今回はこの方法でもよかったなと、ここまで来て気づきました。

最後に

Terraformを使ってユーザーの作成、削除を行ってみました。 本記事でも記載しましたが、様々なリソースの管理が可能ですのでこれを機にTerraformでの管理を学習してみてはいかがでしょうか?

また、TerraformとAuth0のウェビナーもありますので参加してみるのも良いと思います

HashiCorp Terraformを使用したAuth0-as-Code

2020年6月30日午前10時(太平洋時間) -> 2020年7月1日午前2時(日本時間)