🙆♀️
TerraformからOktaのグループルールでグループの親子関係を管理する
これは株式会社SUPER STUDIO Advent Calendar 2022の2日目の記事です。
ごきげんよう🌸
株式会社SUPER STUDIOでコーポレートエンジニアを担当している@bboobbaaです!
弊社ではIdPはOktaを利用しております。
部署や役職、プロジェクトは全てグループ化していて、Oktaのグループをいじればプロビジョニングでドライブやドキュメントの権限が自動化されるように作り込んだのですが、とても膨大なグループ数になってしまいました。
そこで、Terraformを採用しソースで管理するようにしました。
親子関係のあるグループが多く、グループルールを設定をしたときに試行錯誤したはなしです。
親グループと子グループみたいな関係を作りたい
okta_groupを設定します。
resource "okta_group" "group_test_parent" {
name = "test_parent"
description = ""
}
resource "okta_group" "group_test_child_1" {
name = "test_child_1"
description = ""
}
resource "okta_group" "group_test_child_2" {
name = "test_child_2"
description = ""
}
expression_value
について調査をする
okta_group_ruleを設定します。
ここでexpression_value
???となりました。
グループを入れ子にする設定はどうすればいいんだろう?
この設定をTerraformに書きたい。
答えはOkta APIにありました。
GET /api/v1/groups/rules
を実行したところ、Stringで複数のグループIDを保持しておりました。
子グループに入ったら、親グループに自動で所属する
expression_value
はAPIからコピペでOKです。
resource "okta_group_rule" "group_rule_test" {
name = "rule_test"
status = "ACTIVE"
group_assignments = [
okta_group.group_test_parent.id
]
expression_type = "urn:okta:expression:1.0"
expression_value = "isMemberOfAnyGroup(\"${okta_group.group_test_child_1.id}\",\"${okta_group.group_test_child_2.id}\")",
}
もっときれいに書けるよね
子グループの数多くなったらキツイよねということで、join()
を使って書きましょうと、先輩のマイケルさんからレビューをいただきました。
resource "okta_group_rule" "group_rule_test" {
name = "rule_test"
status = "ACTIVE"
group_assignments = [
okta_group.group_test_parent.id
]
expression_type = "urn:okta:expression:1.0"
expression_value = join("", [
"isMemberOfAnyGroup(",
"\"${okta_group.group_test_child_1.id}\",",
"\"${okta_group.group_test_child_2.id}\")"
])
}
SUCCESS!
Discussion