概要
これまでの例では、リソース引数にハードコーディングされた値を使用していました。入力変数を使用することで、構成をパラメーター化し、コードを標準化し、apply ステップでリソースのプロパティをカスタマイズできます。
入力変数には、次の利点があります。
-
再利用性の向上
入力変数は属性の割り当てをソースコードから分離するため、同じ構成を変更することなくカスタマイズして共有できます。
-
柔軟性の向上
変数を定義した後、環境変数、CLI オプション、キーと値のファイルなど、いくつかの方法でランタイムにその値を設定できます。次の例では、名前、説明、および CIDR ブロックがハードコーディングされています。これらの引数のいずれかを変数として宣言し、ランタイムにその値を指定できます。
resource "alicloud_vpc" "my_vpc" {
vpc_name = "main-vpc"
cidr_block = "10.0.0.0/16"
description = "my first vpc network"
}
変数の構文
入力変数は `variable` ブロックを使用して宣言します。
入力変数は variable ブロックで宣言します。モジュールのすべての変数宣言は、variables.tf という名前の単一ファイルにまとめることをお勧めします。
variable キーワードに続くラベルが変数名です。変数名には、2 つのルールがあります。
-
モジュール内で一意であること。
変数名は、同じモジュール内のすべての変数の中で一意である必要があります。子モジュールの変数は、それぞれが別のスコープに存在するため、親モジュールの変数と同じ名前を持つことができます。
-
予約キーワードでないこと。
変数名には、メタ引数である
countやfor_eachなど、Terraform の予約キーワードを使用できません。
必須の引数がないため、variable ブロックは空にできます。デフォルト値を省略した場合、Terraform はランタイムで指定する値から変数の型を推論します。
タイプ
type 引数は、変数が受け入れる値の型を指定します。Terraform は、以下のプリミティブ型をサポートします。
-
bool:
trueまたはfalseのいずれかのブール値です (引用符なし)。 -
number:数値です。
-
string:テキスト文字のシーケンスです。
デフォルト
default 引数は、変数にデフォルト値を割り当て、その変数を省略可能にします。
モジュール内で宣言された変数の値にアクセスするには、式 var. を使用します。 次の例では、vpc_cidr_block 変数はリソースブロックで var.vpc_cidr_block として参照され、cidr_block 引数に割り当てられます。 リソースは、引用符で囲まれた変数のデフォルト値を使用します。
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 ブロック内の変数名は、resource ブロック内のリファレンスと一致する必要があります。環境変数、.tfvars ファイル、または -var CLI オプションを使用してデフォルト値をオーバーライドできます。例えば、
# -var CLI オプションを使用してデフォルト値をオーバーライドする
$ terraform plan -var 'vpc_cidr_block=172.16.0.0/16'説明
description 引数は、変数の用途を記述します。変数に default 値がない場合、Terraform は plan または apply 操作中に値の入力を求める際に、この説明を表示します。
$ terraform plan
var.vpc_cidr_block
A CIDR block for the VPC.
Enter a value:description 文字列は、ドキュメントに含められることが多く、変数の目的と期待される値を説明するためのものです。メンテナーの視点からではなく、ユーザーの視点から記述してください。メンテナー向けの注釈には、コードコメントを使用してください。
センシティブ
sensitive 引数を true に設定すると、Terraform はコマンド出力またはログファイルに変数の値を表示しなくなります。値は terraform plan および terraform apply の出力ではマスクされます。
データベースの認証情報、AccessKey ペア、ログインパスワードなどの機密情報には、この引数を使用します。変数を機密としてマークすると、機密データが誤って漏洩するリスクを軽減できます。
この例では、vpc_cidr_block 変数は機密として設定されています。リソース my-vpc はこの変数を使用します。terraform plan または apply を実行すると、値は表示されません:
$ 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.検証
変数に割り当てられた値を検証するには、variable ブロック内に 1 つ以上の validation サブブロックを含めます。各 validation ブロックには、入力規則を指定する condition 引数が含まれます。
次の例では、length 関数と substr 関数を condition として使用し、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 を入力すると、入力規則がトリガーされ、指定されたエラーメッセージが返されます:
Error: Invalid value for variable
on main.tf line 66:
66: variable "vpc_name" {
var.vpc_name is "my-vpc"
The VPC name must start with 'tf-' and be longer than 4 characters.
This was checked by the validation rule at main.tf:67,3-13.
変数の設定
ランタイムにいくつかの方法で変数の値を設定できます。
# .tfvars ファイル (推奨)
$ terraform apply -var-file my-vars.tfvars
# CLI オプション
$ terraform apply -var vpc_cidr_block="172.16.0.0/16"
# 環境変数
$ export TF_VAR_vpc_cidr_block="172.16.0.0/16"
$ terraform apply
# デフォルトの変数ファイル terraform.tfvars
$ terraform apply
`.tfvars` ファイルを使用すると、変数セットをすばやく切り替えたり、バージョン管理したりできます。CLI オプションは、単純な構成の迅速な検証に適しています。環境変数は、スクリプトやパイプラインでうまく機能します。必須の変数がどの方法でも設定されていない場合、CLI は値の入力を求めるプロンプトを表示します。
多くの変数、特に複雑な型の変数を定義する必要がある場合、CLI オプションは扱いにくくなります。代わりに、拡張子が .tfvars または .tfvars.json のファイルに変数の値をキーと値のペアとして指定し、terraform plan または terraform apply を実行する際に、-var-file オプションを使用してファイルを渡します:
$ terraform plan -var-file my-vars.tfvars.tfvars または .tfvars.json 拡張子を持つファイルでの変数の定義は HCL と同じ構文に従いますが、含まれるのは変数名への割り当てのみです。注目すべきは、Terraform は plan または apply コマンドを実行すると、terraform.tfvars、terraform.tfvars.json、.auto.tfvars、または .auto.tfvars.json という名前の変数ファイルを自動的にロードするため、-var-file オプションを使用する必要がなくなります。.tfvars ファイル内の定義は、変数のデフォルト値および環境変数による定義をオーバーライドします。コマンドラインで .tfvars ファイルで定義された変数の値をオーバーライドするには、-var オプションを -var="<variable_name>=<variable_value>" というフォーマットで使用できます。たとえば、terraform plan の実行時に vpc_name を "my-first-vpc" として指定するには、次の方法を使用します。
$ terraform plan -var 'vpc_name=my-first-vpc'すると、terraform plan の出力には、.tfvars ファイルで定義されている my-vpc ではなく、vpc_name の値として my-first-vpc が表示されます。これは、自動化されたパイプラインで、事前定義された値をオーバーライドするために -var フラグに値を動的に渡す場合に役立ちます。
-var CLI オプションは最も優先順位が高く、他の任意の方法で設定された値をオーバーライドします。
plan または apply を実行する際に、default 値が設定されていない必須の変数にどの方法でも値が割り当てられていないと、Terraform は値の入力を求めるプロンプトを表示します。 たとえば、vpc_name に値が割り当てられていない場合、CLI は入力を求めるプロンプトを表示します。
$ terraform plan
var.vpc_name
Enter a value:
ベストプラクティス
変数を宣言する際は、以下のベストプラクティスに従ってください。
-
変更が必要なものだけをパラメーター化する
インスタンスや環境間で変更する必要がある場合にのみ変数を公開してください。過度なパラメーター化は避けてください。`default` 値を持つ変数の追加や変更は下位互換性がありますが、変数の削除は破壊的変更です。
-
ルートモジュールには .tfvars ファイルを優先的に使用する
ルートモジュールでは、`.tfvars` ファイルを使用して変数の値を設定してください。変数ファイルとコマンドラインオプションを交互に使用することは避けてください。CLI オプションは一時的で忘れやすく、バージョン管理にコミットできません。デフォルトの変数ファイルの方が予測可能です。
-
目的に応じて変数に名前を付ける
ディスクサイズ、メモリサイズ、支払い期間などの数値変数については、変数名に単位を含めてください。Alibaba Cloud OpenAPI には標準単位がないため、この規則に従うことで、メンテナーが期待される入力単位を明確にできます。論理変数については、`enable_ipv6` のような肯定的な名前を使用して、条件ロジックを簡素化してください。
-
すべての変数に説明を提供する
説明はドキュメントに自動的に含まれ、新しい開発者にコンテキストを提供するため、Terraform 構成の可読性と保守性が向上します。