本記事では、Terraformを活用したMicrosoft 365のライセンス管理方法をご案内します。OneLogin と Terraform を連携することにより、Users, Roles, Rules 等のインフラストラクチャ構成をソースコードにて管理することが可能となります。
目次
前提条件
- OneLoginのライセンスプラン が SSO, Advanced, Professional または旧ライセンスプラン Starter, Enterprise, Unlimited のいずれかであること
- OneLoginの Super User または Account Owner 権限を持つアカウントを所有していること
- Terraform OneLogin Providerの設定 が完了していること
事前準備
本記事でご紹介する操作には、以下のファイルやツールが必要です。
-
Terraform OneLogin Providerの設定 で作成した設定ファイル群
*README.mdにスクリプトの詳細が記載されています。onelogin-terraform/ ├── provider.tf ├── .env ├── terraform.tfvars ├── variables.tf ├── import_onelogin_rules.sh ├── licence_generator.sh ├── onelogin_api_generate_access-token.sh └── README.md - Python 3: ご利用のOSに適したPython 3をインストールしてください。
作業の流れ
terraform apply を安易に実行すると、既存のルールに予期せぬ変更が加えられる可能性があるため、以下のワークフローを推奨いたします。テスト環境の構築が困難な場合でも、本番環境内にテスト用コネクタを作成することで、本ワークフローに準拠することが可能です。
-
テスト環境の準備
- テスト用コネクタを作成
- 本番環境と同じルールを設定
-
テスト環境でのTerraform操作
- 既存のルールをインポート
- 行いたい変更や追加を行い、
terraform plan/applyを実行
-
本番環境への適用
- テスト用コネクタと同様の操作
-
terraform plan/applyを慎重に実行
-
変更管理とバージョン管理
- バージョン管理システム(GitなどのVCS)により変更を管理
- 問題が発生した場合は、直ちにロールバック
既存ルールのインポート
本章では、コネクタに設定されたルールを統合し、Terraformリソースとして書き出すスクリプト(弊社作成)を活用し、ルールをインポートする方法を説明します。
- OneLoginに管理者でログインし、[管理]をクリックします
-
Applications メニューから[Applications]を選択します
- ご利用の Office 365 V2 を検索し、選択します
-
コネクタ編集画面のURLから、Applicationの識別子をクリップボードへコピーします
例)URLが https://subdomain.onelogin.com/apps/123456/editの場合、123456をコピー -
ターミナルを開き、
onelogin-terraform % chmod +x import_onelogin_rules.shを実行します -
onelogin-terraform % ./import_onelogin_rules.sh 手順4の識別子 実行後に生成される任意のファイル名を実行します
例)onelogin-terraform % ./import_onelogin_rules.sh 123456 microsoft365_rules.tf -
以下の完了メッセージが出力されることを確認します
スクリプトの実行が完了しました。 - Terraformリソースがインポートされ、定義が $OUTPUT_FILE に書き込まれました。 - インポートに失敗したルールの空のリソース定義は削除されました。 -
terraform planを実行し、リソースファイルの内容と、OneLoginの状態に差異が無いことを確認しますonelogin_apps_rules.rule_234718: Refreshing state... [id=234718] onelogin_apps_rules.rule_298481: Refreshing state... [id=298481] onelogin_apps_rules.rule_481701: Refreshing state... [id=481701] onelogin_apps_rules.rule_572075: Refreshing state... [id=572075] onelogin_apps_rules.rule_234720: Refreshing state... [id=234720] onelogin_apps_rules.rule_426462: Refreshing state... [id=426462] onelogin_apps_rules.rule_234717: Refreshing state... [id=234717] onelogin_apps_rules.rule_169611: Refreshing state... [id=169611] onelogin_apps_rules.rule_234741: Refreshing state... [id=234741] onelogin_apps_rules.rule_234721: Refreshing state... [id=234721] onelogin_apps_rules.rule_117385: Refreshing state... [id=117385] No changes. Your infrastructure matches the configuration.
注:連続でスクリプトを実行するとエラーが発生する可能性があります。最新のOneLoginのルール情報を取得したい場合は、以下の手順を行ってから再度スクリプトを実行してください:
- リソースファイルでの変更を
terraform applyを実行してOneLoginに反映させる - インポートしたリソースファイル、
terraform.tfstate、terraform.tfstate.backupを削除する
これらの手順の後、スクリプトを再度実行することで最新のOneLoginのルール情報を安全に取得できます。
リソースファイルの構造
この章ではインポートしたルールのリソースファイルの構造や用いることができる値についてご紹介します。
基本情報
OneLoginのアプリケーションルールは、Terraformを使用して以下のような構造で定義されます:
# microsoft365_rules.tf
︙
resource "onelogin_apps_rules" "rule_name" {
apps_id = "アプリケーションID"
enabled = true/false
match = "all"/"any"
name = "ルール名"
position = 位置番号
actions {
// アクションの定義
}
conditions {
// 条件の定義
}
}
︙主要な属性:
- apps_id : ルールが適用されるアプリケーションのID
- enabled : ルールの有効/無効状態(true/false)
- match : 複数条件がある場合の一致方法("all": すべての条件を満たす, "any": いずれかの条件を満たす)
- name : ルールの名前
- position : ルールの適用順序
Actions(アクション)
Actions(アクション)は、条件が満たされた場合に実行される操作を定義します。
基本構造
actions {
action = "アクション名"
value = ["値1", "値2", ...]
}
主なアクション(acrions)
set_licenses : ライセンスの割り当て
set_groups : グループの割り当て
例)ライセンスの割り当て
actions {
action = "set_licenses"
value = ["GUID:サービスプラン識別子1", "GUID:サービスプラン識別子2", ...]
}
例)グループの割り当て
actions {
action = "set_groups"
value = ["グループID"]
}
Conditions(条件)
Conditions(条件)は、ルールを適用するかどうかを決定するために使用されます。
基本構造
conditions {
operator = "演算子"
source = "属性"
value = "比較値"
}
主な属性(source)
- distinguished_name : ユーザーの識別名
- member_of : ユーザーが所属するグループ
- has_role : ユーザーが持つロール
- department : ユーザーの部署
演算子(operator)
- ~ : 含む(文字列比較)
- !~ : 含まない(文字列比較)
- ri : ロールID(has_role用)
例)ユーザーの識別名による条件
conditions {
operator = "~"
source = "distinguished_name"
value = "OU=Sales,OU=Users,DC=company,DC=com"
}この条件は、ユーザーの識別名にOU=Sales,OU=Users,DC=company,DC=com が含まれている場合に真となります。
例)ユーザーのロールによる条件
conditions {
operator = "ri"
source = "has_role"
value = "570882"
}この条件は、ユーザーがロールID570882 を持っている場合に真となります。
既存Rulesのリソースファイルを更新する
この章では、既存Rulesをインポートするで作成したリソースファイルを編集し、既存のルールを更新する方法をご紹介します。
割り当て条件を変更する
既存のルールの割り当て条件を変更するには、リソースファイル内の conditions ブロックを編集します。
例) ユーザーの部署条件を変更する
変更前:
conditions {
operator = "~"
source = "department"
value = "営業部"
}
変更後:
conditions {
operator = "~"
source = "department"
value = "マーケティング部"
}
複数の条件を作成する場合はconditions ブロックを追加します。条件の一致方法はリソース内のmatchパラメータで指定します。
matchには以下の2つのオプションがあります:
- "all": すべての条件を満たす必要がある場合
- "any": いずれかの条件を満たせば十分な場合
例)条件を追加する
resource "onelogin_apps_rules" "rule_name" {
// 他の設定項目
match = "all"または"any"
// 他の設定項目
conditions {
operator = "~"
source = "department"
value = "マーケティング部"
}
conditions {
operator = "ri"
source = "has_role"
value = "123456"
}
割り当てるライセンスを変更する
Terraformでライセンスを割り当てるには、最新のライセンス情報を取得し、リソースファイルで用いられる適切な形式に変換する必要があります。以下の手順でスクリプトファイルlicence_generator.shを使用してこのプロセスを自動化します。
- Microsoft の公式ドキュメントのライセンスのための製品名とサービス プラン識別子のページにアクセスします
-
ページ内からライセンス情報が記載されたCSVファイルがダウンロードできるので、
product_licenses.csvとして保存しますonelogin-terraform/ ├── provider.tf ├── terrafrom.tfvars ├── .env ├── variables.tf ├── microsoft365_rules.tf ├── import_onelogin_rules.sh ├── licence_generator.sh ├── onelogin_api_generate_access-token.sh ├── product_licenses.csv └── README.md -
onelogin-terraform % chmod +x licence_generator.shを実行し、スクリプトファイルlicence_generator.shに実行権限を与えます -
onelogin-terraform % ./licence_generator.shを実行します -
以下の完了メッセージが出力され
product_actions.txtが作業ディレクトリ内に作成されたことを確認します処理が完了しました。結果は product_actions.txt に出力されました。 スクリプトの実行が正常に完了しました。 -
生成された
product_actions.txtファイルを開き、必要なライセンス情報を探しますテキストエディタの検索機能を使用して、製品名やGUIDで検索すると効率的です
# product_actions.txt AI Builder Capacity add-on actions { action = "set_licenses" value = [ "d2dea78b-507c-4e56-b400-39447f4738f8:113feb6c-3fe4-4440-bddc-54d774bf0318", # Exchange Foundation "d2dea78b-507c-4e56-b400-39447f4738f8:a7c70a41-5e02-4271-93e6-d9b4184d83f5", # AI Builder capacity add-on ] } App Connect IW actions { action = "set_licenses" value = [ "8f0c5670-4e56-4892-b06d-91c085d7004f:0bfc98ed-1dbc-4a97-b246-701754e48b17", # APP CONNECT "8f0c5670-4e56-4892-b06d-91c085d7004f:113feb6c-3fe4-4440-bddc-54d774bf0318", # EXCHANGE FOUNDATION ] } ︙ -
ライセンス名の直下の
actionsブロックをコピーしてライセンス割り当てに使用します# product_actions.txt ︙ Microsoft 365 E3 actions { action = "set_licenses" value = [ "05e9a617-0261-4cee-bb44-138d3ef5d965:041fe683-03e4-45b6-b1af-c0cdc516daee", # Power Virtual Agents for Office 365 "05e9a617-0261-4cee-bb44-138d3ef5d965:0feaeb32-d00e-4d66-bd5a-43b5b83db82c", # Skype for Business Online (Plan 2) ︙ "05e9a617-0261-4cee-bb44-138d3ef5d965:db4d623d-b514-490b-b7ef-8885eee514de", # Nucleus "05e9a617-0261-4cee-bb44-138d3ef5d965:e95bec33-7c88-4a70-8e19-b10bd9d0c014", # Office for the Web ] } ︙
ライセンス情報を取得したら、既存のルールで割り当てるライセンスを変更できます。以下の手順でproduct_actions.txtファイルから必要な情報をコピーし、リソースファイルに追加します。
例1)Microsoft 365 E3を追加する:
-
product_actions.txtファイル内で「Microsoft 365 E3」を検索し、該当するライセンスのactionsブロック全体をクリップボードへコピーします# product_actions.txt ︙ Microsoft 365 E3 actions { action = "set_licenses" value = [ "05e9a617-0261-4cee-bb44-138d3ef5d965:041fe683-03e4-45b6-b1af-c0cdc516daee", # Power Virtual Agents for Office 365 "05e9a617-0261-4cee-bb44-138d3ef5d965:0feaeb32-d00e-4d66-bd5a-43b5b83db82c", # Skype for Business Online (Plan 2) ︙ "05e9a617-0261-4cee-bb44-138d3ef5d965:db4d623d-b514-490b-b7ef-8885eee514de", # Nucleus "05e9a617-0261-4cee-bb44-138d3ef5d965:e95bec33-7c88-4a70-8e19-b10bd9d0c014", # Office for the Web ] } ︙
-
リソースファイル内の該当する
onelogin_apps_rulesリソースのactionsブロックを、コピーした内容で置き換えます# microsoft365_rules.tf ︙ resource "onelogin_apps_rules" "rule_657226" { apps_id = "765042" enabled = true match = "all" name = "ライセンス割当 - Microsoft 365 E3" position = 5 actions { action = "set_licenses" value = [ "05e9a617-0261-4cee-bb44-138d3ef5d965:041fe683-03e4-45b6-b1af-c0cdc516daee", # Power Virtual Agents for Office 365 "05e9a617-0261-4cee-bb44-138d3ef5d965:0feaeb32-d00e-4d66-bd5a-43b5b83db82c", # Skype for Business Online (Plan 2) ︙ "05e9a617-0261-4cee-bb44-138d3ef5d965:db4d623d-b514-490b-b7ef-8885eee514de", # Nucleus "05e9a617-0261-4cee-bb44-138d3ef5d965:e95bec33-7c88-4a70-8e19-b10bd9d0c014", # Office for the Web ] } } conditions { operator = "ri" source = "has_role" value = "747943" } } ︙
例2)Exchange Online (Plan 1)とMicrosoft Entra ID P1を割り当てる:
-
product_actions.txtファイル内で「Exchange Online (Plan 1)」を検索し、該当するactionsブロックをクリップボードへコピーします# product_actions.txt ︙ Exchange Online (Plan 1) actions { action = "set_licenses" value = [ "4b9405b0-7788-4568-add1-99614e613b69:5e62787c-c316-451f-b873-1d05acd4d12c", # To-Do (Plan 1) "4b9405b0-7788-4568-add1-99614e613b69:882e1d05-acd1-4ccb-8708-6ee03664b117", # Mobile Device Management for Office 365 "4b9405b0-7788-4568-add1-99614e613b69:9aaf7827-d63c-4b61-89c3-182f06f82e5c", # Exchange Online (Plan 1) ] } ︙ -
同様に、Microsoft Entra ID P1 と検索し、該当する
actionsブロックをクリップボードへコピーします# product_actions.txt ︙ Microsoft Entra ID P1 actions { action = "set_licenses" value = [ "078d2b04-f1bd-4111-bbd4-b4b1b354cef4:113feb6c-3fe4-4440-bddc-54d774bf0318", # EXCHANGE FOUNDATION "078d2b04-f1bd-4111-bbd4-b4b1b354cef4:41781fb2-bc02-4b7c-bd55-b576c07bb09d", # Microsoft Entra ID P1 "078d2b04-f1bd-4111-bbd4-b4b1b354cef4:8a256a2b-b617-496d-b51b-e76466e88db0", # MICROSOFT AZURE MULTI-FACTOR AUTHENTICATION "078d2b04-f1bd-4111-bbd4-b4b1b354cef4:932ad362-64a8-4783-9106-97849a1a30b9", # CLOUD APP SECURITY DISCOVERY ] } ︙ -
リソースファイル内の該当する
onelogin_apps_rulesリソースのactionsブロックを、結合したブロックで置き換えます# microsoft365_rules.tf ︙ resource "onelogin_apps_rules" "rule_657226" { apps_id = "765042" enabled = true match = "all" name = "ライセンス割当 - 複数ライセンス" position = 5 actions { action = "set_licenses" value = [ // Exchange Online (Plan 1)のサービスプラン識別子 "4b9405b0-7788-4568-add1-99614e613b69:5e62787c-c316-451f-b873-1d05acd4d12c", # To-Do (Plan 1) "4b9405b0-7788-4568-add1-99614e613b69:882e1d05-acd1-4ccb-8708-6ee03664b117", # Mobile Device Management for Office 365 "4b9405b0-7788-4568-add1-99614e613b69:9aaf7827-d63c-4b61-89c3-182f06f82e5c", # Exchange Online (Plan 1) // Microsoft Entra ID P1のサービスプラン識別子 "078d2b04-f1bd-4111-bbd4-b4b1b354cef4:113feb6c-3fe4-4440-bddc-54d774bf0318", # EXCHANGE FOUNDATION "078d2b04-f1bd-4111-bbd4-b4b1b354cef4:41781fb2-bc02-4b7c-bd55-b576c07bb09d", # Microsoft Entra ID P1 "078d2b04-f1bd-4111-bbd4-b4b1b354cef4:8a256a2b-b617-496d-b51b-e76466e88db0", # MICROSOFT AZURE MULTI-FACTOR AUTHENTICATION "078d2b04-f1bd-4111-bbd4-b4b1b354cef4:932ad362-64a8-4783-9106-97849a1a30b9", # CLOUD APP SECURITY DISCOVERY ] } conditions { operator = "ri" source = "has_role" value = "747943" } } ︙
既存Rulesのリソースファイルの変更は以上です。
新規Rulesのリソースファイルを作成する
新しいルールを作成する際も、既存のルールを更新する場合と同様の手順で行います。以下に、Microsoft Copilotのライセンスを割り当てる新規ルールの作成例をご紹介します。
例)Copilotルールを追加する
Microsoft Copilotのライセンスを特定のロールに属しているユーザーに割り当てる新しいルールを作成するには、以下の手順で操作をします。
-
product_actions.txtファイル内で「Microsoft Copilot」と検索し、該当するライセンスのactionsブロック全体をクリップボードへコピーします# product_actions.txt ︙ Microsoft Copilot for Microsoft 365 actions { action = "set_licenses" value = [ "639dec6b-bb19-468b-871c-c5c441c4b0cb:3f30311c-6b1e-48a4-ab79-725b469da960", # Microsoft 365 Chat "639dec6b-bb19-468b-871c-c5c441c4b0cb:82d30987-df9b-4486-b146-198b21d164c7", # Graph Connectors in Microsoft 365 Copilot ︙ "a809996b-059e-42e2-9866-db24b99a9782:a62f8878-de10-42f3-b68f-6149a25ceb97", # Microsoft 365 Copilot in Productivity Apps "a809996b-059e-42e2-9866-db24b99a9782:b95945de-b3bd-46db-8437-f2beb6ea2347", # Microsoft 365 Copilot in Microsoft Teams ] } ︙ -
リソースファイル内の末尾などに
onelogin_apps_rulesリソースを新たに作成します# microsoft365_rules.tf ︙ resource "onelogin_apps_rules" "rule_637484" { ︙ } ︙// 既存リソースファイルの末尾にリソースを追加します resource "onelogin_apps_rules" "rule_657226" { apps_id = "765042" # 実際のアプリIDに書き換えてください enabled = true match = "all" name = "ライセンス割当 - Microsoft Copilot" position = 5 # 適切なルールの適用順序に換えてください actions { action = "set_licenses" value = [ "639dec6b-bb19-468b-871c-c5c441c4b0cb:3f30311c-6b1e-48a4-ab79-725b469da960", # Microsoft 365 Chat "639dec6b-bb19-468b-871c-c5c441c4b0cb:82d30987-df9b-4486-b146-198b21d164c7", # Graph Connectors in Microsoft 365 Copilot ︙ "a809996b-059e-42e2-9866-db24b99a9782:a62f8878-de10-42f3-b68f-6149a25ceb97", # Microsoft 365 Copilot in Productivity Apps "a809996b-059e-42e2-9866-db24b99a9782:b95945de-b3bd-46db-8437-f2beb6ea2347", # Microsoft 365 Copilot in Microsoft Teams ] } conditions { operator = "ri" source = "has_role" value = "747943" # 実際のロールIDに書き換えてください } }
リソースファイルの変更をOneLoginに反映する
リソースファイルの変更をOneLoginに反映させるには以下の手順で操作をします。すべてのコマンドは、Terraform設定ファイル(.tf)が存在するディレクトリで実行してください。
-
onelogin-terraform % terraform planを実行し、変更内容を確認しますTerraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create ~ update in-place - destroy Terraform will perform the following actions: # onelogin_apps_rules.rule_657226 will be destroyed # (because onelogin_apps_rules.rule_657226 is not in configuration) - resource "onelogin_apps_rules" "rule_657226" { - apps_id = "765042" -> null - enabled = true -> null - id = "657226" -> null - match = "any" -> null - name = "ライセンス割当 - Microsoft 365 Copilot" -> null - position = 22 -> null - actions { - action = "set_licenses" -> null - value = [ - "18181a46-0d4e-45cd-891e-60aabd171b4e:5e62787c-c316-451f-b873-1d05acd4d12c", - "18181a46-0d4e-45cd-891e-60aabd171b4e:8c7d2df8-86f0-4902-b2ed-a0458298f3b3", ︙ - "18181a46-0d4e-45cd-891e-60aabd171b4e:bed136c6-b799-4462-824d-fc045d3a9d25", - "18181a46-0d4e-45cd-891e-60aabd171b4e:0683001c-0492-4d59-9515-d9a6426b5813", ] -> null } - conditions { - operator = "ri" -> null - source = "has_role" -> null - value = "747943" -> null } } # onelogin_apps_rules.rule_665688 will be updated in-place ~ resource "onelogin_apps_rules" "rule_665688" { id = "665688" ~ name = "ライセンス割当 - Microsoft 365 Copilot" -> "ライセンス割当 - Microsoft 365 Copilot - Updated" # (4 unchanged attributes hidden) ~ actions { ~ value = [ "18181a46-0d4e-45cd-891e-60aabd171b4e:5e62787c-c316-451f-b873-1d05acd4d12c", - "18181a46-0d4e-45cd-891e-60aabd171b4e:8c7d2df8-86f0-4902-b2ed-a0458298f3b3", - "18181a46-0d4e-45cd-891e-60aabd171b4e:40b010bb-0b69-4654-ac5e-ba161433f4b4", - "18181a46-0d4e-45cd-891e-60aabd171b4e:9aaf7827-d63c-4b61-89c3-182f06f82e5c", "18181a46-0d4e-45cd-891e-60aabd171b4e:0f9b09cb-62d1-4ff4-9129-43f4996f83f4", # (19 unchanged elements hidden) ] # (1 unchanged attribute hidden) } # (1 unchanged block hidden) } # onelogin_apps_rules.rule_665689 will be created + resource "onelogin_apps_rules" "rule_665689" { + apps_id = "765042" + enabled = true + id = (known after apply) + match = "all" + name = "ライセンス割当 - Microsoft 365 Copilot - Updated" + position = 22 + actions { + action = "set_licenses" + value = [ + "18181a46-0d4e-45cd-891e-60aabd171b4e:5e62787c-c316-451f-b873-1d05acd4d12c", + "18181a46-0d4e-45cd-891e-60aabd171b4e:8c7d2df8-86f0-4902-b2ed-a0458298f3b3", ︙ + "18181a46-0d4e-45cd-891e-60aabd171b4e:bed136c6-b799-4462-824d-fc045d3a9d25", + "18181a46-0d4e-45cd-891e-60aabd171b4e:0683001c-0492-4d59-9515-d9a6426b5813", ] } + conditions { + operator = "ri" + source = "has_role" + value = "747943" } } Plan: 1 to add, 1 to change, 1 to destroy.出力の見方:
- ~ :既存のリソースが更新されることを示します
- + :新しいリソースが追加されることを示します
- - :リソースが削除されることを示します
- Plan:追加、変更、削除されるリソースの数を示しています
-
onelogin-terraform % terraform applyを実行し、terraform planで示された変更を実際に適用します -
変更内容が表示されるので問題がなければ
yesと入力しますTerraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: ︙ Plan: 0 to add, 1 to change, 0 to destroy. Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: yes
-
変更が正常に適用されたことを確認します。以下のような変更内容を示す出力が表示されます
onelogin_apps_rules.rule_657226: Destroying... [id=657226] onelogin_apps_rules.rule_665689: Creating... onelogin_apps_rules.rule_665688: Modifying... [id=665688] onelogin_apps_rules.rule_657226: Destruction complete after 0s onelogin_apps_rules.rule_665689: Creation complete after 0s [id=665778] onelogin_apps_rules.rule_665688: Modifications complete after 1s [id=665688] Apply complete! Resources: 1 added, 1 changed, 1 destroyed.
- OneLoginへ管理者としてログインし、Activityタブ > Events にてTerraform経由でルールが変更されたログやコネクタの Rulesタブ にてルールの変更を確認します
- More Actions > Reapply entitlement mappings を選択し、変更したルールを対象ユーザーに適用します
リソースファイルの変更をOneLoginに反映する手順は以上です。