🧑🚀 tfstate の分割パターンとディレクトリ構成への適用
by
長谷川 広樹
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
2023/10/25 Terraform活用大全 - IaCの今。 株式会社スリーシェイク 長谷川広樹 @Hiroki_IT github.com/hiroki-it hiroki-hasegawa.hatenablog.jp はてな tfstate 分割パターン と ディレクトリ構成への適用
Slide 2
Slide 2 text
マイクロサービスアーキのインフラ領域が仕事 ・マイクロサービスアーキを支えるインフラ技術 ・ドメイン駆動設計 俺です 社内で色々ふざけ過ぎてるので、そろそろ怒られるかもー ・サービスメッシュ (Istio ←推し❤) ・IaC (Kubernetes, Helm, Terraform) ・CICD (GitLab CI, ArgoCD) ・監視 (Prometheus, Fluentd, Kiali, OpenTelemetry入門中) ・クラウドインフラ (AWS, ちょいGoogle Cloud) マイクロサービスアーキ関連の技術が好き 虫捕りついでに 虫食ってた話 する?
Slide 3
Slide 3 text
発表の元記事 https://hiroki-hasegawa.hatenablog.jp/entry/2023/07/05/001756 解説できなかった tfstate 分割パターン については元記事を見てね 🔎 (本発表の参考リンクも記事中にあるよ)
Slide 4
Slide 4 text
毎回 target するの、やっぱつれぇわ… Terraformの作業者が多いと tfstate の操作が頻繁に衝突する その都度 target を強いられる😡
Slide 5
Slide 5 text
tfstate 分割はリソースの暗黙的な target になる tfstate を適切に分割する target がいらなくなって最高になる
Slide 6
Slide 6 text
相互に依存度の低いリソースを異なる tfstate で管理する 相互に参照する設定値が少ないリソース同士は リソース間の依存度が低いと言える これらのリソースは異なる tfstate で管理できる 例えば foo-tfstate 上のリソースが bar-tfstate 上のリソース値 1個だけを参照
Slide 7
Slide 7 text
terraform_remote_state で依存関係を実装する foo-tfstate 上のリソース が bar-tfstate 上のAWS VPCを参照する場合 依存方向は foo-tfstate → bar-tfstate data "terraform_remote_state" "bar" { backend= "s3" config = { bucket = "tfstate" # barリソースを管理する bar-tfstate を指定 key = "bar/terraform.tfstate" region = "ap-northeast-1" } } resource "example" "foo" { # fooリソースは、bar-tfstate 上のAWS VPCに依存 vpc_id = data.terraform_remote_state.bar.outputs.bar_vpc_id … }
Slide 8
Slide 8 text
tfstate 分割をリポジトリのディレクトリ構成にも適用する 🐱 repository/ ├── 📂 foo/ # tfstate 分割に合わせてディレクトリを分割 (リポジトリでもよい) │ ├── backend.tf # バックエンドにある分割された foo-tfstate を指定 │ … │ └── 📂 bar/ ├── backend.tf # バックエンドにある分割された bar-tfstate を指定 … tfstate 分割に一致するように、リポジトリのディレクトリを分割する (異なるリポジトリとして分割してもよい) “なんでもあり” になりがちな、リポジトリのディレクトリ構成を 設計しやすくなっちゃう🎉
Slide 9
Slide 9 text
tfstate 分割をバックエンドのディレクトリ構成にも適用する tfstate 分割に一致するようにバックエンドのディレクトリを分割する (異なるバックエンドとして分割してもよい) “なんでもあり” になりがちな、バックエンドのディレクトリ構成を 設計しやすくなっちゃう🎉 🪣 bucket/ ├── 📂 foo/ # tfstate 分割に合わせてディレクトリを分割 (バックエンドでもよい) │ └── terraform.tfstate # foo-tfstate │ └── 📂 bar/ └── terraform.tfstate # bar-tfstate
Slide 10
Slide 10 text
適切なパターンを選んで、おれは target をやめるぞッ! (俺が観測した) tfstate 分割パターン おすすめ 今回紹介するもの プロバイダー別 ★★★ ✅ 実行環境別 ★★★ ✅ 運用チームの責務範囲別 ★★ ✅ (持ち時間の関係でスライドのみ) プロダクトのサブコンポーネント別 ★★ 同じテナント内のプロダクト別 AWSリソースの種類グループ別 AWSリソースの状態の変更頻度グループ別 複数の分割パターンを組み合わせる ★ (組み合わせ方による)
Slide 11
Slide 11 text
各プロバイダーのリソースを暗黙的に target する 依存度の低いプロバイダーのリソースを異なる tfstate で管理する (例:AWS, Datadog, Healthchecks, PagerDuty, ...) 各プロバイダーの管理者は target なしでtfstateを操作できる
Slide 12
Slide 12 text
各実行環境のリソースを暗黙的に target する 各実行環境のリソースを異なる tfstate で管理する (例:Dev, Tes, Stg, ...) 各実行環境の管理者は target なしで tfstate を操作できる
Slide 13
Slide 13 text
“プロバイダー別” “実行環境別” を組み合わせるッ! 実行環境 プロバイダー ・Tes環境 (検証環境) ・Stg環境 (ユーザー受け入れ環境) ・Prd環境 (本番環境) ・主要プロバイダー (例:AWS) ・アプリ/インフラ監視プロバイダー (例:Datadog) ・ジョブ監視プロバイダー (例:Healthchecks) ・インシデント管理プロバイダー (例:PagerDuty) 各プロバイダーの管理者は target なしで 各実行環境の tfstate を操作できる
Slide 14
Slide 14 text
tfstate 分割をリポジトリのディレクトリ構成にも適用する 🐱 aws-repository/ # プロバイダーごとにリポジトリとして分割 ├── output.tf ├── provider.tf ├── remote_state.tf # terraform_remote_state を使用 ├── 📂 tes/ # 実行環境ごとにディレクトリを分割 │ ├── backend.tfvars # バックエンドにある分割された tfstate を指定 │ … │ ├── 📂 stg/ # Stg環境 └── 📂 prd/ # Prd環境 プロバイダー tfstate 分割に一致するように 異なる “リポジトリ” として分割 実行環境 tfstate 分割に一致するように “ディレクトリ” を分割 例えば、AWSリソースの状態のみを管理するリポジトリの場合…
Slide 15
Slide 15 text
tfstate 分割をバックエンドのディレクトリ構成にも適用する プロバイダー tfstate 分割に一致するように “ディレクトリ” を分割 実行環境 tfstate 分割に一致するように 異なる “バックエンド” として分割 🪣 tes-bucket/ # 実行環境ごとにバックエンドとして分割 ├── 📂 aws/ # プロバイダーごとにディレクトリを分割 │ └── terraform.tfstate # Tes環境のAWSリソースの状態を持つ tfstate │ ├── 📂 datadog/ ├── 📂 healthchecks/ └── 📂 pagerduty/ 例えば、Tes環境用のみを管理するバックエンドの場合…
Slide 16
Slide 16 text
操作が衝突しないなら tfstate 分割はいらない tfstate の操作がほとんど衝突しない開発人数 メリットが少ないので tfstate 分割は不要
Slide 17
Slide 17 text
(広告) スリーシェイクで働こう! 推し❤
Slide 18
Slide 18 text
運用チームの責務範囲別は 持ち時間の関係で説明できないため 以降、スライドだけ用意しました
Slide 19
Slide 19 text
運用チームの責務範囲内のリソースを暗黙的にtargetする 各運用チーム責務範囲内のリソースを異なる tfstate で管理する 各運用チームは target なしで操作できる
Slide 20
Slide 20 text
“プロバイダー別” “実行環境別” “運用チーム責務範囲別” を組み合わせるッ! 実行環境 (例:Tes環境, Stg環境, Prd環境) プロバイダー (例:AWS) 各運用チームのメンバーは target なしで 各実行環境の状態を操作できる 運用チーム ・フロントエンド (CloudFront, S3, ...) ・SRE (EC2, ECS, EKS, ...) ・バックエンド (API Gateway, ElastiCache, ...)
Slide 21
Slide 21 text
tfstate 分割をリポジトリのディレクトリ構成にも適用する 🐱 aws-sre-team-repository/ # プロバイダーと運用チームごとにリポジトリとして分割 ├── provider.tf ├── output.tf ├── remote_state.tf # terraform_remote_state を使用 ├── ec2.tf / ecs.tf / eks.tf / … ├── 📂 tes # 実行環境ごとにディレクトリを分割 │ ├── backend.tfvars # バックエンドにある分割された tfstate を指定 │ … │ ├── 📂 stg # Stg環境 └── 📂 prd # Prd環境 運用チーム リポジトリを分割 実行環境 バックエンドとして分割 例えば、SREチーム管轄のAWSリソースの状態のみを管理するリポジトリの場合... プロバイダー リポジトリを分割
Slide 22
Slide 22 text
tfstate 分割をバックエンドのディレクトリ構成にも適用する 🪣 tes-bucket/ ├── 📂 frontend-team ├── 📂 sre-team │ └── terraform.tfstate # sreチームの状態を持つ │ └── 📂 backend-team 例えば、Tes環境のAWSリソースのみを管理するバックエンドの場合... 運用チーム ディレクトリを分割 実行環境 バックエンドとして分割 プロバイダー ディレクトリを分割