🙆‍♀️

TerraformからOktaのグループルールでグループの親子関係を管理する

2022/12/02に公開

これは株式会社SUPER STUDIO Advent Calendar 2022の2日目の記事です。
https://adventar.org/calendars/8255

ごきげんよう🌸
株式会社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