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リソースのみを管理するバックエンドの場合... 運用チーム ディレクトリを分割 実行環境 バックエンドとして分割 プロバイダー ディレクトリを分割