ADR-005: Terraform採用(Infrastructure as Code)
ステータス
採用済み
意思決定者
- 太田裕貴(CTO)
- インフラチーム
決定日
2021年頃(プロジェクト初期)
背景(Context)
QudenはAWS上で動作するSaaSであり、以下のインフラリソースを管理する必要があります:
- ECS(Elastic Container Service)でのコンテナ実行
- RDS(MongoDB Atlas)、S3、CloudFront、Lambda等の各種AWSサービス
- VPC、セキュリティグループ等のネットワーク設定
現状の課題
- AWSコンソールでの手動設定は、ヒューマンエラーのリスクが高い
- インフラの変更履歴が不明瞭で、誰がいつ何を変更したのかわからない
- 環境(開発、ステージング、本番)ごとにインフラを構築するのが手間
- チームメンバー間でインフラ知識が共有されない
- インフラの現状把握が困難
解決したいこと
- インフラのコード化(Infrastructure as Code)
- 変更履歴の記録(Gitでのバージョン管理)
- 環境ごとのインフラ構築の自動化
- インフラ構成の可視化・ドキュメント化
- チーム全体でのインフラ知識の共有
要件(Requirements)
機能要件
- AWSリソースの定義・構築・変更が可能
- 環境(dev、staging、production)ごとのインフラ管理
- インフラの差分確認(変更前のプレビュー)
- 複数メンバーでの同時作業が可能
非機能要件
- 再現性: 同じコードから同じインフラが構築できる
- 可視性: インフラ構成がコードで可視化されている
- 保守性: インフラの変更が安全に行える
- 学習コスト: 許容範囲内
制約条件
- 技術的制約: AWSサービスを網羅的にサポートしている
- ビジネス的制約: 無料または低コストで利用可能
- 時間的制約: 早期のMVPリリースに対応可能
検討した選択肢
選択肢1: AWSコンソール(手動設定)
概要
AWSマネジメントコンソールでリソースを手動作成・設定。
メリット
- 学習コストがゼロ(GUIで直感的)
- 初期セットアップが高速
デメリット
- ヒューマンエラーのリスクが高い
- 変更履歴が残らない
- 環境の複製が困難
- チーム間での知識共有が難しい
- インフラの現状把握が困難
実装コスト
- 初期実装: 最低
- 学習コスト: ゼロ
- 保守コスト: 極めて高い
選択肢2: AWS CloudFormation
概要
AWSが提供するIaCツール。YAML/JSONでAWSリソースを定義。
メリット
- AWS公式ツールで、AWS統合が完璧
- AWS CloudFormation Stackでリソースのライフサイクル管理
- 無料で利用可能
デメリット
- YAML/JSONの記述が冗長で可読性が低い
- AWSのみに特化(他のクラウドに移行できない)
- エラーメッセージが不親切
- ステート管理が複雑
実装コスト
- 初期実装: 中
- 学習コスト: 中
- 保守コスト: 中
選択肢3: Terraform(HashiCorp製)
概要
HashiCorp製のオープンソースIaCツール。HCL(HashiCorp Configuration Language)でインフラを定義。
メリット
- HCLの可読性: YAML/JSONより読みやすく、書きやすい
- マルチクラウド対応: AWS、GCP、Azureすべてに対応
- 強力なモジュールシステム: 再利用可能なモジュールで効率化
- 豊富なエコシステム: Terraform Registry でモジュールが充実
- 差分確認:
terraform planで変更内容を事前確認 - ステート管理: tfstate ファイルで現在のインフラ状態を管理
デメリット
- 学習コストが若干高い
- ステートファイル(tfstate)の管理が必要
- AWS固有の最新機能への対応が若干遅い場合がある
実装コスト
- 初期実装: 中
- 学習コスト: 中
- 保守コスト: 低(可読性・保守性が高い)
決定(Decision)
選択した技術: Terraform
選択理由
要件との適合性
- HCLの可読性により、インフラの可視化・ドキュメント化を実現
terraform planにより、変更前のプレビューが可能で安全性が高い- モジュールシステムにより、環境(dev、staging、prod)ごとのインフラ構築が効率化
- tfstate ファイルにより、インフラの現状把握が容易
技術的妥当性
- AWSリソースを網羅的にサポート
- Terraform Registry により、ベストプラクティスを活用可能
- GitHubでのバージョン管理により、変更履歴が明確
- マルチクラウド対応により、将来的な選択肢が広がる
コスト対効果
- オープンソースで無料
- 学習コストは若干高いが、長期的な保守コスト削減効果が大きい
- 公式ドキュメントやコミュニティリソースが充実
将来性
- HashiCorpが積極的に開発しており、将来性が高い
- 業界標準のIaCツールとして広く採用されている
実装方針
Gitリポジトリでの管理
toruca-infraリポジトリでTerraformコードを管理- 環境ごとにディレクトリを分離(
environments/dev,environments/staging,environments/prod)
モジュール化
- 共通のリソース定義をモジュール化(
modules/ecs,modules/vpc等) - 環境ごとに変数(variables)を使い分け
- 共通のリソース定義をモジュール化(
ステートファイルの管理
- S3バックエンドでtfstateファイルを管理
- DynamoDBでステートロック(同時編集防止)
CI/CDパイプライン
- GitHub Actionsで
terraform planを自動実行 - PRマージ時に
terraform applyを実行
- GitHub Actionsで
受け入れたトレードオフ
トレードオフ1: 学習コスト
- 影響: HCLとTerraformの概念を学習する必要がある
- 受け入れ理由: 公式ドキュメント・学習リソースが充実しており、学習コストを上回る長期的なメリットがある
- 軽減策: チーム内での勉強会、Terraform Registryのモジュール活用
トレードオフ2: ステートファイル管理の複雑さ
- 影響: tfstateファイルの管理が必要
- 受け入れ理由: S3バックエンド+ DynamoDBによるステートロックで安全に管理可能
- 軽減策: Terraform Cloud(将来的な選択肢)
トレードオフ3: AWS最新機能への対応遅延
- 影響: AWS CloudFormationと比べて、最新機能への対応が若干遅い場合がある
- 受け入れ理由: 多くの場合、数週間〜1ヶ月程度で対応されるため、問題にならない
- 軽減策: 必要に応じて、AWSコンソールで一時的に設定し、後でTerraformに移行
結果(振り返り)
うまくいったこと(Pros)
- インフラの可視化: HCLにより、インフラ構成が明確になった
- 変更の安全性:
terraform planにより、変更前に影響範囲を確認できた - 環境構築の効率化: モジュール化により、dev/staging/prod環境を効率的に構築できた
- 変更履歴の記録: Gitにより、誰がいつ何を変更したのかが明確になった
うまくいかなかったこと(Cons)
- 学習曲線: 新規メンバーがTerraformに慣れるのに時間がかかった
- ステートファイルの競合: 複数メンバーが同時に作業する際、ステートロックの理解が必要だった
- 一部リソースの手動設定: AWS最新機能を使う際、一時的に手動設定が必要な場合があった
学び
- モジュール化の重要性: 共通リソースをモジュール化することで、保守性が大幅に向上
- terraform plan の活用: 変更前のプレビューにより、ヒューマンエラーを防止できた
- ドキュメントとしてのコード: HCLコード自体がインフラのドキュメントとして機能した
今後の改善点
- Terraform Cloud の検討: ステート管理・チームコラボレーションの改善
- モジュールの整理: 共通モジュールをさらに整理・最適化
- CI/CDパイプラインの強化: terraform apply の自動化をさらに安全に