🤝

GitHubのメンバーとチームをTerraformで管理する

2023/12/06に公開

この記事は 検索エンジンプロダクトを一緒に開発してた同窓会 Advent Calendar 2023 の5日目の記事です。
昨日は erikaadno さんの フロントにもドメインモデルを使おう! でした。

はじめに

GitHubのユーザーやチームが増えてくるにつれて、Web上での管理に以下のような課題が発生します。

  • 誰がどこに属しているかの一覧が見辛い。
  • 登録・更新・削除の証跡が取れない。
  • GitHubの呼称と本名のマッピングがわからない。

そこで、ユーザーやチームをTerraform管理をすることで解決を試みてみました。

Terraformで管理する

GitHub Providerを使用する

GitHub公式のTerraform Providerである GitHub Provider を使用します。

認証する

公式 を参考に認証設定をします。

今回は安全に認証できそうなGitHub App Installationを使用しました。
GitHub Appを作成し、以下のように環境変数に必要な値を設定することで認証できます。

export GITHUB_APP_ID=${MY_GITHUB_APP_ID}
export GITHUB_APP_INSTALLATION_ID=${MY_GITHUB_APP_INSTALLATION_ID}
export GITHUB_APP_PEM_FILE=${MY_GITHUB_APP_PEM_FILE}
provider "github" {
  owner = "sample-org"
  app_auth {} # When using `GITHUB_APP_XXX` environment variables
}

ユーザーを管理する

ユーザーを組織に追加するには github_membership リソースを使用します。

ここでusernameはGitHubのユーザー名ですが、リソース名に本名を設定することでGitHubのユーザー名と本名のマッピングが行なえます。

resource "github_membership" "user1" {
  username = "github_user1"
  role     = "admin"
}
resource "github_membership" "user2" {
  username = "github_user2"
  role     = "member"
}

テームを管理する

チームを作成するには github_team リソースを使用します。
また、チームにメンバーを追加するには github_team_membership リソースを使用します。

JSONなどで柔軟に定義することもできますが、型安全を優先して追加したいメンバーをlocalsで配列に入れて、for_eachでteamに追加するようにしました。

resource "github_team" "sample_team" {
  name        = "sample_team"
  privacy     = "closed"
}
resource "github_team_membership" "sample_team" {
  for_each = { for i in local.sample_team_members : i.username => i }
  team_id  = github_team.sample_team.id
  username = each.value.username
  role     = each.value.role
}
locals {
  sample_team_members = [
    { username = github_membership.user1.username, role = "maintainer" },
    { username = github_membership.user2.username, role = "member" },
  ]
}

最後に

Terraformを利用してGitHubのユーザーとチームを管理できました。
GitHubの呼称と本名のマッピングを別で管理する必要がなくなり気に入っています。

参考文献

Discussion