最初に 5 ~ 10 分程度お時間を頂いて本日お時間を頂いた経緯などを説明したあと、色々お話を聞かせてもらえたらと思います。
- 如何に Terraform の state を分割するか
- 如何に Terraform によるリソースの管理を SRE から developer に委譲するか
- AWS のリソースを Terraform で管理している
- 様々なサービスのリソースが同じ state, リポジトリで管理されている
- いわゆるモノレポ
- state をサービスドメインによって分割しようとしている(モノレポのまま)
- そもそものモチベーションとして、 terraform によるリソースの管理を出来るだけ SRE から developer に委譲したい
- 現状は SRE に対して依頼がくることがある(Elasticsearch使いたいから用意して etc)
- developer やサービスの数はどんどん増えていく
- Terraform に限ったことではなく、SRE しかできないようなことを上手く developer に委譲できるようにしないと scale しない
- SRE としては丸投げするのではなく、 developer でも出来るような仕組みづくりをしていきたい
- developer としても一々依頼しないでできた方が楽なはず
- 御社で Terraform の運用をどういうふうにしているか
- モノレポ?
- state をどういう風に分割している?
- サービスとチームって必ずしも一対一じゃない
- 適切な粒度とは?
- リポジトリのディレクトリ構成
- Terraform によるリソースの管理は developer に委譲できている?
- 委譲する上でなにか工夫していること
- state の分割以外になにをやっているか(ex. ジェネレータの開発)
- data source と state の output どっち使ってるか
- data source のほうが良さそうだと思っている
- マルチリージョン・マルチクラウドのリポジトリを分けているか、どのようにリリースをしているか
- Terraform Cloud 使っているか、どう思うか
- workspace 使ってるか
- 弊社は使ってない(環境毎にディレクトリ、tfファイルを完全に分けている)
- 複雑になるし、 DRY じゃなくても完全に分けたほうがいいんじゃないかと思ってる(developer に委譲するなら尚更)
- module 使ってるか、どういう粒度で module 化するか
- 国内向けのサービスと海外向けのサービスでリポジトリが分かれている
- 海外向けのリポジトリは割愛 (国内のほうが大きい)
- 3600 commits
- 29 contributors
- .tf 161 ファイル 11479 行
- リソースの数(state list):
- state 数: 3 (環境ごと。 manage, staging, production)
- GitHub フローと Gitフローの中間的な感じ
- ブランチ 3 種類
- master
- feature
- release (リリース先(state)ごとにブランチが分かれている)
master -(checkout)-> feature -(PR)-> master -(PR)-> release
- CircleCI で terraform plan, apply を実行
- release branch にマージされたらリリースされる
- 同じ state を共有しているのでリリースタイミングに気を使わないといけない
- リリースしようとしたら別の PR も混じってるけど、これリリースして大丈夫?
- plan したら関係ない差分出てくることがある(別のサービスの差分)
現状
environments/
manage/
staging/
production/
modules/
現在構想しているもの
shared/ # common resouces such as VPC
network/
production/
terraform.tfvars
vpc.tf
...
staging/
manage/
modules/
...
services/
service-1/
production/
ec2.tf
...
staging/ tfstate
ec2.tf
...
modules/
...
modules/