Traffine I/O

日本語

2022-10-10

Terraform Variable

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は、任意のタイプを受け入れることを示すために使用されます。typedefaultの両方が指定されている場合、デフォルト値は指定されたタイプに変換可能でなければなりません。

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を受け入れるかどうかを指定できます。nullablefalseに設定されている場合、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オプションを使用します。

bash
$ 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オプションと共に指定します。

bash
$ terraform apply -var-file="testing.tfvars"

Variable定義ファイルは、Terraform言語ファイルと同じ基本的な構文を使用しますが、Variable名の割り当てのみが含まれます。

terraform.tfvars
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名に対応します。

terraform.tfvars.json
{
  "image_id": "ami-abc123",
  "availability_zone_names": ["us-west-1a", "us-west-1c"]
}

環境変数

Terraformでは、環境変数を使用してVariableの値を設定することができます。Terraform Variableを表す各環境変数は、Variable名に続いてTF_VAR_で始まる必要があります。

bash
$ 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

https://developer.hashicorp.com/terraform/language/values/variables

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!