すべてのプロダクト
Search
ドキュメントセンター

Terraform:変数

最終更新日:Oct 16, 2025

概要

これまでの例では、リソース引数にハードコードされた値を使用していました。構成をパラメーター化したり、コードを標準化したり、適用時にリソース引数をカスタマイズしたりするには、変数を使用します。変数を使用すると、値を一度定義すれば、リソース間で再利用できます。

変数を使用すると、以下の利点があります。

  1. 汎用性の向上

    構成データをソースコードから分離することで、コードを編集することなく、同じ Terraform 構成を環境間で再利用できます。

  2. 柔軟性の向上

    変数を宣言した後、環境変数、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 の後のラベルが変数名です。変数名を設定する際は、以下のルールに従ってください:

  1. モジュール内での一意性:

    各変数名は現在のモジュール内で一意でなければなりません。子モジュールで宣言された変数は、親モジュールの変数と競合しません。各モジュールには独自の 名前空間 があります。

  2. キーワードに似た名前を避ける:

    Terraform は変数名としてキーワードを予約しませんが、Terraform の一般的な用語と重複する名前を使用すると、混乱を招く可能性があります。countfor_eachdepends_onnull のような名前や、lengthsubstr などの関数名は避けてください。

variable ブロックには必須の引数はありません。type を省略した場合、変数は任意の型 (any) を許容します。default を省略した場合、変数は必須となり、plan/apply 時に指定する必要があります。

type

type 引数は、変数が受け入れる値の種類を制約します。Terraform は、プリミティブ型 (boolnumberstring) と、list(type)set(type)map(type)object({})tuple([...])any などのよりリッチな型をサポートしています。

  • bool: truefalse のようなバイナリ値 (引用符なし)。

  • 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 を表示します:

截屏2024-07-13 21.05.24.png

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 (検証が失敗したときに表示されるテキスト) です (両方の引数が必要です)。

次の例では、lengthsubstr を使用して、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 はカスタムエラーを出力します:

截屏2024-07-14 11.14.42.png

変数を設定する方法

実行時に変数の値を設定するには、いくつかの方法があります:

# .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.tfvarsterraform.tfvars.json*.auto.tfvars、または *.auto.tfvars.json の場合、Terraform は planapply のために自動的にそれをロードし、-var-file を必要としません。複数のソースが同じ変数を設定する場合、Terraform は最も優先度の高いソースからの値を使用します。CLI フラグ (-var および -var-file) は、自動的にロードされたファイルからの値をオーバーライドし、それはさらに環境変数をオーバーライドします。デフォルト値は、他の値が提供されない場合にのみ使用されます。複数の -var または -var-file フラグを渡した場合、後のフラグが前のフラグをオーバーライドします。コマンドラインで .tfvars ファイルの値をオーバーライドするには:

$ terraform plan -var="vpc_name=my-fisrt-vpc"

その場合、plan の出力には、.tfvars ファイルの値ではなく、vpc_namemy-first-vpc として表示されます。

このアプローチは、自動化されたワークフローで一般的であり、-var が別の環境変数から値を取得し、変数ファイルで事前定義された値を置き換えます。

どの方法でも値が割り当てられていない変数の場合、plan または apply を実行すると Terraform がプロンプトを表示します。たとえば、vpc_namedefault がなく、-var または -var-file を使用しない場合、CLI は値の入力を求めます:

截屏2024-07-14 10.57.18.png

変数のベストプラクティス

変数を宣言する際には、以下を推奨します:

  1. インスタンスまたは環境ごとに変更される値のみをパラメーター化します。

    値を変更する明確なユースケースがある場合にのみ、変数を公開してください。過剰なパラメーター化は避けてください。モジュールはデフォルトで意見を持つ (opinionated) ようにしてください。default を持つ変数を追加することは通常、後方互換性があります。デフォルト値を変更すると動作に影響を与える可能性があり、変数を削除することは破壊的変更であり、慎重に計画する必要があります。

  2. 可能な限り .tfvars ファイルを使用します。

    ルートモジュールでは、値を設定するために変数ファイルを使用することを推奨します。ファイルと CLI フラグを切り替えて使用することは避けてください。コマンドラインオプション (-var-var-file など) は一時的なもので、忘れやすく、バージョン管理できません。変数ファイル (例: terraform.tfvars*.auto.tfvars) は予測可能であり、ソース管理にコミットできます。

  3. 変数にはその目的に関連する名前を付けます。

    数値入力 (ディスクサイズ、メモリ、期間) の場合、実用的ならば名前に単位を含めます (例: disk_size_gbbandwidth_mbpssubscription_days)。プロバイダーの API が非標準の単位を使用する場合、この規則によって期待される入力が明確になります。論理入力の場合、条件付きロジックを簡素化するために、肯定的な表現のブール値 (例: enable_ipv6) を使用します。

  4. 変数には説明が必要です。

    すべての variabledescription を含めてください。説明はプロンプトや生成されたドキュメントに表示され、新しい貢献者にコンテキストを提供し、可読性と保守性を向上させます。説明はユーザーの視点から記述してください — どのような値を、なぜ提供するのか。