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. 2023/10/25 Terraform活用大全 - IaCの今。
    株式会社スリーシェイク
    長谷川広樹
    @Hiroki_IT
    github.com/hiroki-it
    hiroki-hasegawa.hatenablog.jp
    はてな
    tfstate 分割パターン
    と
    ディレクトリ構成への適用

    View full-size slide

  2. マイクロサービスアーキのインフラ領域が仕事
    ・マイクロサービスアーキを支えるインフラ技術
    ・ドメイン駆動設計
    俺です
    社内で色々ふざけ過ぎてるので、そろそろ怒られるかもー
    ・サービスメッシュ (Istio ←推し❤)
    ・IaC (Kubernetes, Helm, Terraform)
    ・CICD (GitLab CI, ArgoCD)
    ・監視 (Prometheus, Fluentd, Kiali, OpenTelemetry入門中)
    ・クラウドインフラ (AWS, ちょいGoogle Cloud)
    マイクロサービスアーキ関連の技術が好き
    虫捕りついでに
    虫食ってた話
    する?

    View full-size slide

  3. 発表の元記事
    https://hiroki-hasegawa.hatenablog.jp/entry/2023/07/05/001756
    解説できなかった tfstate 分割パターン
    については元記事を見てね 🔎
    (本発表の参考リンクも記事中にあるよ)

    View full-size slide

  4. 毎回 target するの、やっぱつれぇわ…
    Terraformの作業者が多いと tfstate の操作が頻繁に衝突する
    その都度 target を強いられる😡

    View full-size slide

  5. tfstate 分割はリソースの暗黙的な target になる
    tfstate を適切に分割する
    target がいらなくなって最高になる󰜷

    View full-size slide

  6. 相互に依存度の低いリソースを異なる tfstate で管理する
    相互に参照する設定値が少ないリソース同士は
    リソース間の依存度が低いと言える
    これらのリソースは異なる tfstate で管理できる󰢍
    例えば
    foo-tfstate 上のリソースが
    bar-tfstate 上のリソース値
    1個だけを参照

    View full-size slide

  7. 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
    …
    }

    View full-size slide

  8. tfstate 分割をリポジトリのディレクトリ構成にも適用する
    🐱 repository/
    ├── 📂 foo/ # tfstate 分割に合わせてディレクトリを分割 (リポジトリでもよい)
    │ ├── backend.tf # バックエンドにある分割された foo-tfstate を指定
    │ …
    │
    └── 📂 bar/
    ├── backend.tf # バックエンドにある分割された bar-tfstate を指定
    …
    tfstate 分割に一致するように、リポジトリのディレクトリを分割する
    (異なるリポジトリとして分割してもよい)
    “なんでもあり” になりがちな、リポジトリのディレクトリ構成を
    設計しやすくなっちゃう🎉

    View full-size slide

  9. tfstate 分割をバックエンドのディレクトリ構成にも適用する
    tfstate 分割に一致するようにバックエンドのディレクトリを分割する
    (異なるバックエンドとして分割してもよい)
    “なんでもあり” になりがちな、バックエンドのディレクトリ構成を
    設計しやすくなっちゃう🎉
    🪣 bucket/
    ├── 📂 foo/ # tfstate 分割に合わせてディレクトリを分割 (バックエンドでもよい)
    │ └── terraform.tfstate # foo-tfstate
    │
    └── 📂 bar/
    └── terraform.tfstate # bar-tfstate

    View full-size slide

  10. 適切なパターンを選んで、おれは target をやめるぞッ!
    (俺が観測した)
    tfstate 分割パターン おすすめ 今回紹介するもの
    プロバイダー別 ★★★ ✅
    実行環境別 ★★★ ✅
    運用チームの責務範囲別 ★★
    ✅
    (持ち時間の関係でスライドのみ)
    プロダクトのサブコンポーネント別 ★★
    同じテナント内のプロダクト別
    AWSリソースの種類グループ別
    AWSリソースの状態の変更頻度グループ別
    複数の分割パターンを組み合わせる
    ★
    (組み合わせ方による)

    View full-size slide

  11. 各プロバイダーのリソースを暗黙的に target する
    依存度の低いプロバイダーのリソースを異なる tfstate で管理する
    (例:AWS, Datadog, Healthchecks, PagerDuty, ...)
    各プロバイダーの管理者は target なしでtfstateを操作できる󰢍

    View full-size slide

  12. 各実行環境のリソースを暗黙的に target する
    各実行環境のリソースを異なる tfstate で管理する
    (例:Dev, Tes, Stg, ...)
    各実行環境の管理者は target なしで tfstate を操作できる󰢍

    View full-size slide

  13. “プロバイダー別” “実行環境別” を組み合わせるッ!
    実行環境
    プロバイダー
    ・Tes環境 (検証環境)
    ・Stg環境 (ユーザー受け入れ環境)
    ・Prd環境 (本番環境)
    ・主要プロバイダー (例:AWS)
    ・アプリ/インフラ監視プロバイダー (例:Datadog)
    ・ジョブ監視プロバイダー (例:Healthchecks)
    ・インシデント管理プロバイダー (例:PagerDuty)
    各プロバイダーの管理者は
    target なしで
    各実行環境の tfstate を操作できる

    View full-size slide

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

    View full-size slide

  15. tfstate 分割をバックエンドのディレクトリ構成にも適用する
    プロバイダー
    tfstate 分割に一致するように
    “ディレクトリ” を分割
    実行環境
    tfstate 分割に一致するように
    異なる “バックエンド” として分割
    🪣 tes-bucket/ # 実行環境ごとにバックエンドとして分割
    ├── 📂 aws/ # プロバイダーごとにディレクトリを分割
    │ └── terraform.tfstate # Tes環境のAWSリソースの状態を持つ tfstate
    │
    ├── 📂 datadog/
    ├── 📂 healthchecks/
    └── 📂 pagerduty/
    例えば、Tes環境用のみを管理するバックエンドの場合…

    View full-size slide

  16. 操作が衝突しないなら tfstate 分割はいらない
    tfstate の操作がほとんど衝突しない開発人数
    メリットが少ないので tfstate 分割は不要󰢁

    View full-size slide

  17. (広告) スリーシェイクで働こう!
    推し❤

    View full-size slide

  18. 運用チームの責務範囲別は
    持ち時間の関係で説明できないため
    以降、スライドだけ用意しました󰗨

    View full-size slide

  19. 運用チームの責務範囲内のリソースを暗黙的にtargetする
    各運用チーム責務範囲内のリソースを異なる tfstate で管理する
    各運用チームは target なしで操作できる󰢍

    View full-size slide

  20. “プロバイダー別” “実行環境別” “運用チーム責務範囲別” を組み合わせるッ!
    実行環境 (例:Tes環境, Stg環境, Prd環境)
    プロバイダー (例:AWS)
    各運用チームのメンバーは
    target なしで
    各実行環境の状態を操作できる
    運用チーム
    ・フロントエンド (CloudFront, S3, ...)
    ・SRE (EC2, ECS, EKS, ...)
    ・バックエンド (API Gateway, ElastiCache, ...)

    View full-size slide

  21. 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リソースの状態のみを管理するリポジトリの場合...
    プロバイダー
    リポジトリを分割

    View full-size slide

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

    View full-size slide