ストーリー
IaCで管理すべきCI/CDインフラ
管理対象
| カテゴリ | 管理対象 | IaCツール |
|---|---|---|
| GitHub設定 | Organization設定、Ruleset、チーム権限 | Terraform (github provider) |
| ランナー | セルフホストランナー、スケーリング設定 | Terraform + Kubernetes |
| ネットワーク | VPC、サブネット、セキュリティグループ | Terraform |
| シークレット | Vault設定、KMS鍵、GitHub Secrets | Terraform + SOPS |
| 監視 | ダッシュボード、アラートルール | Terraform (datadog/grafana provider) |
GitHub Organization as Code
# Terraform: GitHub Organization設定
resource "github_organization_ruleset" "main_protection" {
name = "main-branch-protection"
target = "branch"
enforcement = "active"
conditions {
ref_name {
include = ["~DEFAULT_BRANCH"]
}
}
rules {
required_status_checks {
required_check {
context = "security/sast"
}
required_check {
context = "security/sca"
}
required_check {
context = "test/unit"
}
}
pull_request {
required_approving_review_count = 2
dismiss_stale_reviews_on_push = true
require_code_owner_review = true
}
}
}
resource "github_repository" "service" {
for_each = var.repositories
name = each.key
description = each.value.description
visibility = "internal"
template {
owner = "org"
repository = each.value.template
}
}
セルフホストランナーの管理
ランナーアーキテクチャ
GitHub Actions
↓ ジョブディスパッチ
┌─────────────────────────────────┐
│ Actions Runner Controller │
│ (Kubernetes Operator) │
├─────────────────────────────────┤
│ Runner Pod Pool │
│ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │Runner│ │Runner│ │Runner│ │
│ │Pod 1 │ │Pod 2 │ │Pod N │ │
│ └──────┘ └──────┘ └──────┘ │
│ Auto-scaling: 0 → 30 Pods │
└─────────────────────────────────┘
Actions Runner Controller (ARC) の設定
# Helm values for ARC
apiVersion: actions.summerwind.dev/v1alpha1
kind: RunnerDeployment
metadata:
name: org-runners
spec:
template:
spec:
organization: "org-name"
labels:
- "self-hosted"
- "linux"
- "x64"
resources:
requests:
cpu: "2"
memory: "4Gi"
limits:
cpu: "4"
memory: "8Gi"
---
apiVersion: actions.summerwind.dev/v1alpha1
kind: HorizontalRunnerAutoscaler
metadata:
name: org-runners-autoscaler
spec:
scaleTargetRef:
name: org-runners
minReplicas: 2
maxReplicas: 30
metrics:
- type: TotalNumberOfQueuedAndInProgressWorkflowRuns
scaleUpThreshold: "0.75"
scaleDownThreshold: "0.25"
scaleUpFactor: "2"
scaleDownFactor: "0.5"
シークレット管理
階層型シークレット管理
Organization Secrets(全リポジトリ共通)
├── GHCR_TOKEN(コンテナレジストリ)
├── SONAR_TOKEN(コード品質)
└── SNYK_TOKEN(セキュリティスキャン)
Repository Secrets(リポジトリ固有)
├── DATABASE_URL
├── API_KEY
└── ...
Environment Secrets(環境固有)
├── staging/
│ ├── AWS_ACCESS_KEY_ID
│ └── AWS_SECRET_ACCESS_KEY
└── production/
├── AWS_ACCESS_KEY_ID
└── AWS_SECRET_ACCESS_KEY
GitOps for CI/CD Infrastructure
CI/CD基盤のインフラ変更もGitOpsで管理します。
基盤変更フロー:
1. インフラコードを変更してPR作成
2. Terraform Plan が自動実行
3. OPAポリシーチェック
4. 2名以上のレビューと承認
5. PR Merge → Terraform Apply 自動実行
6. 変更の自動テスト(スモークテスト)
「CI/CD基盤のインフラ変更こそ、最も慎重にレビューすべきだ。基盤が壊れれば全チームが影響を受ける」 — 田中VPoE
まとめ
| ポイント | 内容 |
|---|---|
| IaC管理対象 | GitHub設定、ランナー、ネットワーク、シークレット、監視 |
| ランナー | ARC(Actions Runner Controller)でKubernetes上に自動スケーリング |
| シークレット | Organization → Repository → Environmentの3階層 |
| GitOps | 基盤変更もPR + レビュー + 自動適用のフローで管理 |
チェックリスト
- CI/CD基盤をIaCで管理する対象を理解した
- セルフホストランナーの自動スケーリングを理解した
- 階層型シークレット管理を理解した
- 基盤変更のGitOpsフローを理解した
次のステップへ
次は「自己修復とセルフサービス化」です。CI/CD基盤が自律的に問題を検知・修復し、チームがセルフサービスで利用できる仕組みを学びましょう。
推定読了時間: 30分