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

データ基盤のための_Terraform_Workflow_を_tfaction_で構築しよ...

Shunsuke Suzuki
February 27, 2025
56

 データ基盤のための_Terraform_Workflow_を_tfaction_で構築しよう.pdf

https://forkwell.connpass.com/event/339761/
Data Engineering Study #28 データ基盤のCI/CD
2025-02-27

Shunsuke Suzuki

February 27, 2025
Tweet

Transcript

  1. 自己紹介 (1) Shunsuke Suzuki seli07 (せりな) 2024/08 ~ freee SRE

    2022/07 ~ Mercari Platform Engineer 2021/10 ~ Recruit SRE 2019/10 ~ Quipper SRE 2
  2. 自己紹介 (2) OSS Developer - CLI や GitHub Actions など様々な

    OSS を開発 • aqua • tfcmt • tfaction • github-comment • tfmv • pinact • ghalint • etc 3
  3. Agenda • IaC や CI, Terraform の説明 • Terraform Workflow

    の開発・運用の難しさ • tfaction の概要 • なぜ tfaction なのか • tfaction の機能紹介 7
  4. IaC (Infrastructure as Code) による管理 • コードレビュー可能 • 似たようなインフラを簡単に構築可能 •

    コードを Git のような VCS で管理することで変更履歴を容易に残せる • linter を用いたテストやドキュメントの生成が可能 • CI などによる変更の適用の自動化が可能 • etc 9
  5. Why CI? • 自動化による生産性の向上 • セキュリティやガバナンスの強化 ◦ コードレビューや lint のプロセスの強制

    ◦ ヒューマンエラーのリスクの軽減 ◦ CI のログによる透明性の向上や監査対応 12
  6. ワークフローの拡張が必要になってくる • Monorepo の変更されたディレクトリでだけ CI 実行 • local-path Module が変更されたら依存するディレクトリでも

    CI 実行 • コードのフォーマットを強制(なんなら自動修正) • tflint, trivy, Confest • terraform-docs でドキュメント生成 • plan file 使って apply • Drift 検出 • etc 18
  7. Terraform の Workflow のメンテの難しさ • 様々な機能を自前で実装するのは大変 • CI や Platform

    Engineering に関する専門性が必要 • 人材確保は容易ではない • 他にもやるべきことはあるので中々手が回らない • メンテコストを極力抑えて他のことにリソースを回したい 19
  8. tfaction とは https://github.com/suzuki-shunsuke/tfaction • Terraform Monorepo の高度な workflow を GitHub

    Actions で構築するための Framework (実態は GitHub Action の集合体) • OSS (MIT LICENSE) • 日本国内を中心に様々な企業で導入実績 22
  9. tfaction の特徴 • ワークフロー全体という広い領域をカバーする大きな Framework • trivy や tflint, conftest,

    terraform-docs など周辺ツールのサポート • Drift Detection や コードの自動修正, apply のエラーのハンドリングなど、様々な 機能を提供 • Monorepo を標準でサポート 23
  10. tfaction の基本的な 2 つの workflow 1. PR に対し lint やコードの自動修正、

    terraform plan を実行 2. PR がマージされたら terraform apply を実行 PR をテストし、マージしたらデプロイするというシンプルな GitHub Flow 24
  11. tfaction の基本的な 2 つの job 1. setup: 変更された Root Module

    のリストを取得 2. plan / apply: 変更された directory に対して matrix build で terraform plan / apply を実行 25
  12. tfaction の設定ファイル 設定は基本 GitHub Actions ではなく設定ファイルに記述 1. tfaction-root.yaml : グローバルな設定や

    Root Module 群の設定 2. tfaction.yaml : 各 Root Module の設定。空 {} でも良い 設定を細かく制御したり共通化することが可能 26
  13. tfaction の機能 1. Monorepo のサポート 2. local-path Module の依存関係の検出 3.

    terraform plan / apply の結果の分かりやすい通知 4. Linter とのインテグレーション 5. コードの自動修正 6. Renovate による自動 update 7. plan file を用いた安全な apply 8. apply 後に関連 PR を更新 9. apply 失敗対応のサポート 10. 新しい Root Module の Scaffold 27 11. tfmigrate による State Migration 12. Root Module の削除 13. terraform plan -generate-config-out によるコード生成 14. Drift Detection 15. Module 管理
  14. Terraform の Monorepo とは • 1 つのリポジトリに複数の Terraform Root Module

    があるリポジトリ • ディレクトリ階層の分け方は色々 ◦ 例: サービスや環境毎にディレクトリを分ける • Root Module の数は千差万別 (数個 ~ 1,000 over) • Terraform ではよくあるパターン 29
  15. tfaction の Monorepo のサポート • tfaction は Monorepo を想定 •

    変更された Root Module でのみ CI を実行 ◦ 毎回全 Root Module で CI 実行は無駄 (非現実的) ◦ Root Module の数が増えてもスケールする (CI の時間が伸びない) 32
  16. local-path Module の依存関係の検出 • デフォルトでは local-path Module が更新されても Root Module

    では CI は実行さ れない • 設定で Root Module でも実行されるようにすることができる 35
  17. terraform plan / apply の結果の確認 • CI で terraform plan

    / apply を実行したら結果を確認する必要がある • CI の log を確認するのは面倒・分かりづらい => tfaction では tfcmt で分かりやすく PR にコメント 37
  18. • log 確認不要で楽 • 色付き label • 要約 • 削除警告

    • リソース一覧 • 余計なログの除去 • etc 38
  19. 様々な linter に対応 • tflint • trivy (tfsec) • Conftest

    CI で lint を実行しベストプラクティスへの準拠を強制し、コードの品質を担保 結果を分かりやすく通知 40
  20. 様々な修正の必要性 • terraform fmt によるフォーマット • .terraform.lock.hcl の更新 • terraform-docs

    によるドキュメントの更新 • tflint –fix によるエラーの修正 44
  21. Renovate による自動更新 • Renovate: Dependabot のように dependency を update するツール

    • Terraform Provider や Module などを Renovate で自動更新できる • マージまで自動化すると人間の負担が減って楽 • しかし、自動マージでインフラの変更が勝手に適用されると危険 49
  22. • レビューした plan の結果と違う結果が apply されると危険 • terraform plan で生成した

    plan file を用いて apply を実行すると plan と同じ結果 を apply できて安全 52
  23. plan file とは • terraform plan の -out option で生成されるバイナリファイル

    • plan の結果を保持している • terraform apply 時に plan file を渡すと plan 結果をそのまま apply できる • plan file は state file のバージョン情報を保持しており、 apply 実行時に plan file に保持されたバージョンが古くなっていると apply が失敗する ◦ 古い結果が apply されるのが防がれるので安全 53
  24. • tfaction は plan file を GitHub Actions Artifact で管理することで安全に

    apply を 実行 ◦ plan file が改竄されると任意の結果を apply できて非常に危険 ◦ GitHub Actions Artifact は改竄不可なので安全 54
  25. • 同じ Root Module に対する PR が同時に複数作られることはままある • ある PR

    がマージされた場合、同じ Root Module に対する PR を更新する必要が ある ◦ CI の結果が変わりうるため ◦ terraform plan を再実行し stale になった plan file を再作成するため 56
  26. Follow up PR の自動生成 • apply 失敗時にメンションして通知 • 失敗を修正するための PR

    を自動生成 • 後述する Drift Detection を有効にすると Issue として管理可能 61
  27. 63

  28. 新しい Root Module の Scaffold • Monorepo に新しい Root Module

    を追加する際、一から書くのは大変 • tfaction では workflow を実行してテンプレートを元に生成できる ◦ テンプレートは自分で用意する必要がある ◦ workflow 経由なのでローカル環境に依存しない 65
  29. 66

  30. 67

  31. tfmigrate とは terraform state mv, rm や terraform import による

    State 操作をコードで定義して自動 化するツール 実際に変更を適用する前に terraform plan で差分がないか検証できる Terraform による import, moved, removed block のサポートにより以前より使う機会 は減ったが、複数の State を跨った State 操作をしたい場合は便利 69
  32. 71

  33. terraform plan -generate-config-out • import block を元にコードを自動生成するコマンド • 生成されるコードは完璧ではないが、 0

    から自分で書くより圧倒的に楽 • 権限的にローカルで terraform plan が実行できないと通常使うのが難しい 76
  34. Terraform における Drift の主な原因 • Terraform 以外によるインフラの変更 • terraform apply

    の失敗 Terraform を運用していれば Drift は避けられない 80
  35. Why Drift Detection? • Drift はなるべく早く解消すべき • Drift はコードの信頼性をなくす ◦

    コードでなく実際のインフラの状態を確認する必要が出てくる • Drift はブロッカーにもなる ◦ terraform plan 時に予期せぬ差分として現れる ◦ 差分の原因を逐一確認する必要が出てくる 81
  36. tfaction における Drift Detection • Root Module ごとに GitHub Issue

    を作成して Drift を管理 • Issue は Drift が検出されたら Open, 解消されたら Close される • Drift の検出・解消のたびに Issue に結果がコメントされる • Drift Detection のタイミングは 2 種類 ◦ terraform apply 実行時 ◦ schedule workflow で terraform plan を定期的に実行時 82
  37. tfaction の Drift Detection のタイミング • terraform apply 実行時 ◦

    失敗したら Drift があると判定 • schedule workflow で terraform plan を定期的に実行時 ◦ No change でなければ Drift があると判定 83
  38. • Drift を Issue で管理できる • Issue を見ればいつから Drift があるのかだいたい分かる

    • あくまで Drift を検出するだけで自動で修正したりはしない ◦ 如何に Drift (Issue) に対処するかはユーザーに委ねられている 87
  39. Module 管理 • tfaction では標準的な管理方法を提供 ◦ 同じ Monorepo に集約 ◦

    GitHub Source で versioning して管理 ◦ Scaffold, Test, Release といった一連の開発フローをサポート • ただし自分の好きな方法で管理することも可能 90
  40. まとめ • データ基盤のインフラを Terraform で管理するための Workflow を tfaction で構築 •

    ビジネスや開発組織の成長に伴い、より生産性やセキュリティ・ガバナンスが求め られる • tfaction の様々な機能を活用し、高度なワークフローを少ない運用コストで管理 92
  41. 93

  42. 今後やりたいこと • Security の強化 ◦ よりセキュアな Secret 管理 • Linter

    設定の管理の改善 ◦ 少ない運用コストで適切な設定を適用していくという課題への道筋を提示 • apply before merge の検討 • tfaction の導入ハードルの低減 • Module 管理の改善 ◦ Renovate による update の自動化 • Terraform のテストのサポート • 設定ファイルの JSONSchema の自動生成 94
  43. pull_request_target で GitHub Actions の改竄を防ぐ tfmv - Terraform のリソース名のリファクタリング tfprovidercheck

    - 危険な Terraform Provider の実行を防ぐ Shunsuke Suzukiさんの記事一覧 | Zenn 95