⛩️

TerraformでGitHubを構成管理する

2024/06/04に公開

TerraformでGitHubを構成管理する

こんにちは、株式会社シャペロンのskです。
シャペロンではGitHubを使用していますが、運用面での課題が出てきたので、改善策としてTerraformを導入してみました。

まだ一部の構成管理を始めた段階ですが、GitHubを運用する上でTerraformを使用すると何が嬉しいのかをご紹介したいと思います。

Terraformとは

IaC(Infrastructure as Code)を実現するツールの1つで、サーバー・ネットワークなどのインフラの構成をHashicorp Configuration Languageを用いてコード化して管理します。
Terraformは、Providerというプラグインを用いてAWS, GCP, Azureをはじめとする様々なクラウドサービスやSaaS、その他のAPIとやり取りを行うことが出来ます。

GitHub Organizationの管理で直面した課題

シャペロンではGitHubの管理を数名のメンバーが担当し、Slackで依頼して作業を行ってもらっていましたが以下のような課題がありました。

  • Slack上の依頼としてのみメンバーの追加・削除、権限の付与の履歴が残るだけで変更の意図を理解することが難しい
  • GitHubのユーザー名とメンバーの本名がマッピングされていない
  • GitHubの設定が属人化し、管理メンバーに負担が偏っていた

組織規模が大きくなるにつれてこれらが大きな問題となりそうだと考え、以下を期待してTerraformでの構成管理を始めることとなりました。

  • 構成管理をコードとして記述できるのでGitHubの管理をブラウザ上で行う必要がなくなる
    • 管理フローがGitHubのレイアウト変更の影響を受けない
    • 自動化できてポチポチ業から解放される
    • コード内にユーザー名と本名のマッピングを記述できる
  • GitHubの管理をプルリクエストベースで行うことができる
    • プルリクエストとして履歴に残るため、変更点の意図を参照しやすくなる
    • レビューを挟むので属人性が低下する

TerraformでGitHubメンバーを定義する

GitHub Providerを使用します。

シャペロンではこのProviderでメンバーの管理を行っています。
以下のような記述でGitHubのメンバーとその権限を定義しています。
github_membershipリソースのIDに本名を使用しているためユーザー名と本名のマッピングもできています。

resource "github_membership" "taro_yamada" {
  username = "hogehoge123"
  role     = "admin"
}

resource "github_membership" "hanako_tanaka" {
  username = "piyopiyo"
  role     = "member"
}

Terraformの実行時にはGitHubの認証情報が必要になります。
公式ドキュメントでは3つのやり方が紹介されています。
ローカルで実行する際には以下のように認証し、GitHub CLIのセッションを作成しておけばTerraformの実行時に認証情報を自動で渡すことができます。
GitHub CLIの導入方法はこちらを参照してください。

gh auth login
# 出力されたとおりに進める

手動管理のものをコード管理に切り替える

このままTerraformを実行してしまうと既に存在するメンバーを新たに招待しようとしてエラーとなってしまいます。
そのため、手動で管理していたものをコード管理するためにImportします。
Terraform 1.5から追加されたimport blockを使用して以下のように記述することで簡単にImportすることができるようになりました。

import {
  id = "org-name:hogehoge123"
  to = github_membership.taro_yamada
}

import {
  id = "org-name:piyopiyo"
  to = github_membership.hanako_tanaka
}

最後に

Terraformを用いてGitHub Organizationを管理することで、これまではGitHub管理者の裁量により手作業で行われてきた業務が可視化され記録が残るようになりました。
現在はGitHubのメンバーのみ管理していますが、将来的にはチームやコラボレーターの管理もTerraformで行いCIでの自動化も実施できればと思っています。

株式会社シャペロン

Discussion