GitOps(Atlantis)

GitOpsとは

GitOps は、あるべき状態を [[Git]] のリポジトリに置き、実環境をそれに合わせ続ける運用方式です。[[IaC]] が「定義をコードで書く」ところまでなのに対し、GitOps は適用の経路までGitに寄せます。

要点は次の3つです。

  • 唯一の正はリポジトリ — 手元や管理画面から直接変えない
  • 変更はPR経由 — 誰が何を変えるかが [[コードレビュー]] の対象になる
  • 差分は自動で埋める — 実環境とリポジトリがずれたら、リポジトリ側へ寄せる

手作業を禁止するのが目的ではなく、変更の履歴と根拠が残る場所を1つにするのが目的です。障害時に「いつ何が変わったか」を1か所で辿れることが最大の見返りです。

AtlantisがPR上でやること

Atlantis は、Terraform の実行をPRのコメント上で完結させる道具です。

  1. PRが開かれると Atlantis が自動で terraform plan を実行する
  2. 計画の結果をPRのコメントとして投稿する
  3. レビュアーが差分を読んで承認する
  4. atlantis apply とコメントすると適用される
  5. 適用結果もコメントに残り、PRをマージする
# atlantis.yaml
version: 3
projects:
  - dir: environments/prod
    workflow: default
    apply_requirements: [approved, mergeable]

apply_requirements が要点です。承認済みかつマージ可能でなければ適用させないという条件を、道具の側で強制できます。

「計画をレビューする」ことの意味

Terraform の怖さは、設定の1行が実リソースの再作成(=一度消える)になりうることです。コードの差分だけを見ても、それが何を引き起こすかは分かりません。

# terraform plan の抜粋
-/+ aws_db_instance.main (new resource required)
      ~ engine_version: "14.7" -> "15.3" (forces new resource)

コード上は1行ですが、実際にはデータベースが作り直されます。Atlantis がPRに貼るのはこの plan の出力で、レビュー対象がコードから「実際に起きること」へ変わります。ここが通常の [[CI/CD]] との違いです。

導入で決めること

  • 誰が apply できるか — コメント1つで本番が変わります。権限は明示的に絞ります
  • ロックの扱い — 同じディレクトリに対する複数のPRが同時に計画すると衝突します。Atlantis はロックを取りますが、放置されたPRがロックを握り続けることがあります
  • credential の置き場 — 実行するのはサーバー側です。強い権限が1か所に集まるため、そのサーバー自体の保護が要になります
  • 適用の失敗をどう扱うか — 途中で失敗すると、リポジトリと実環境がずれた状態が残ります。再実行で収束するか、手当てが要るかを決めておきます

Kubernetesの場合

[[Kubernetes]] では Argo CD や Flux が同じ考え方を担います。Atlantis が「PR上で計画・適用する」のに対し、こちらはクラスタ側が常にリポジトリを見に行き、ずれていれば自動で戻します。適用の向きが逆(pull型)である点が違いです。

関連技術とのつながり

  • [[IaC]] — 定義をコードで書くところまで。GitOpsは適用の経路まで含める
  • [[Git]] — あるべき状態の唯一の置き場
  • [[コードレビュー]] — 計画の出力をレビュー対象にする
  • [[CI/CD]] — 自動実行の土台。GitOpsは「何を承認対象にするか」で差が出る
  • [[Kubernetes]] — Argo CD / Flux が pull 型で同じ考え方を実現する
Q: GitOpsの中心的な考え方はどれ?
- [ ] すべての操作をCLIで行う
- [x] あるべき状態をGitに置き、実環境をそれに合わせ続ける
- [ ] 本番環境の変更を禁止する
解説: 変更の履歴と根拠が残る場所を1つにすることが目的です。

Q: AtlantisがPRのコメントに投稿するものはどれ?
- [ ] コードの差分
- [x] `terraform plan` の実行結果
- [ ] テストのカバレッジ
解説: レビュー対象がコードから「実際に起きること」へ変わります。リソースの再作成もここで気づけます。

Q: Argo CD / Flux が Atlantis と違う点はどれ?
- [x] クラスタ側がリポジトリを見に行く pull 型である
- [ ] Terraformを使わない
- [ ] レビューを必要としない
解説: Atlantisは PR 上で計画・適用する push 型、Argo CD / Flux はクラスタ側が常時ずれを検出して戻す pull 型です。