Terraform Cloud/Enterprise はVCS連携を前提に設計されたプラットフォームで、プラン/アプライの自動トリガー、PRコメント、コミットステータス連携が標準機能として提供される。
本稿は GitHub・GitLab 連携の実務と試験で問われやすい論点(連携方式の選択、ワークスペースの紐づけ、トリガー条件、セキュリティ境界)に絞って整理する。
VCS連携は組織(Organization)単位でVCS接続を作成し、各ワークスペースで対象リポジトリ(identifier = 組織/リポジトリ)とブランチを選ぶのが基本である。以後のプラン/アプライはVCSイベントにより自動で駆動される(VCS駆動ワークフロー)。
GitHub では GitHub App 連携が推奨。より細かい権限範囲とリポジトリ単位のインストール制御ができ、PRコメントやコミットステータス更新が安定する。GitLab ではOAuthアプリ連携が一般的で、指定ブランチやディレクトリ配下の変更のみをトリガーにできる。
| 連携方式 | 主な対象 | 権限・粒度/特徴 |
|---|---|---|
| GitHub App | GitHub.com / GitHub Enterprise Cloud | リポジトリ単位でインストール可、最小権限。PRコメント・ステータスが安定。推奨。 |
| GitHub OAuth | GitHub.com(従来方式) | 権限スコープが広くなりがち。既存運用からの移行経路として残存。 |
| GitLab OAuth | GitLab.com / GitLab CE/EE | GitLab側でOAuthアプリを作成。ブランチ・ディレクトリ絞り込み可。PR/MRコメント・ステータス対応。 |
VCS駆動ワークフロー(概念)
GitHub では GitHub App 連携が推奨。組織管理者がTerraform Cloud側でGitHub App接続を追加し、GitHub上でアプリを対象リポジトリにインストールする。以降、選択したリポジトリとブランチを各ワークスペースに割り当てるだけでPRコメント・コミットステータス・トリガーが機能する。
試験では、細粒度なリポジトリ選択、最小権限、PRでのSpeculative Plan、デフォルトブランチへのマージで本プラン/適用、という流れを説明できることが重要。既存のOAuth接続があっても、新規ではGitHub Appを優先的に選ぶ前提が問われやすい。
GitLab ではOAuthアプリを作成し、Terraform Cloud 側のVCSプロバイダ作成画面で指示されるリダイレクト/コールバック設定をGitLabに登録する。接続が確立したら、ワークスペース作成時に対象リポジトリを検索して紐づける。
GitLab連携もPR/MRコメント・コミットステータス・Speculative Planをサポートする。Monorepo の場合は working_directory と trigger_prefixes を設定し、無関係な変更でRunが起動しないようにする。
VCS連携の単位はワークスペース。一般に環境・境界ごとに分割する(例: app-prod, app-stg)。ブランチは該当環境のソース・オブ・トゥルースに合わせる(例: mainをprod、developをstgに対応)。
Monorepo では working_directory を指定し、file_triggers_enabled と trigger_prefixes を使って変更検知を限定する。これにより、巨大リポジトリでも不要なRunの氾濫を抑えられる。
PR/MR作成・更新時はSpeculative Planが走り、結果はPRコメントやコミットステータスで可視化される。デフォルトブランチへのマージが行われると、対象ワークスペースの本プラン/アプライが起動する。ブランチフィルタを設定していれば、そのブランチ以外のpushではRunは起動しない。
セキュリティ上、VCS接続のクレデンシャルはTerraform Cloudの組織スコープで安全に保管され、Run環境へは直接露出しない。クラウドプロバイダの認証情報や機密はワークスペースの環境変数/機密変数で管理し、VCSにコミットしない。
VCS連携そのものもコードで管理できる。ハッシュコープ公式のtfeプロバイダを用いれば、ワークスペース作成と同時にVCSリポジトリ、ブランチ、作業ディレクトリ、トリガー設定を宣言できる。OAuth/GitHub Appなど組織側の接続作成はUI/APIで先に行い、その識別子(例: oauth_token_id)を参照する。
試験では、tfe_workspace の vcs_repo.identifier は org/repo 形式、working_directory で配下ディレクトリを指定、file_triggers_enabled と trigger_prefixes でMonorepoの不要トリガーを避ける、というポイントが問われやすい。
tfeプロバイダでワークスペースとVCS連携を作成する例
# tfeプロバイダでTerraform Cloud/Enterpriseを管理
terraform {
required_providers {
tfe = {
source = "hashicorp/tfe"
}
}
}
provider "tfe" {
# Terraform Cloud (SaaS) は hostname 省略可。Terraform Enterprise はホスト名を指定。
token = var.tfe_token
}
variable "tfe_token" { type = string }
variable "organization" { type = string }
variable "oauth_token_id" { type = string } # 組織のVCS接続(OAuth等)ID
resource "tfe_workspace" "app_prod" {
name = "app-prod"
organization = var.organization
# Monorepoの一部のみをターゲット
working_directory = "infra/terraform"
file_triggers_enabled = true
trigger_prefixes = ["infra/terraform/"]
# 本番は通常、手動承認にする
auto_apply = false
# VCSリポジトリとの紐づけ
vcs_repo {
identifier = "my-org/app-infra" # org/repo 形式
branch = "main" # 対象ブランチ
oauth_token_id = var.oauth_token_id # 組織のVCS接続ID
ingress_submodules = true # サブモジュールを取得
}
}
Pro
問題 1
GitHub.com の特定リポジトリだけに最小権限で接続し、PR作成時にSpeculative Planの結果をPRコメントとコミットステータスで返したい。Terraform Cloud で推奨される連携方式はどれか?
正解: A
GitHub App はリポジトリ単位のインストールと最小権限・安定したPRコメント/ステータス連携を提供するため、要件とベストプラクティスに合致する。
Monorepo で不要なRunを避けるには?
working_directory をターゲット配下に設定し、file_triggers_enabled と trigger_prefixes を併用する。これにより指定パス配下の変更のみでRunが起動し、他領域の変更ではトリガーされない。
PRを作成したのにSpeculative Planが走らない/コメントが付かない場合の確認点は?
ワークスペースが正しいブランチに紐づいているか、リポジトリがVCS接続の対象に含まれているか、アプリ(GitHub App/OAuth)の権限・インストール対象が適切か、フォークPRが制限されていないか、そしてTerraform Cloud側でRunが抑止(キュー満杯、ポリシーチェック待ち等)されていないかを確認する。
プライベートモジュールレジストリにモジュールを公開するにはVCS連携が必要?
はい。VCS接続で対象リポジトリを登録し、一般的な命名規則(terraform-<PROVIDER>-<NAME>)とセマンティックバージョンのタグを付ける。Terraform Cloud がタグを検出してモジュールを登録する。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Terraform HCL 構文の基礎:Block / Attribute / Expression を正しく使い分ける
Terraform Associate で頻出の HCL 構文を、ブロック・属性・式の3視点で整理。実務で迷いがちな書き...
Terraform Authoring & Ops Pro: 上位資格の範囲と対策
上位レベルを想定したTerraformの設計・運用ドメインを整理し、実務で通用する対策を提示。モジュール設計、ステート運...
Terraform Providers の基本: プラグイン型アーキテクチャを正しく使いこなす
Associate レベルで押さえるべき Provider の基礎、インストール、バージョニング、認証、エイリアス運用を...
Terraform Resourceブロック徹底ガイド: 最小単位のリソース定義
Associateレベルで押さえるべきResourceブロックの構造、依存関係、メタ引数、ライフサイクル制御を実務目線で...
Terraform Data Source徹底理解:既存リソースの参照で壊さず足す
Terraform Associate向けに、Data Sourceを用いた既存リソース参照の基本、選択基準、評価順序、...