概要
これまでの例では、リソース引数にハードコードされた値を使用していました。構成をパラメーター化したり、コードを標準化したり、適用時にリソース引数をカスタマイズしたりするには、変数を使用します。変数を使用すると、値を一度定義すれば、リソース間で再利用できます。
変数を使用すると、以下の利点があります。
汎用性の向上
構成データをソースコードから分離することで、コードを編集することなく、同じ Terraform 構成を環境間で再利用できます。
柔軟性の向上
変数を宣言した後、環境変数、CLI オプション、または変数定義ファイル (
.tfvars) を介して適用時にその値を設定できます。次の例では、VPC 名、説明、および CIDR ブロックはハードコードされています。これらのいずれかを変数として宣言し、適用時に設定できます。
resource "alicloud_vpc" "my_vpc" {
vpc_name = "main-vpc"
cidr_block = "10.0.0.0/16"
description = "my first vpc network"
}入力変数の構文
このセクションでは、入力変数を宣言する方法について説明します。
変数は variable ブロックで宣言されます。これらはどの .tf ファイルにも配置できますが、一般的には variables.tf にまとめて記述します。
variable の後のラベルが変数名です。変数名を設定する際は、以下のルールに従ってください:
モジュール内での一意性:
各変数名は現在のモジュール内で一意でなければなりません。子モジュールで宣言された変数は、親モジュールの変数と競合しません。各モジュールには独自の 名前空間 があります。
キーワードに似た名前を避ける:
Terraform は変数名としてキーワードを予約しませんが、Terraform の一般的な用語と重複する名前を使用すると、混乱を招く可能性があります。
count、for_each、depends_on、nullのような名前や、lengthやsubstrなどの関数名は避けてください。
variable ブロックには必須の引数はありません。type を省略した場合、変数は任意の型 (any) を許容します。default を省略した場合、変数は必須となり、plan/apply 時に指定する必要があります。
type
type 引数は、変数が受け入れる値の種類を制約します。Terraform は、プリミティブ型 (bool、number、string) と、list(type)、set(type)、map(type)、object({})、tuple([...])、any などのよりリッチな型をサポートしています。
bool:
trueやfalseのようなバイナリ値 (引用符なし)。number: 数値。
string: テキスト値。
default
default は、デフォルト値を設定する variable ブロックの引数です。
モジュール内で宣言された変数の値にアクセスするには、式 var.<name> を使用します。次の例では、vpc_cidr_block 変数はリソースブロック内で var.vpc_cidr_block として参照され、cidr_block 引数に割り当てられます。値が指定されない場合、Terraform は変数のデフォルト値を使用します。
resource "alicloud_vpc" "my_vpc" {
vpc_name = "main-vpc"
cidr_block = var.vpc_cidr_block
description = ""
}
variable "vpc_cidr_block" {
default = "10.0.0.0/16"
}variable ブロック内の変数名は、リソース参照で使用される名前と一致する必要があります。デフォルト値は、環境変数、変数定義ファイル (例: terraform.tfvars)、または -var のような CLI オプションを介してオーバーライドできます。例:
# -var CLI オプションを使用してデフォルトをオーバーライドする
$ terraform plan -var vpc_cidr_block="172.16.0.0/16"description
description は、変数の目的と期待される値を文書化します。変数に default がない場合、Terraform は plan または apply 中に値の入力を求め、description を表示します:

description は、メンテナーの視点ではなく、ユーザーの視点 (何を提供すべきか、なぜか) から記述してください。内部的なメモは description に記述するのではなく、コメントを使用してください。
sensitive
sensitive は、変数の値を CLI 出力で機密としてマークするブール値の引数です。sensitive = true の場合、Terraform は terraform plan および terraform apply の出力で値を編集 (墨消し) します。
これは、データベースの認証情報、アクセスキー、パスワードなどの値に役立ちます。(ただし、sensitive はステートファイルを暗号化しません。機密性の高い値はステートに保存されたままになる可能性があります。シークレット管理とステート保護のベストプラクティスを使用してください。)
例: CIDR ブロックを機密としてマークすると、plan の出力で非表示になります。
$ terraform plan
Terraform will perform the following actions:
# alicloud_vpc.my-vpc will be created
+ resource "alicloud_vpc" "my-vpc" {
+ cidr_block = (sensitive value)
+ create_time = (known after apply)
+ id = (known after apply)
+ status = (known after apply)
+ user_cidrs = (known after apply)
+ vpc_name = "main-vpc"
...
}
Plan: 1 to add, 0 to change, 0 to destroy.validation
validation ブロックを使用すると、入力値にカスタムルールを適用できます。これには 2 つの引数が含まれます: condition (true に評価される必要があるブール式) と error_message (検証が失敗したときに表示されるテキスト) です (両方の引数が必要です)。
次の例では、length と substr を使用して、vpc_name が 4 文字より長く、tf- で始まることを保証します:
variable "vpc_name" {
validation {
condition = length(var.vpc_name) > 4 && substr(var.vpc_name, 0, 3) == "tf-"
error_message = "The vpc name must start with 'tf-' and be longer than 4 characters."
}
}terraform plan を実行し、vpc_name の入力値が my-vpc である場合、検証は失敗し、Terraform はカスタムエラーを出力します:

変数を設定する方法
実行時に変数の値を設定するには、いくつかの方法があります:
# .tfvars ファイル (推奨)
$ terraform apply -var-file my-vars.tfvars
# CLI オプション
$ terraform apply -var vpc_cidr_block=“172.16.0.0/16”
# 環境変数
$ export TF_VAR_vpc_dicr_block=“172.16.0.0/16”
$ terraform apply
# デフォルトの変数ファイル: terraform.tfvars
$ terraform apply.tfvars ファイルを使用して変数セットを切り替え、構成と一緒にバージョン管理できます。CLI オプションは簡単なテストに便利です。環境変数は、スクリプトや CI/CD パイプラインに適しています。必須の変数が設定されていない場合、Terraform は CLI で値の入力を求めます。
多くの変数、特に複雑な変数を定義する必要がある場合、CLI オプションは扱いにくくなります。代わりに、.tfvars または .tfvars.json 拡張子を持つファイルで値を指定し、terraform plan または terraform apply を実行するときに -var-file で渡します:
$ terraform plan -var-file my-vars.tfvars.tfvars ファイル内の変数定義は HCL 構文を使用し、変数名への代入のみを含みます。JSON 形式のファイル (.tfvars.json) には、変数代入の JSON オブジェクトが含まれます。変数ファイルの名前が terraform.tfvars、terraform.tfvars.json、*.auto.tfvars、または *.auto.tfvars.json の場合、Terraform は plan と apply のために自動的にそれをロードし、-var-file を必要としません。複数のソースが同じ変数を設定する場合、Terraform は最も優先度の高いソースからの値を使用します。CLI フラグ (-var および -var-file) は、自動的にロードされたファイルからの値をオーバーライドし、それはさらに環境変数をオーバーライドします。デフォルト値は、他の値が提供されない場合にのみ使用されます。複数の -var または -var-file フラグを渡した場合、後のフラグが前のフラグをオーバーライドします。コマンドラインで .tfvars ファイルの値をオーバーライドするには:
$ terraform plan -var="vpc_name=my-fisrt-vpc"その場合、plan の出力には、.tfvars ファイルの値ではなく、vpc_name が my-first-vpc として表示されます。
このアプローチは、自動化されたワークフローで一般的であり、-var が別の環境変数から値を取得し、変数ファイルで事前定義された値を置き換えます。
どの方法でも値が割り当てられていない変数の場合、plan または apply を実行すると Terraform がプロンプトを表示します。たとえば、vpc_name に default がなく、-var または -var-file を使用しない場合、CLI は値の入力を求めます:

変数のベストプラクティス
変数を宣言する際には、以下を推奨します:
インスタンスまたは環境ごとに変更される値のみをパラメーター化します。
値を変更する明確なユースケースがある場合にのみ、変数を公開してください。過剰なパラメーター化は避けてください。モジュールはデフォルトで意見を持つ (opinionated) ようにしてください。
defaultを持つ変数を追加することは通常、後方互換性があります。デフォルト値を変更すると動作に影響を与える可能性があり、変数を削除することは破壊的変更であり、慎重に計画する必要があります。可能な限り
.tfvarsファイルを使用します。ルートモジュールでは、値を設定するために変数ファイルを使用することを推奨します。ファイルと CLI フラグを切り替えて使用することは避けてください。コマンドラインオプション (
-varや-var-fileなど) は一時的なもので、忘れやすく、バージョン管理できません。変数ファイル (例:terraform.tfvarsや*.auto.tfvars) は予測可能であり、ソース管理にコミットできます。変数にはその目的に関連する名前を付けます。
数値入力 (ディスクサイズ、メモリ、期間) の場合、実用的ならば名前に単位を含めます (例:
disk_size_gb、bandwidth_mbps、subscription_days)。プロバイダーの API が非標準の単位を使用する場合、この規則によって期待される入力が明確になります。論理入力の場合、条件付きロジックを簡素化するために、肯定的な表現のブール値 (例:enable_ipv6) を使用します。変数には説明が必要です。
すべての
variableにdescriptionを含めてください。説明はプロンプトや生成されたドキュメントに表示され、新しい貢献者にコンテキストを提供し、可読性と保守性を向上させます。説明はユーザーの視点から記述してください — どのような値を、なぜ提供するのか。