【Terraform】GitHub Providerでリポジトリを管理する【自己紹介記事】
2024-04-04
azblob://2024/04/04/eyecatch/2024-04-04-terraform-github-provider-000.jpg

自己紹介

2024年入社の中村と申します。

はじめての投稿ということで、簡単な自己紹介をしたいと思います。

これまでに何をやってきたのか

専門学校出身ということで、これまでにTypeScript、Go、RustやFlutter Dartなどプログラミングを中心に行ってきました。

資格試験にも力を入れており、IPAの資格やベンダー資格も取得してきました。

2年ほど前からはネットワーク・クラウドの領域にも手を伸ばしています。最近は特にこの領域に力を入れており、自宅サーバー構築などを行っています。

今回はその際に学んだTerraformというツールに関しての記事になります。

今回書く内容について

私は個人用GitHubアカウントをTerraformで管理しています。

これにより、例えば技術検証用のリポジトリを同じ設定や命名で量産することができます。具体的には、xxx-exampleというリポジトリを量産しています。

今回の記事ではTerraformについてと、リポジトリをコードで管理する方法を紹介します。

Terraformとは

Terraformは、クラウドをプロビジョニングし、管理することができるIaCツールです。

インフラストラクチャをコードで管理するということで、設定の再利用がし易い、バージョン管理ができる。などのメリットがあります。

Terraformの詳細な情報は公式ドキュメントを確認してください。

Ansibleとの違い

Terraformとよく比較されるツールとして、Ansibleがあります。

AnsibleはPCのセットアップなど、OS層やミドルウェア層の管理を得意としたツールです。一方、Terraformはインフラ層の管理を得意としたツールと言われています。

どちらが良くて、どちらが悪いという話ではなく、対象領域に応じて適切に使い分けることが大切だとされています。

なぜGitHub Providerなのか

Terraformでは大量のプロバイダが公開されています。

2024年4月4日現在、公式ドキュメントから確認できるだけでも約4000ものプロバイダが公開されています。

AWSやAzureのプロバイダも提供されているなか、なぜGitHub Providerを選定したのかといいますと、GitHubが基本無料で使えるためです。少しミスしても大きな問題にはならないため、お試しに最適だと考えました。

GitHub Providerの詳細はこちらのドキュメントから確認できます。

環境構築

Terraformの実行環境です。

  • OS: Arch Linux
  • Terraform: terraform 1.7.5-1

なお、今回の記事ではGitHub CLIで認証していることを前提としています。 
その他の認証方法を使用する場合は、こちらを参考にコードを編集してください。

Style Guideについて

TerraformによるGitHub管理を行った時期は、Style Guideの存在を知る前だったため、Google Cloudのベストプラクティスを参考にしたコードになっています。 
注意してください。

リポジトリモジュールの作成

リポジトリに関する設定は、個人用アカウントだけではなくOrganization(ほかの環境)でも使いまわすので、モジュールとして抽出します。

モジュールは「./modules/<module-name>」に作成します。今回はリポジトリモジュールを作成するため、「./modules/repository」にモジュールを作成します。

# ./modules/repository/main.tf
terraform {
  required_providers {
    github = {
      source  = "integrations/github"
      version = "~> 5.0"
    }
  }
}
resource "github_repository" "this" {
  name        = var.name
  description = var.description
  visibility  = var.visibility
  is_template = var.is_template
  ## Features
  has_issues = true
  ## Pull Requests
  allow_rebase_merge = false
  allow_update_branch = true
  delete_branch_on_merge = true
  ## Danger Zone
  archived = var.archived
}
# ./modules/repository/outputs.tf
output "repository" {
  value = github_repository.this
}
# ./modules/repository/variables.tf
variable "name" {}
variable "description" {}
variable "visibility" {}
variable "is_template" {
  default = false
}
variable "archived" {
  default = false
}

Terraformの実行

リポジトリモジュールの準備ができたので、実行の準備をします。

Terraformではdev, staging, prodのように環境分けを行うことが多いようですが、今回はGitHubなのでアカウントやOrganization単位で作成します。

環境設定は「./environments/<environment-name>」に作成します。ここでは例として、「./environments/nakamuraxxx」ディレクトリに設定を記述します。

# ./environments/nakamuraxxx/main.tf
terraform {
  required_providers {
    github = {
      source  = "integrations/github"
      version = "~> 5.0"
    }
  }
}

provider "github" {
  # Authenticating with the GitHub provider using GitHub CLI.
  # See https://registry.terraform.io/providers/integrations/github/latest/docs#github-cli
}

module "examples" {
  source = "../../modules/repository"
  for_each = local.examples
  name = "${each.key}-example"
  description = each.value.description
  visibility = each.value.visibility
  archived = each.value.archived
}

locals {
  examples = {
    "keycloak": {
      "description": "Example repository for Keycloak",
      "visibility": "public",
      "archived": null,
    },
    "echo-prometheus-grafana": {
      "description": "Example repository for Echo, Prometheus, and Grafana",
      "visibility": "public",
      "archived": true,
    }
  }
}

準備ができたので、Terraformを実行します。

$ cd ./environments/nakamuraxxx
$ terraform init
$ terraform plan
$ terraform apply

「terraform apply」コマンドを実行後、GitHubのリポジトリ一覧を確認してみると、keycloak-exampleとecho-gprometheus-grafana-exampleというリポジトリが作成されます。

さらにその作成されたリポジトリを確認してみると、モジュールを作成した際の設定が反映されているはずです。

まとめ

今回の記事では、自己紹介とGitHubのリソースをTerraformで管理する方法をまとめました。