参考 : https://developer.hashicorp.com/terraform/language/values/variables
入力変数は、Terraformモジュールのコードを変更せずにカスタマイズすることを可能にします。 この機能により、テラフォームの構成、モジュールを構成可能で再利用可能にしたまま詳細をプロジェクトや環境ごとに変化させることができるのです。 Terraformで変数を使うためには、1.構成のルートモジュールで変数を宣言する方法と、2.terraform cliオプション,環境変数を使用する方法の二通りあります。
従来のプログラミング言語と比較すると、以下のイメージで良いでしょう。
- 入力変数は関数引数のようなものです。
- 出力値は、関数の戻り値のようなものです。
- ローカル値は、関数の一時的なローカル変数のようなものです。
変数宣言
モジュールによって受け入れられた各入力変数は、変数を使用して宣言する必要があります
variable "image_id" { type = string } variable "availability_zone_names" { type = list(string) default = ["us-west-1a"] } variable "docker_ports" { type = list(object({ internal = number external = number protocol = string })) default = [ { internal = 8300 external = 8300 protocol = "tcp" } ] }
variable
キーワードの後のラベルは、変数の名前であり同じモジュール内のすべての変数の中で一意でなければなりません。
変数の名前は以下の予約済みキーワードをのぞいて任意の有効な識別子にすることができます (source,version,providers,count,for_each,lifecycle,depends_on,locals)
変数ブロック
Terraform CLIは、変動宣言の次のオプションの引数を定義します。
default
- 変数入力をオプションにするデフォルト値。type
- この引数は、変数に対して受け入れられる値タイプを指定します。description
- これは、入力変数を説明するコメントです。validation
-type
の制約に加えて、検証ルールを定義します。sensitive
- パスワードなど、機密情報が含まれる場合はtrue
に設定してください。nullable
- nullを許可するかどうか。
デフォルト値
変数宣言には、デフォルトの引数を含めることができます。 もしデフォルト値が存在する場合、変数はオプションであると見なされ、実行時に変数が上書きされない場合はデフォルト値が使用されます。 引数にはリテラル値(ベタガキ)である必要であり、他のオブジェクトを参照することはできません
型
変数ブロック内のタイプ引数を指定することで, 受け入れられる値のタイプを固定することができます。 タイプの制約が設定されていない場合、任意のタイプの値受け入れられますが、極力設定することをお勧めします。
- 実行時に間違ったタイプが使用されている場合、Terraformはタイプエラーメッセージを返します。
- サポートされているタイプのキーワードは次のとおりです。
- string
- number
- bool
- list(<タイプ>)
- set(<タイプ>)
- map(<タイプ>)
- object({<引数名> = <値>、...})
- tuple([<タイプ>、...])
Documentation
モジュールの入力変数はユーザーインターフェイスの一部であるため、できる限りオプションを使用して各変数の意味をわかりやすくしましょう。
variable "image_id" { type = string description = "The id of the machine image (AMI) to use for the server." }
説明は、変数の意味を簡潔に説明する必要があります。
Validationチェック
対応する変数ブロック内にvalidation
ブロックを追加することにより、特定の変数のカスタム検証ルールを追加できます。
以下の例では、ec2で使用するであろう、ami id
に正しい構文があるかどうかを確認します。
variable "image_id" { type = string description = "The id of the machine image (AMI) to use for the server." validation { condition = length(var.image_id) > 4 && substr(var.image_id, 0, 4) == "ami-" error_message = "The image_id value must be a valid AMI id, starting with \"ami-\"." } }
この機能は、terraform cli v0.13.0で導入されました。
sensitive
この機能は、Terraform v0.14.0で導入されました。
変数をsensitive
として設定すると、テラフォームがその値を画面に表示することができなくなります
ただし、画面には出ないだけでStateファイルには保存されているため気をつけてください。
variable "user_information" { type = object({ name = string address = string }) sensitive = true } resource "some_resource" "a" { name = var.user_information.name address = var.user_information.address }
Terraformがsensitiveな変数を表示するケース
機密変数は構成中心の概念であり、値は難読化なしでプロバイダーに送信されます。 従って、プロバイダー側でエラーが発生した場合、sensitiveに設定した変数でもエラーメッセージに含まれているケースがあります。
プロバイダー「フィールドの無効な値「password」」
Null許可
値nullを変数に割り当てることができます。
variable "example" { type = string nullable = false }
nullable
のデフォルト値は真です。nullableが真である場合、nullは有効な値であり、モジュールの構成は常に変数値がnullである可能性をはらんでいます。
nullable
をfalseに設定することで、変数値がnullを許可しないことを保証します
変数の使用
変数を宣言したモジュール内では、var
キーワードを前置することでその値にアクセスできます。
resource "aws_instance" "example" { instance_type = "t2.micro" ami = var.image_id }
変数に割り当てられた値は、モジュール内の式でのみアクセスできます
変数の上書き
構成のルートモジュールで変数が宣言した場合は、さまざまな方法で設定(オーバーライド)できます。
-var
オプションで設定
コマンドラインで個々の変数を指定するには、-var
オプションを使用します
このオプションはterraform plan
と terraform apply
を実行するときに適用可能です。
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"}'
また、-varオプションを1つのコマンドで複数回使用して、複数の変数を設定できます
Variable Definitions (.tfvars
) Files
多くの変数を上書き設定するには、それらの値をファイルでまとめて指定する方が便利です。
-var-file
はそのためのファイルを指定できます。
terraform apply -var-file="testing.tfvars"
image_id = "ami-abc123" availability_zone_names = [ "us-east-1a", "us-west-1c", ]
また、以下の多変数定義ファイルが存在する場合、Terraformは自動的にロードします
- 正確にterraform.tfvarsまたはterraform.tfvars.jsonという名前のファイル。
- 名前が.auto.tfvarsまたは.auto.tfvars.jsonで終了するファイル。
拡張子が.json
で終了するファイルは、代わりにJSONオブジェクトとして書き込み可能です。
{ "image_id": "ami-abc123", "availability_zone_names": ["us-west-1a", "us-west-1c"] }
TF_VAR_環境変数の定義
変数を定義する他の方法として、TF_VAR_
で始まる環境変数を定義するというやり方があります。
$ export TF_VAR_image_id=ami-abc123 $ terraform plan
$ export TF_VAR_availability_zone_names='["us-west-1b","us-west-1d"]'
https://developer.hashicorp.com/terraform/language/values/variables
page:https://minegishirei.hatenablog.com/entry/2024/06/13/082459