Terraform CloudのWorkspaceに設定できる変数(Variables)の種別terraformとenvの違いを調べてみる

2023.02.14

「Terraform CloudのVariablesのcategoly terraformとenvironmentでどう違うの?」

Terraform CloudのWorkspaceには変数を設定することができます。

その際に、変数の選択できるカテゴリはEnvironment varialbeTerraform variableがあります。

初めてみた時にどう使い分けたらいいのか、疑問に思ったことがあったので違いをまとめてみます。

ざっくりまとめは以下です。

  • Terraform variable:
    • Terraformコードのvariableに渡す
  • Environment variable
    • WorkspaceのVM上に環境変数に値を渡す(ex. AWS IAMアクセスキー)

Environment variable

Terraform CloudではRunのタイミングでVMが立ち上がり、そのVM上でterraform planterraform applyが実行されます。

AWS・Google Cloud・Azureなどにリソースをデプロイしたい場合、このVM上にクラウドプロパイダーの認証情報を設定する必要があります。 (AWSであれば、IAMアクセスキーやIAMロールなど)

そんな時にEnvironment varialbeを使います。

例えば、以下のようにAWSの認証情報をWorkspaceのEnvironment varialbeとして設定したとします。

上記の設定をすることでVM上で以下のコマンドが実行され、AWSリソースの操作が可能になります。

$ export TFC_AWS_PROVIDER_AUTH=true
$ export TFC_AWS_RUN_ROLE_ARN=arn:aws:iam::[AWSアカウントID]:role/tfc-role

今回はAWS認証情報を例に上げましたが、Terraformに関する環境変数を設定する際も同様です。

例えば、TF_LOG=trueを設定してデバックログを出力した場合もEnvironment varialbeを使います。

Terraformで使用できる環境変数は以下が参考になります。

Environment Variables | Terraform | HashiCorp Developer

Terraform variable

Terraform varialbeではTerraformコード上のvarialbeに対して、値を渡したい時に使用できます。

例えば、以下のようにvarialbeが定義されていたとします。

variables.tf

variable "instance_type" {
  description = "Type of EC2 instance to use"
  default     = "t2.micro"
  type        = string
}

variable "tags" {
  description = "Tags for instances"
  type        = map
  default     = {}
}

WorkspaceのVariableに以下を設定します。 Terraform varialbeで特徴的なのは、通常の文字列の他にHCLで値を渡すこともできる点です。

varialbe "tags"map型です。Terraform varialbeでは{ "Name"="test"}といった形で値を渡すことができます。

Planの結果を確認すると、設定した値が使用されていることがわかります。

Tips: Environment varialbeのTF_VAR_nameとTerraform varialble

Terraform varialbeではTerraformコード上のvarialbeに対して、値を渡すことができると書きました。

実は、Environment variableでも実現可能です。

TerraformではTF_VAR_nameを環境変数に設定することで、Terraformコード上のvarialbeに値を渡すことができます。

例えば以下のように、環境変数を設定するとterraformコード上のinstance_typet3.mediumを渡せます。

$ export TF_VAR_instance_type=t3.medium

Terraform Cloud上で設定する場合、以下になります。

このようにTF_VAR_nameでも設定できますが、Terraformコード上のvarialbeに渡したいときはTerraform variableを使う方が良いと思います。

理由は以下です。

  • HCLを使用できる
  • 接頭辞TF_VAR_を書かなくてよい
  • どちらも設定していた場合は、Terraform variableが優先される

1つ目は、HCLが使える点です。タグのようにkey valueで渡したい時に一つの変数で済みます。 また、TF_VAR_を毎回書かなくていいので記述が楽です。

最後に、Terraform CloudのWorkspaceのVariableでどちらも設定していた場合は、Terraform variableが優先されるためです。

注意点としては、Terraform CloudをCLIで使っていてローカルでTF_VARで環境変数を設定した場合はそちらが優先されます。

優先順位の詳細は以下の公式ドキュメントをご確認ください。

Workspace Variables - Terraform Cloud | Terraform | HashiCorp Developer

ただ、機密情報を渡したい場合は、Environment Varialbeを使う必要があります。

Environment Variableで渡すことで、stateファイルに値が残らないためです。

Managing Variables - Terraform Cloud | Terraform | HashiCorp Developer

おわりに

Terraform CloudのVaribleの種類と違いについてでした。

初めて使う時に一瞬疑問に思う部分かと思います。誰かの参考になれば嬉しいです。

以上、AWS事業本部の佐藤(@chari7311)でした。

参考