プログラミング学習サイト

プログラミングの学習を開始される方を対象としたプログラミング入門サイトです。

Terraformの入力変数について

参考 : 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 planterraform 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