Upgrade to Pro — share decks privately, control downloads, hide ads and more …

🧑‍🚀 tfstate の分割パターンとディレクトリ構成への適用

🧑‍🚀 tfstate の分割パターンとディレクトリ構成への適用

『Terraform活用大全 - IaCの今』の登壇資料です

・Terraformのtfstateの分割パターン
・tfstate分割をリポジトリやリモートバックエンドのディレクトリ構成への適用する方法

を紹介しました

スライドでは少ししか分割パターンを紹介できませんでしたので、ぜひ元記事 (tfstateファイルの分割パターンとディレクトリ構成への適用) もご参照ください👍🏻

More Decks by 長谷川広樹

Other Decks in Programming

Transcript

  1. マイクロサービスアーキのインフラ領域が仕事 ・マイクロサービスアーキを支えるインフラ技術 ・ドメイン駆動設計 俺です 社内で色々ふざけ過ぎてるので、そろそろ怒られるかもー ・サービスメッシュ (Istio ←推し❤) ・IaC (Kubernetes,

    Helm, Terraform) ・CICD (GitLab CI, ArgoCD) ・監視 (Prometheus, Fluentd, Kiali, OpenTelemetry入門中) ・クラウドインフラ (AWS, ちょいGoogle Cloud) マイクロサービスアーキ関連の技術が好き 虫捕りついでに 虫食ってた話 する?
  2. 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 … }
  3. tfstate 分割をリポジトリのディレクトリ構成にも適用する 🐱 repository/ ├── 📂 foo/ # tfstate 分割に合わせてディレクトリを分割

    (リポジトリでもよい) │ ├── backend.tf # バックエンドにある分割された foo-tfstate を指定 │ … │ └── 📂 bar/ ├── backend.tf # バックエンドにある分割された bar-tfstate を指定 … tfstate 分割に一致するように、リポジトリのディレクトリを分割する (異なるリポジトリとして分割してもよい) “なんでもあり” になりがちな、リポジトリのディレクトリ構成を 設計しやすくなっちゃう🎉
  4. 適切なパターンを選んで、おれは target をやめるぞッ! (俺が観測した) tfstate 分割パターン おすすめ 今回紹介するもの プロバイダー別 ★★★

    ✅ 実行環境別 ★★★ ✅ 運用チームの責務範囲別 ★★ ✅ (持ち時間の関係でスライドのみ) プロダクトのサブコンポーネント別 ★★ 同じテナント内のプロダクト別 AWSリソースの種類グループ別 AWSリソースの状態の変更頻度グループ別 複数の分割パターンを組み合わせる ★ (組み合わせ方による)
  5. “プロバイダー別” “実行環境別” を組み合わせるッ! 実行環境 プロバイダー ・Tes環境 (検証環境) ・Stg環境 (ユーザー受け入れ環境) ・Prd環境

    (本番環境) ・主要プロバイダー (例:AWS) ・アプリ/インフラ監視プロバイダー (例:Datadog) ・ジョブ監視プロバイダー (例:Healthchecks) ・インシデント管理プロバイダー (例:PagerDuty) 各プロバイダーの管理者は target なしで 各実行環境の tfstate を操作できる
  6. tfstate 分割をリポジトリのディレクトリ構成にも適用する 🐱 aws-repository/ # プロバイダーごとにリポジトリとして分割 ├── output.tf ├── provider.tf

    ├── remote_state.tf # terraform_remote_state を使用 ├── 📂 tes/ # 実行環境ごとにディレクトリを分割 │ ├── backend.tfvars # バックエンドにある分割された tfstate を指定 │ … │ ├── 📂 stg/ # Stg環境 └── 📂 prd/ # Prd環境 プロバイダー tfstate 分割に一致するように 異なる “リポジトリ” として分割 実行環境 tfstate 分割に一致するように “ディレクトリ” を分割 例えば、AWSリソースの状態のみを管理するリポジトリの場合…
  7. tfstate 分割をバックエンドのディレクトリ構成にも適用する プロバイダー tfstate 分割に一致するように “ディレクトリ” を分割 実行環境 tfstate 分割に一致するように

    異なる “バックエンド” として分割 🪣 tes-bucket/ # 実行環境ごとにバックエンドとして分割 ├── 📂 aws/ # プロバイダーごとにディレクトリを分割 │ └── terraform.tfstate # Tes環境のAWSリソースの状態を持つ tfstate │ ├── 📂 datadog/ ├── 📂 healthchecks/ └── 📂 pagerduty/ 例えば、Tes環境用のみを管理するバックエンドの場合…
  8. “プロバイダー別” “実行環境別” “運用チーム責務範囲別” を組み合わせるッ! 実行環境 (例:Tes環境, Stg環境, Prd環境) プロバイダー (例:AWS)

    各運用チームのメンバーは target なしで 各実行環境の状態を操作できる 運用チーム ・フロントエンド (CloudFront, S3, ...) ・SRE (EC2, ECS, EKS, ...) ・バックエンド (API Gateway, ElastiCache, ...)
  9. 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リソースの状態のみを管理するリポジトリの場合... プロバイダー リポジトリを分割
  10. tfstate 分割をバックエンドのディレクトリ構成にも適用する 🪣 tes-bucket/ ├── 📂 frontend-team ├── 📂 sre-team

    │ └── terraform.tfstate # sreチームの状態を持つ │ └── 📂 backend-team 例えば、Tes環境のAWSリソースのみを管理するバックエンドの場合... 運用チーム ディレクトリを分割 実行環境 バックエンドとして分割 プロバイダー ディレクトリを分割