Terraformの改善活動まとめ

概要

最近のやっていたTerraformリポジトリの改善活動をまとめる

課題点

リポジトリの分割粒度

prd,stgなどの実行環境ごとにリポジトリが別れており、AWSアカウントとリポジトリが1対1でない。また、明確なルールがない環境のため

  • どのリポジトリにコードを書けばいいかわからない
  • どのmoduleを使えばいいかわからない(terraform-moduleリポジトリがあるのにdev-terraformリポジトリにもモジュールがある)
  • リソースを書く場合リポジトリを間違える、間違いを指摘する手間が増える
  • カスタムスクリプトやドキュメントが重複しており管理コストが高い

stateの粒度

1terraform resourceにつき1stateになっていたため

  • apply作業を何度も実行する必要がある
  • 定期的にapplyされないのでコードとリソースの差分が発生する
  • インフラアーキテクチャの全体像が分かりづらい

カスタムスクリプトによる開発体験の低下

  • メンテナンスできるメンバーが少ない
  • 拡張性の低下
    linterなどの周辺ツールを導入するためにカスタムスクリプトに大幅な変更が必要
    CI変更時も同様
  • terraform applyする対象をファイルで管理するためPR作成時にコンフリクトする

Terraform, AWS providerのバージョンが古い

リソースが細かいことにも相まってバージョンアップ作業が大変

やったこと

リポジトリの統合

リポジトリをmonorepo構成に変更

カスタムスクリプトの脱却

  • カスタムスクリプトを削除しterraformコマンドを実行するように変更
  • apply対象をファイル管理していたものを、変更差分をCIで検出するように変更
    カスタムスクリプトをなくしたことで、

CIの拡張

CodeBuildからGitHub Actionsに変更

  • Plan結果をPull Requestのコメントに表示するように変更
  • apply結果をSlackに通知
  • DynamoDBによるstateのlockの追加

静的解析の追加

  • tfsec、tflint、conftestなどの静的解析を導入

Terraform, AWS providerのバージョンアップ

  • スクリプトを書いて最新版に更新
    Terraformバージョン...0.13,0.14系から1.3系に
    AWSプロバイダー...3系から4系に
  • Renovateでバージョンアップに追従できるように

やれなかったこと

  • stateの統合
  • drift detection

学んだこと

やったことは基本的なことなので、そこから抽象化した学びをメモする  

  • 守れないルールは必要ないので、ルールと仕組み化はセットにする
  • チームとして負債をハンドリングできないと返却に大幅な時間がかかる
  • 負債とは正面から向き合う必要があるか考える
  • 開発組織の人数規模が増えてくると基礎的なフォローアップや、同じことを繰り返し言う必要がある