terraform consoleは、その場でHCL式を評価できる対話的REPLです。plan/applyの前に式の正当性や型変換、ループ処理の結果を確認でき、検証の反復速度を大きく上げます。
本稿ではAssociate/Pro試験で狙われやすい式評価の基礎から、locals/variables/状態参照のデバッグ、エラーの読み解き方まで、実務でそのまま使える手順をまとめます。
terraform consoleは現在の作業ディレクトリの設定と状態を読み込み、HCL式を逐次評価します。状態が存在すればリソース属性やモジュール出力も参照できます。
利用前にterraform initを実行し、バックエンドやプロバイダを解決しておくのが安全です。リモートバックエンドが構成されていれば、認証情報が有効な前提でその状態に対しても評価できます。終了はexitまたはCtrl-Dです。
| ツール | 主な用途 | 得られる情報 | インタラクティブ性 |
|---|---|---|---|
| terraform console | 任意の式評価・デバッグ | 式の結果、状態中の属性/出力 | 高(対話式) |
| terraform output | 出力変数の確認 | root moduleのoutput値のみ | 低(定型表示) |
| terraform plan -json | 差分の機械可読出力 | 計画差分と未確定値の可視化 | 低(非対話、分析向け) |
式評価の流れ(概念)
入力式 --> パーサ(HCL) --> 評価器
| \-- 関数呼び出し
| \-- 変数/locals参照
| \-- 状態参照(resource/module)
V
結果/エラー起動と基本評価例
# 変数はTF_VAR_*やtfvarsから解決される。状態は作業ディレクトリに紐づく
$ TF_VAR_env=dev terraform console
> terraform.workspace
"default"
> var.env
"dev"
> tostring(1 + 2)
"3"
> can(regex("^app-", "app-web"))
true
> coalesce(null, "fallback")
"fallback"
> exitTerraformの基本型はstring、number、bool、コレクション(list/tuple、map/object)、nullです。consoleでは関数で明示的に型を整えるとエラーが減ります。
未知値(未適用で確定していない属性)やnullを含む式は、そのままでは評価エラーになることがあります。can()で評価可否を先に確認し、try()やcoalesce*でフォールバックを用意するとデバッグが進みます。
型と安全評価の実例
terraform console
> toset(["a", "b", "a"]) # 重複排除
set([
"a",
"b",
])
> tomap({ a = 1, b = 2 })
{
"a" = 1
"b" = 2
}
> can(var.unknown)
false
> try(var.missing, "ok")
"ok"
> coalescelist([], [1,2])
[
1,
2,
]
> tonumber("08")
8consoleは現在の設定ファイルのlocalsやvariablesを解決します。locals参照はlocal.<name>です。tfvarsや環境変数(TF_VAR_*)を用意すると、本番に近い入力で式を試せます。
状態が存在する場合、resourceアドレス(例: aws_instance.web.id)やmodule出力(module.app.url)も評価できます。未適用で状態にない属性は評価できないため、try()で防御しつつ代替ロジックを検証します。
設定とconsoleの往復で検証する
# locals.tf(一例)
locals {
tags = merge({ app = "sample" }, { env = var.env })
}
# variables.tf
variable "env" { type = string, default = "dev" }
# consoleで評価
$ terraform console
> local.tags
{
"app" = "sample"
"env" = "dev"
}
# 状態にある場合のみ参照可能(無いとエラー)
> try(aws_instance.web.private_ip, "no-ip")
"no-ip"
> can(module.app.url)
falsefor式や条件付き内包表記は、リソース引数に入れる前にconsoleで完成形を作って確認するのが近道です。map/objectのキー・値の変換、flattenやdistinctの活用で実務の整形要件にも対応できます。
正規表現、分岐、ソートなども組み合わせ、目的のスキーマに落ちるまで反復します。
for式と整形の例
terraform console
> xs = [{name="a", port=80}, {name="b", port=443}]
> [for x in xs : format("%s:%d", x.name, x.port)]
[
"a:80",
"b:443",
]
> m = { web = {subnets=["s-1","s-2"]}, api = {subnets=["s-3"]} }
> flatten([for k, v in m : v.subnets])
[
"s-1",
"s-2",
"s-3",
]
> addrs = ["10.0.0.1", "10.0.0.1", "10.0.0.5"]
> sort(distinct(addrs))
[
"10.0.0.1",
"10.0.0.5",
]consoleでのエラーは本番の計画/適用でも発生しうるため、原因を正確に分類します。未定義(unknown/未適用)、型不一致、キー欠落、ファイル/パス不備が主要因です。
can()/try()で隔離し、個々のサブ式を小さく分割して評価すると根本原因に早くたどり着けます。
エラーの切り分け例
terraform console
# 未定義参照
> aws_instance.web.id
╷
│ Error: Invalid reference
│ on <console-input> line 1:
│ (resource not found in state)
╵
# can/tryで防御
> can(aws_instance.web.id)
false
> try(aws_instance.web.id, "no-id")
"no-id"
# 型不一致の修正
> merge({a=1}, {b=null})
{
"a" = 1
"b" = null
}
> tomap(merge({a=1}, {b=null})) # map型を明示
{
"a" = 1
"b" = null
}
# ファイル存在確認
> fileexists("./vars/dev.tfvars")
trueAssociate/Proでは、consoleでの式検証、型の暗黙/明示変換、for式と条件、unknown値の扱い、workspace分岐などが頻出です。設問は挙動の正確さ(どこまで参照できるか)と、安全なガード(try/can/coalesce)の適用を問う傾向があります。
実務では、plan前にconsoleで式を固める、状態起点のデータ整形を一度consoleで原型を作る、tfvarsとTF_VAR_*で本番相当の入力を用意して動作確認するのが有効です。
小ワザ集(抜粋)
# 別状態ファイルを評価(ローカルにダウンロード済みの例)
$ terraform console -state=./terraform.tfstate
> module.app.endpoint
"https://app.example.com"
# workspace分岐の動作確認
$ TF_VAR_env=prod terraform console
> terraform.workspace
"default"
> var.env
"prod"
> var.env == "prod" ? "hoge" : "fuga"
"hoge"
# ファイル入力の検証
> jsondecode(file("./overrides.json"))
{
"image" = "1.2.3"
}Associate / Pro
問題 1
リモートバックエンド(Terraform Cloudなど)で状態を管理しているプロジェクトで、module.webの出力urlをterraform consoleで評価したい。正しい進め方はどれか。
正解: A
consoleは現在の設定/バックエンドを利用して状態を読み込みます(認証済みでinit済みが前提)。module出力は状態に格納されるため、適用済みならconsoleから参照可能です。terraform outputは出力値の表示に限られ、任意の式評価はできません。
terraform consoleで変数値を渡すには?
基本は変数のdefault、*.auto.tfvarsやterraform.tfvars、環境変数TF_VAR_<name>が使われます。例: TF_VAR_region=ap-northeast-1 terraform console。これらで実運用に近い入力を再現します。
未適用のリソース属性はconsoleで評価できますか?
状態に存在しない属性は評価できません。try()やcan()で防御しつつ、代替値で式の形だけ先に確認するのが現実的です。最終値の確認はplan/apply後に行います。
どの状態ファイルを読むか制御できますか?
作業ディレクトリの設定に従ってバックエンドから状態を読みます。特定のローカル状態を明示したい場合は、-stateオプションでパスを指定できます(事前にterraform initを実施しておくと安全です)。
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を用いた既存リソース参照の基本、選択基準、評価順序、...