複数のワークスペースでネットワーク→プラットフォーム→アプリのように層を分けたとき、上流の変更に気づいて確実に下流を再計画・適用させるのがRun Triggersです。手動運用や外部CIに頼らず、Terraform Cloud内で依存を自動化できます。
ただしRun Triggersは「実行を並べるための仕組み」であり、値の受け渡しは行いません。値はremote stateで参照し、トリガーは実行の起動に専念させるのが基本設計です。
Run Triggersは、あるワークスペースの実行が適用まで成功したとき、同一組織内の別ワークスペースに自動でRunをキューイングする仕組みです。VCSのコミットやUI操作に依存せず、上流→下流の依存をTerraform Cloudの中で完結できます。
上流から下流へは一対多のファンアウト、複数上流から1つの下流へのファンインも可能です。サイクル(循環依存)は作成時に拒否されます。Run Triggers自体は値を運びません。出力はdata.terraform_remote_stateで参照します。実行モードがlocalのワークスペースにはトリガーしても実行されないため、remote実行が前提です。スペキュレイティブプラン(PRプラン)や計画のみの実行はトリガー対象外です。
ワークスペース間の依存連鎖(例)
もっとも小さなtfe_run_triggerの例(Aの成功でBを起動)
provider "tfe" {}
# 既存ワークスペースIDをデータ参照する例(名称->ID解決)
data "tfe_workspace" "a" {
name = "network-a"
organization = var.org
}
data "tfe_workspace" "b" {
name = "platform-b"
organization = var.org
}
resource "tfe_run_trigger" "a_to_b" {
workspace_id = data.tfe_workspace.b.id # 下流
sourceable_id = data.tfe_workspace.a.id # 上流
}設計の基本は役割分担です。出力(vpc_idやsubnet_idsなど)はremote stateで参照し、Run Triggersは下流のRunを自動で並べるだけに使います。これにより、ヒューマンエラーや手動実行忘れを排しつつ、コード上の依存は明示的に維持できます。
remote backendを使う場合、同一OrganizationであればTerraform Cloudのトークン注入により追加設定なくstateへアクセスできます。機密出力は機密のまま扱われるため、出力設計時に最小限の露出を心がけてください。
data.terraform_remote_stateで上流の出力を参照
terraform {
backend "remote" {
organization = var.org
workspaces {
name = "app-c"
}
}
}
data "terraform_remote_state" "network" {
backend = "remote"
config = {
organization = var.org
workspaces = { name = "network-a" }
}
}
data "terraform_remote_state" "platform" {
backend = "remote"
config = {
organization = var.org
workspaces = { name = "platform-b" }
}
}
module "app" {
source = "./modules/app"
vpc_id = data.terraform_remote_state.network.outputs.vpc_id
subnet_ids = data.terraform_remote_state.platform.outputs.subnet_ids
}Run Triggersの作成は、Terraform CloudのUI、TFC/TFE API、またはTerraform Provider(tfe)でコード化の3択です。チームで再現性を重視するならtfeプロバイダでtfe_run_triggerリソースを使うのが確実です。UI操作は手早い検証向け、APIは既存の自動化と統合したい場合に有効です。
作成・変更には対象ワークスペースで少なくともMaintainer相当の権限が必要です。下流ワークスペース側にRun Triggerが紐づくため、下流の管理権限を確認してください。
| メカニズム | 依存の自動起動 | データ受け渡し | 主な用途 |
|---|---|---|---|
| Run Triggers | 上流適用成功で下流Runを自動キューイング | しない(別途remote state) | ワークスペース間の実行順制御 |
| data.terraform_remote_state | しない | する(outputsを参照) | 値の共有・明示的依存の表現 |
| Variable Sets | しない | 環境変数/Terraform変数の横展開 | 資格情報や共通変数の配布 |
| TFC通知/Run Tasks | 外部連携やポリシーでの制御 | しない(設計次第) | 品質ゲートや外部システム通知 |
TerraformでRun Triggersをコード化(UIと同等の設定)
provider "tfe" {}
variable "org" {}
resource "tfe_workspace" "a" {
name = "network-a"
organization = var.org
execution_mode = "remote"
}
resource "tfe_workspace" "b" {
name = "platform-b"
organization = var.org
execution_mode = "remote"
}
resource "tfe_run_trigger" "a_to_b" {
workspace_id = tfe_workspace.b.id # 下流
sourceable_id = tfe_workspace.a.id # 上流
}上流ワークスペースで計画→(必要に応じて承認)→適用が成功すると、下流ワークスペースにRunがキューイングされます。下流でAuto applyを無効にしていれば、計画後に承認待ちとなります。ポリシー(Sentinel/Run Tasks)違反やプラン失敗時は次段に進みません。
複数の上流から1つの下流にトリガーする場合、下流はワークスペースのキュー制御に従い直列で実行されます。並列化はできませんが、冪等な計画を前提にすれば問題になりません。循環依存は作成段階でブロックされます。
下流の自動適用を制御する例(環境ごとの差異)
resource "tfe_workspace" "app_dev" {
name = "app-dev"
organization = var.org
execution_mode = "remote"
auto_apply = true # 開発環境は自動適用
}
resource "tfe_workspace" "app_prod" {
name = "app-prod"
organization = var.org
execution_mode = "remote"
auto_apply = false # 本番は承認必須
}Run Triggersは同一Organization内に限定されます。作成・変更には対象ワークスペースの管理権限(通常はMaintainer以上)が必要です。組織をまたいだ依存は設計段階で分割し、外部連携(通知や承認)など別の統制を検討してください。
remote stateでの値共有は強力ですが、過剰露出に注意します。出力は最小限、可能ならば集約モジュールでラップし、下流からは必要なキーだけを参照します。機密出力は下流でのログや外部通知に出さないよう配慮します。
共通資格情報をVariable Setで配布(出力で渡さない)
resource "tfe_variable_set" "shared_creds" {
name = "shared-creds"
organization = var.org
description = "Shared provider credentials for all envs"
}
resource "tfe_variable" "aws_access_key" {
key = "AWS_ACCESS_KEY_ID"
value = var.aws_access_key_id
sensitive = true
category = "env"
variable_set_id = tfe_variable_set.shared_creds.id
}
resource "tfe_workspace_variable_set" "attach" {
variable_set_id = tfe_variable_set.shared_creds.id
workspace_id = data.tfe_workspace.app.id
}Run Triggersは「実行の自動連鎖」、remote stateは「値の参照」という役割分担をまず押さえること。Run Triggersは同一Organization内のみ、上流の適用成功で下流Runをキュー、データは渡さない、下流はremote実行必須。このあたりが頻出ポイントです。
UI/Provider/APIのいずれでも設定できるが、再現性の観点ではtfe_run_triggerが模範解答。下流のAuto applyやポリシーの有無、マルチ上流での直列実行も絡めて設計意図を語れると加点を狙えます。
remote backend定義(試験で見かける最小例)
terraform {
backend "remote" {
organization = var.org
workspaces {
name = "platform-b"
}
}
}
# outputsは上流ワークスペース側で明示的に公開しておく
output "subnet_ids" {
value = module.network.subnet_ids
sensitive = false
}Pro
問題 1
同一Organization内で、network-aの変更が適用されたらplatform-bとapp-cを自動で再計画し、app-cではnetwork-aとplatform-bのoutputsを使いたい。機密値は直接渡さず、外部CIは使わない。最も適切な設計はどれか。
正解: A
実行の自動連鎖はRun Triggers、値の共有はremote stateという役割分担が最適です。Run Triggersは同一Organization内でのみ有効で、app-cはnetwork-aとplatform-bのoutputsを参照できます。Variable Setsは値共有の用途が限定的で依存の自動起動はしません。Webhook+外部CIは要件外かつクロス組織前提は不可。depends_onでワークスペース間の適用はできません。
上流が「変更なし(no-op)」だった場合でもRun Triggersは発火しますか?
適用ステージが成功で終了した実行がトリガー対象です。計画のみで終了した場合は発火しません。no-opでも適用ステージが実行・成功扱いであれば発火し得ます。不要な連鎖を避けたい場合は、outputsの設計見直しや下流のポリシー・Run Taskでのゲートを検討してください。
別OrganizationのワークスペースへRun Triggersで連鎖できますか?
できません。Run Triggersは同一Organization内に限定されます。組織をまたぐオーケストレーションが必要なら、通知・承認を含む外部パイプラインや別の統制レイヤを設けてください。
下流がexecution_mode=localのワークスペースでも動きますか?
実行はできません。Run TriggersはTerraform Cloudのremote実行が前提です。local実行ワークスペースに対してはRunをキューできても処理されないため、remoteに切り替えるか、外部CI等の別経路を検討してください。
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を用いた既存リソース参照の基本、選択基準、評価順序、...