Terraform Variable
Terraform Variableは、インフラストラクチャをコード化する柔軟で動的な手法を提供します。ソースコードを変更せずにモジュールをカスタマイズする方法を提供し、異なる構成で再利用可能なモジュールを作成することができます。Variableはルートモジュールで宣言され、CLIオプションや環境変数を使用して値を割り当てることができます。
Variableの宣言
Terraformでは、variable
ブロックを使用してVariableを宣言します。Variableには一意のラベルが必要であり、これがVariableの名前となります。このラベルは、モジュールの外部から値を割り当てるために使用され、モジュール内で値を参照するためにも使用されます。
以下は、さまざまなタイプのVariable宣言を示す例です。
variable "account_id" {}
variable "instance_id" {
type = string
}
variable "subnet_ids" {
type = list(string)
default = ["subnet-0a4b1f2c3d4e5f6g"]
}
variable "security_group_settings" {
type = list(object({
rule = number
port_range = number
protocol = string
}))
default = [
{
rule = 22
port_range = 22
protocol = "tcp"
}
]
}
Variableの引数
Terraform CLIでは、Variable宣言に対して次のオプション引数が定義されています。
default
:Variableをオプションにするデフォルト値。type
:Variableが受け入れる値のタイプを指定します。description
:Variableのドキュメントを指定します。validation
:検証ルールを定義するブロックであり、通常はタイプ制約に加えて使用されます。sensitive
:Variableが構成で使用される場合にTerraform UI出力を制限します。nullable
:モジュール内でVariableがnull可能かどうかを指定します。
デフォルト値
Variable宣言にはdefault
引数を含めることができ、Variableをオプションにすることができます。モジュールを呼び出すかTerraformを実行する際に値が設定されない場合、デフォルト値が使用されます。default
引数はリテラル値を必要とし、他の構成オブジェクトを参照することはできません。
variable "instance_type" {
type = string
default = "t2.micro"
}
タイプ制約
variable
ブロック内のtype
引数は、Variableが受け入れる値のタイプを制限します。タイプ制約が設定されていない場合、任意のタイプの値を受け入れます。タイプ制約は必須ではありませんが、ユーザーに明確さを提供し、Terraformからの役立つエラーメッセージを可能にするために推奨されます。
タイプ制約は、タイプキーワードとタイプコンストラクタの組み合わせで作成されます。サポートされているタイプキーワードは次のとおりです。
string
number
bool
タイプコンストラクタを使用すると、コレクションなどの複雑な型を指定できます。
list(<TYPE>)
set(<TYPE>)
map(<TYPE>)
object({<ATTR NAME> = <TYPE>, ... })
tuple([<TYPE>, ...])
キーワードany
は、任意のタイプを受け入れることを示すために使用されます。type
とdefault
の両方が指定されている場合、デフォルト値は指定されたタイプに変換可能でなければなりません。
Variableのドキュメント
モジュールのユーザーに明確さを提供するために、description
引数を使用してVariableの目的と期待される値を説明することができます。
variable "image_id" {
type = string
description = "The id of the machine image (AMI) to use for the server."
}
カスタム検証ルール
variable
ブロック内にvalidation
ブロックを追加することで、Variableのカスタム検証ルールを指定することができます。
以下はインスタンスIDの構文をチェックする検証ルールの例です。
variable "instance_id" {
type = string
description = "The ID of the EC2 instance to manage."
validation {
condition = length(var.instance_id) > 4 && substr(var.instance_id, 0, 4) == "i-"
error_message = "The instance_id value must be a valid instance ID, starting with \"i-\"."
}
}
CLI出力での値の非表示
sensitive
引数を使用すると、Terraformがplan
またはapply
の出力でVariableの値を表示しないようにすることができます。この引数は、コンソールに表示される可能性のある機密データを非表示にする場合に便利です。
variable "database_password" {
type = string
sensitive = true
}
null値の禁止
nullable
引数を使用すると、Variableがnull
を受け入れるかどうかを指定できます。nullable
がfalse
に設定されている場合、Variableの値はモジュール内で決してnull
になりません。nullable
のデフォルト値はtrue
です。
variable "subnet_id" {
type = string
nullable = false
}
Variable値の使用と割り当て
宣言されたVariableの値は、Terraformの構成内でさまざまな方法でアクセスおよび操作することができます。
Variable値のアクセス
Variableを宣言したモジュールでは、式内でVariableの値にアクセスするためにvar.<NAME>
の構文を使用できます。<NAME>
は宣言ブロックで指定されたラベルと一致する必要があります。
resource "aws_instance" "example" {
instance_type = "t2.micro"
ami = var.ami_id
}
このアクセスは、Variableが宣言されたモジュールに制限されます。
ルートモジュールVariableへの値の割り当て
構成のルートモジュールで宣言されたVariableには、次の方法で値を設定できます。
- Terraform Cloudワークスペース
- コマンドラインオプション
-var
- Variable定義ファイル(
.tfvars
) - 環境変数
コマンドラインでのVariable
コマンドラインで個々のVariableを指定するには、terraform plan
コマンドやterraform apply
コマンドを実行する際に-var
オプションを使用します。
$ terraform apply -var="image_id=ami-abc123"
$ terraform apply -var='image_id_list=["ami-abc123","ami-def456"]' -var="instance_type=t2.micro"
$ terraform apply -var='image_id_map={"us-east-1":"ami-abc123","us-east-2":"ami-def456"}'
Variable定義(.tfvars)ファイル
複数のVariableを一度に設定するためには、Variable定義ファイル(.tfvars
または.tfvars.json
で終わる)に値を指定し、そのファイルをコマンドラインで-var-file
オプションと共に指定します。
$ terraform apply -var-file="testing.tfvars"
Variable定義ファイルは、Terraform言語ファイルと同じ基本的な構文を使用しますが、Variable名の割り当てのみが含まれます。
image_id = "ami-abc123"
availability_zone_names = [
"us-east-1a",
"us-west-1c",
]
Terraformはまた、次のファイルが存在する場合、自動的にいくつかのVariable定義ファイルを読み込みます。
terraform.tfvars
またはterraform.tfvars.json
という名前のファイル。.auto.tfvars
または.auto.tfvars.json
で終わる任意のファイル。
.json
で終わるファイルは、JSONオブジェクトとして解析され、ルートオブジェクトのプロパティがVariable名に対応します。
{
"image_id": "ami-abc123",
"availability_zone_names": ["us-west-1a", "us-west-1c"]
}
環境変数
Terraformでは、環境変数を使用してVariableの値を設定することができます。Terraform Variableを表す各環境変数は、Variable名に続いてTF_VAR_
で始まる必要があります。
$ export TF_VAR_image_id=ami-abc123
$ terraform plan
...
これは、Terraformを自動化された環境で実行する場合や、構成外で機密情報を保存する必要がある場合に特に便利です。
Variable定義の優先順位
Variableの設定方法は、任意の組み合わせで共に使用することができます。同じVariableに複数の値が割り当てられている場合、Terraformは最後に見つかった値を使用し、以前の値を上書きします。ただし、同じVariableには単一のソース内で複数の値を割り当てることはできません。
Terraformは次の順序でVariableを読み込みます。後のソースが前のソースより優先されます。
- 環境変数
terraform.tfvars
ファイル(存在する場合)terraform.tfvars.json
ファイル(存在する場合).auto.tfvars
および.auto.tfvars.json
ファイル(ファイル名の辞書順で処理)- コマンドラインの
-var
および-var-file
オプション(指定された順序で)
References