TerraformのAuth0プロバイダーがAuth0で完全にサポートされるようになりました #Auth0JP
Auth0がHashiCorpとのパートナーシップを結び、Auth0とTerraformとの統合がサポートされるようになりました。
インポート/エクスポートできる機能がAuth0にありますが、Auth0独自のyamlファイルとauth0-deploy-cliというクライアントツールが必要です。
TerraformだけでAuth0リソースの作成と構成を含むアプリケーションの構成を管理できて、尚且つサポート対象となったため、Terraformを使用している人にとっては嬉しいアップデートと思います。
やってみる
今回はAuth0の構成管理のみをTerraformで試してみようと思います。 必要なものは、
- Auth0アカウント(Freeアカウントのサインアップ)
- Terraform(インストール方法]
です。
Auth0での事前準備
TerraformがAuth0でクライアントとAPIを作成できるようにするには、 TerraformがAuth0と通信できるようにするAuth0 Machine-to-Machineアプリケーションを手動で作成する必要があります.
Auth0のダッシュボードにログインし、Applications
に移動後、Create Application
ボタンを押します。
Name
にアプリケーションの名前、type
にMachine 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のプロバイダーを定義しています。
リソース一覧
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時(日本時間)