🏗️

意外と便利!こんなところにもTerraform

はじめに

フェズアドベントカレンダー 22日目の記事となります。
基盤開発部でSREをしている三井です
フェズではプロダクトやデータ基盤のIaCにTerraformを利用しています
個人的には前職でもTerraformを利用していたのですが、基本的にはプロダクトの環境構築用途で利用する事がほとんどでした
フェズに入ってアカウント管理などもミッションとする中で、意外と便利にTerraformが利用できるシーンがいくつかあったので
今回はそれを実際にコードと合わせてご紹介しようと思います

Why Terraform ?

アカウント管理は全ての企業で大切ですが、状況によって要求されるレベルが異なる事もあると思っています
厳密な監査等に対応するために、台帳などで管理が必要な場合もあります
フェズではまだその段階に至っていませんが、とはいえ全く管理が行き届いておらず現状把握が困難だったり履歴が追えないのはどの企業でも困ります
そこで、コードという形で履歴を残す事ができるTerraformを使ってみました
※ 作成されたtfstateから台帳を自動的に作成する。ような事もできるとは思いますが、現時点ではそこまでやっていません
※ tfstate = Terraformが管理しているリソースの現在の状態を表すファイル

Google Group

フェズではGoogle Workspaceを使っているので、メンバーのグルーピングにはGoogle Groupが利用できます
Google Cloud におけるアカウント管理は基本的にGoogle Groupに対して権限を付与しており、そのGroupや権限は基盤開発部の管理となります
Google Groupの作成&メンバー管理、そしてGoogle CloudのProjectへの権限付与は以下のようなコードで実現しています

利用した Resource

ディレクトリ&ファイル

実際のコード

  • group.yaml
    • HCLでも書けますが、どのグループに誰が属しているのか見やすくするためにYamlで書いて別ファイルに切り出しています
    • メンバーの追加/削除をするだけなら、このファイルを編集してApplyすれば完了です
  • locals.tf
  • group.tf
    • 作成するグループの数だけmoduleを呼び出しているだけ
  • modules/group/variables.tf
  • modules/group/main.tf

Github Account

フェズはコード管理にGithubを使っていて、Githubアカウントとリポジトリも基盤開発部の管理となります
こちらもTerraformにproviderがあったので導入してみました
※ 紹介するコード以外にもTeamの作成や各リポジトリへの権限追加などもIaCしているのですが、コードが長くなってしまうので割愛しています

利用したResource

ディレクトリ&ファイル

実際のコード

  • member.yaml
    • HCLでも書けますが、どのメンバーがどのロールを持っているか見やすくするためにYamlで書いて別ファイルに切り出しています
  • repository.yaml
    • HCLでも書けますが、リポジトリの一覧を見やすくするためにYamlで書いて別ファイルに切り出しています
  • locals.tf
  • membership.tf
  • repository.tf

工夫したポイント

慣れたTerraformerじゃなくても直感的にアカウントの状況が伝わりやすく、修正箇所がなるべく少なくなるように書いてみました
 
というのも、この記事を書いている段階では基本的にこのあたりのコードは私とごく一部のメンバーが管理しています
各所からの申請ベースでアカウントの追加/削除に対してPullRequestを我々が作成する、という運用になっています
ですが、組織の規模が拡大した時には、、、
  • 部署やプロダクト毎に管理者を立ててもらって、その管理者からユーザ追加のPullRequestを出してもらう
  • 横断部門やコーポレートITなどの最終的に責任を持つ部門がPullRequestのレビューをする
というような可能性も無くはないと思います
(その段階に組織が成長した時に、ツールとしてTerraformでいいのか?という議論は勿論ありますが・・・)

まとめ

コードが多めの記事になってしまいましたが、Terraformでアカウント管理もできるよ
というご紹介でした
勿論、プロダクトやデータ基盤の環境構築などにもTerraformはガッツリ利用しています
機会があればそのあたりもまたご紹介できればと思います