0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PagerDutyAdvent Calendar 2024

Day 14

TerraformでPagerDuty設定入門 その2 - ユーザーとTeamを設定

Posted at

PagerDutyの設定をTerraformでやってみる

PagerDuty Advent Calendarの14日目! 今回は実際にPagerDutyの設定をTerraformで行ってみます。

なにはともあれTerraform Registryをみる

PagerDutyをTerraformで設定したい場合、まず見るべきサイトがTerraform Registryです。

Terraform Registryは、Terraform Providerが管理されている場所であり、ドキュメント置き場でもあります。HashiCorpが提供するオフィシャルProviderから、パートナーが提供するPartner Provider、そしてコミュニティが提供するCommunity Providerまで、Terraform Providerの9割9分はここに集まります。

PagerDuty ProviderはPartner Providerの扱いです。開発はPagerDutyが中心になって行っています。ライセンスはMozilla Public License 2.0のOSSです。

正直なところ、自分のこの記事を読まなくとも、Terraform RegistryにあるDocsを読めば大体分かります

といいつつ、それではさすがに投げっぱなしがすぎるので、今回はよく使うリソースについて解説をしていきます。

ユーザー

PagerDuty上のユーザーを作成する場合は、 pagerduty_user リソースを作成します。

resource "pagerduty_user" "jacopen" {
  name  = "Kazuto Kusama"
  email = "jacopen@example.com"
  color = "green"
  role  = "admin"
  time_zone = "Asia/Tokyo"
}

nameemail は必須項目です。他はオプションです。

color は設定したことない人も多いかと思いますが、スケジュール上に表示される際の色を指定できます。
UI上だとUser SettingsのSchedule Colorとして表示されているものです。
CleanShot 2024-12-15 at 23.00.59.png

roleはそのユーザーに割り振られるロールを指定します。ただ、ここで指定する値はAPIで指定する値である必要があります。たとえば、UI上の Global Adminは、ここでは adminと指定します。 Full Stakeholderの場合は read_only_user となります。
このあたりのUIとAPIの値の対応表はこちらをご覧ください

time_zoneではそのユーザーのタイムゾーンを指定できます。

チーム

チームを作成する場合は、 pagerduty_team リソースを作成します。

resource "pagerduty_team" "platform" {
  name        = "Platform Team"
  description = "Platform Team"
}

チームにユーザーを追加

チームにユーザーを割り当てたい場合、 pagerduty_team_membership リソースを作成します。

たとえば、先ほど作成した jacopen ユーザーを platform チームに割り当てたい場合、次のようにします。

resource "pagerduty_team_membership" "platform_jacopen" {
  user_id = pagerduty_user.jacopen.id
  team_id = pagerduty_team.platform.id
  role    = "manager"
}

個別に宣言するのではなくまとめて設定したい場合

User, Team, Team membershipを淡々と設定していっても良いのですが、組み合わせが増えるとちょっとコード量が増えすぎて面倒くさくなるかもしれません。

その場合はTerraformコードのfor_eachを使ってループさせることで記述量を減らせます。

locals {
  users = [
    { name = "yusuke", email = "yusuke@example.com", team = ["infra", "k8s"] },
    { name = "kazuki", email = "kazuki@example.com", team = ["infra", "k8s"] },
  ]
  teams = [
    { name = "infra", description = "Infra Team" },
    { name = "k8s", description = "Kubernetes Team" },
  ]

  team_memberships = flatten([
    for user in local.users : [
      for team in user.team : {
        user_name = user.name
        team_name = team
      }
    ]
  ])
}

resource "pagerduty_user" "users" {
  for_each = { for u in local.users : u.name => u }
  name  = each.value.name
  email = each.value.email
}

resource "pagerduty_team" "teams" {
  for_each = { for t in local.teams : t.name => t }
  name        = each.value.name
  description = each.value.description
}

resource "pagerduty_team_membership" "team_membership" {
  for_each = {
    for m in local.team_memberships : "${m.user_name}-${m.team_name}" => m
  }
  user_id = pagerduty_user.users[each.value.user_name].id
  team_id = pagerduty_team.teams[each.value.team_name].id
  role    = "manager"
}

localsの中でusersとteamsを設定できるようにしています。各userはteamを設定出来るようにしてあります。
こうすることで、ユーザーやチームを追加した場合でもlocalsの中に項目を追加するだけで、個別にリソースを宣言しなくても良くなります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?