Concourse CI アーキテクチャ解剖 — ATC / TSA / Worker はどう連携するか
Concourse の内部コンポーネント (ATC / TSA / Worker / Garden / Baggageclaim / PostgreSQL) の役割と通信フロー。YAML 駆動 + Docker Job の設計思想、2024 時点の立ち位置も含めて整理。

Concourse の設計思想
Concourse (concourse-ci.org) は YAML 駆動のパイプライン実行基盤 です。 他の CI/CD と一線を画す設計:
- Pipeline as Code: YAML でパイプラインを完全記述、
flyCLI で反映- ステートレス: サーバー側に状態を持たず、Resource (Git / S3 / Docker Registry など) の状態変化で駆動- Docker 単位のジョブ実行: 各タスクは Docker コンテナで実行、再現性が高い- Worker の水平スケール: パイプラインが増えたら Worker ノードを追加するだけどういう問題を解くか: Jenkins のように Groovy や UI 操作で設定が霧散せず、全てがコードになる、環境依存のない CI/CD 基盤。> 2024 時点の立ち位置: Concourse は VMware (Pivotal) 傘下で開発が継続されていますが、> Argo Workflows / Tekton / GitHub Actions / GitLab CI に市場を奪われ、新規採用は減っています。
既存の Concourse 運用環境を理解する目的で本稿を読むのが現実的な位置づけです。
コンポーネント一覧
ATC (Air Traffic Controller)
-
HTTP サーバー: 既定 8080- Web UI 提供-
flyCLI からの API 受付 (パイプラインの set / unpause / trigger)- Worker ノードのスケジューリング- 「Concourse の脳」 に相当### TSA (Trusted Service Announcer) -
SSH サーバー: 既定 2222- Worker ノードを ATC に 安全に登録 するための認証口- Worker は TSA にリバース SSH トンネルを張り、ATC からのジョブ指示を受ける- 30 秒毎に Worker の生存確認- 「ATC と Worker の間の信頼境界」### PostgreSQL
-
パイプライン定義 / ビルドログ / Resource の状態履歴を保存
-
Concourse の 唯一の永続化層
-
ATC を複数台で運用する場合もバックエンドは PostgreSQL 共有
Worker ノード
Worker はジョブ実行の実体。内部に以下のサブコンポーネントを持つ:
Garden (旧名 Garden-Runc)
- HTTP サーバー: 既定 7777- Docker コンテナのライフサイクル管理 (作成・実行・破棄)- 内部的には
runcを使用- ATC が指示したタスクを実行#### Baggageclaim - HTTP サーバー: 既定 7788- タスク間で共有する Volume 管理 (Git リポジトリのクローン、依存キャッシュ等)- COW (Copy-on-Write) ボリュームでパイプライン高速化#### Beacon- Worker 側で動く常駐プロセス
- TSA にリバース SSH トンネルを張り続けて、ATC から到達可能にする
- Worker を NAT 配下に置いても ATC から指示できる
リクエストフロー: パイプラインが動くまで
開発者
↓ fly set-pipeline / fly trigger-job
ATC (API)
↓ PostgreSQL に状態保存
ATC (Scheduler) — Resource の変化を検知
↓ TSA 経由で Worker に指示
Worker
├─ Baggageclaim: Volume 取得・準備
└─ Garden: Docker コンテナを起動 → タスク実行 → 結果を Volume に書き出し
↓ 結果を ATC に報告
ATC — ログを PostgreSQL に保存、UI に表示
Vault との連携
Concourse 自体は秘密情報 (API キー、SSH 鍵) の保管に向かないため、 Vault / AWS Secrets Manager / CredHub と連携する設計:
jobs:
- name: deploy
plan:
- get: src
- task: deploy
params:
API_KEY: ((prod/api_key)) # Vault から解決
((...)) は Credential Manager のプレースホルダ。
ATC に認証情報を注入する設定を一度してしまえば、パイプライン YAML には 秘匿情報が一切出てこない 。
Concourse の強みと弱点
強み
- 完全な Pipeline as Code: UI 操作でパイプライン変更不可、YAML が真実- 再現性: 全ジョブがコンテナ実行- シンプルな抽象: Pipeline = Job + Resource のみ (覚える概念が少ない)- 並列実行 + Worker スケール### 弱点- 学習曲線: Resource の概念に慣れが要る (Git Pull も Resource、通知も Resource)- UI が他ツールに比べ質素- コミュニティの規模: Jenkins / GitHub Actions に比べ小さい- プラグイン (Resource Type) が限定的- 依存: PostgreSQL を含む運用セットが重い (小規模プロジェクトには過剰)## 近年の代替選択肢| ツール | 特徴 | Concourse と比べたとき || --- | --- | --- || GitHub Actions | GitHub ネイティブ、YAML 駆動 | 導入コストほぼゼロ、OSS/コンテナビルドは全部これで | | GitLab CI/CD | GitLab 統合 | Concourse と同じ YAML 駆動、UI 良好 | | Argo Workflows | Kubernetes ネイティブ、DAG 定義 | K8s 中心に寄せるなら強力 | | Tekton | Kubernetes CRD ベース | クラウドネイティブ標準化志向 | | Dagger | Pipeline を Go/Python/TS で書ける | 「YAML 疲れ」 からの開放を謳う新興 | | Jenkins | 歴史と資産 | プラグインは豊富だが、設定が霧散しがち |
新規採用で Concourse を選ぶ理由はもはや限定的 。 しかし既存の Concourse 運用環境を触る機会はまだあり、そのための理解として本稿の価値があります。
落とし穴
1. PostgreSQL のバックアップを忘れる
パイプライン定義 + ビルド履歴 + Credential ハッシュがここに集約されているので、 失ったらクラスタ再構築 。必ず定期バックアップ。
2. Worker の ephemeral 設定をせずに汚染
Worker ノード上のキャッシュ (Baggageclaim Volume) は蓄積するので、
ディスク溢れ対策として ephemeral: true で揮発化 or 定期入れ替えを。
3. パイプライン YAML を手で set-pipeline する
パイプライン YAML そのものも Git 管理し、 反映を自動化するパイプライン (いわゆる 「pipeline-of-pipelines」) を組むのが本流。
4. ATC を 1 台で運用
ATC の障害でパイプライン全停止。本番は ATC 2 台 + PostgreSQL HA が最低構成。
まとめ: Concourse は 「YAML と Docker で CI/CD を純化する」 というビジョンの実装。 2024 年時点では 新規採用は GitHub Actions / Argo Workflows が主流ですが、 既存の Concourse 運用コードを触るときは本稿のコンポーネント図を手元に持っておくとデバッグが速くなります。
関連記事
- クラウド·
Spring Boot × Concourse CI/CD 実装 — PR テスト + Docker Push パイプライン
Spring Boot アプリを Concourse でビルドする最小実装。Pull Request トリガーの Unit テストと、master へのマージで Docker Registry Push を行う YAML を丸ごと解説。
- クラウド·
Concourse on Kubernetes 検証メモ — Helm 導入と本番運用で考えること
Concourse を Kubernetes 上にデプロイする構成メモ。Helm チャートでの立ち上げ手順、Worker ノードを DaemonSet で配置する設計、本番運用での留意点と 2024 年の現実解。
- クラウド·
Cassandra 一貫性レベルの選び方 — ONE から ALL まで、現場で何を使うか
Cassandra の Tunable Consistency を Read/Write 別に整理。QUORUM の数式、R+W>RF の原則、マルチ DC での LOCAL_QUORUM 推奨、トレードオフの実例つき。