⚙️

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

2024/12/24に公開

はじめに

こんにちは、23卒でバックエンドエンジニアをしています。@putcho01 です。
普段の業務では新規サービスの開発を行なっています。

みなさんのチームではどのように GitHub のメンバー・権限管理を行なっていますか?
Web上で管理することが多いのではないかと思いますが、以下のような課題に直面することが多いのではないでしょうか?

  • GitHubのユーザー名と本名のマッピングがわからない
  • 誰がどこに属しているかの一覧が見辛い
    • 大規模なOrganizationでは、メンバーやチームの構成を正確に把握するのが難しい
  • 招待や権限付与が適切なものかレビューしづらい
    • 新しいメンバーの招待や、既存メンバーへの権限付与が属人的になりがち

本記事では、Terraformを使用してGitHubのメンバーやチーム、コラボレーターを効率的に管理する方法をご紹介します。

TerraformでのGitHub権限管理

GitHub 公式の Terraform Provider である GitHub Provider を使用することで、以下の項目をコードベースで管理できます。

主なリソース

  1. メンバー管理
  2. チーム管理
  3. チームメンバー管理
  4. コラボレーター管理

Terraformを使うメリット

管理をプルリクエストベースで行える

  • 変更履歴が記録されるため、変更や意図を後から確認することができます
  • レビューを挟むことで属人性が低下し透明性が向上します
  • 手動作業による非効率性が軽減します

例: チームを管理する方法

チームを管理する際は、以下のリソースを活用します。

  1. チームの作成
  2. チームメンバーの追加
    • github_team_membersリソースを活用して、チームにメンバーを追加します。
locals {
  teams = {
    team1 = {
      name        = "Team 1"
      description = "チームの説明"
      members = {
        "member1-username"  = "maintainer"
        "member2-username"  = "member"
      }
      repositories = {
        "repository-1" = "admin"
        "repository-2" = "admin"
      }
    },
  },
}

resource "github_team" "this" {
  for_each = local.teams

  name        = each.value.name
  description = each.value.description
  privacy     = "closed"
}

resource "github_team_members" "this" {
  for_each = local.teams

  team_id = github_team.this[each.key].id
  dynamic "members" {
    for_each = each.value.members
    iterator = member
    content {
      username = member.key
      role     = member.value
    }
  }
}

Terraform の設定を適用するデプロイ作業については、GitHub Actions を利用することで自動化が可能です。これにより、自動で Terraform の適用が実行され、変更を反映できます。

最後に

Terraform を活用して GitHub Organization を管理することで、管理が効率化されます。
組織の拡大に伴い同じような課題意識を持っている方の参考になれば幸いです。
GitHub の権限管理に課題を感じている方は、ぜひ Terraform を導入してみてはいかがでしょうか?

Discussion