Terraformと変数(variable)の話

はじめに

Terraformには汎用性、再利用性、機密性を上げるために variable が用意されています。Terraform内で ${var.変数名} という記述方法で terraform 実行時に値を渡すことができます。この値の渡し方には4種類の方法があるのですが、それぞれのやり方を本記事で紹介します。

コマンドライン引数で渡す

まずはコマンドライン引数で渡す方法です。

terraform plan \
-var 'access_key=foo' \
-var 'secret_key=bar'

terraform コマンドの apply, plan, refresh 時に渡すことができます。文字列に限らず Map や List を渡すこともできます。

Mapの例
terraform plan \
-var 'ami={ ap-northeast-1 = "ami-12345678" }'
Listの例
terraform plan \
-var 'security_group_ids=[ "sg-12345678", "sg-87654321" ]'

ファイルから渡す

terraform.tfvars というファイルを作っておけば、その中の変数の値が反映されます。中身は下のように書きます。

access_key = "foo"
secret_key = "bar"
ami = {
ap-northeast-1 = "ami-12345678" 
}
security_group_ids = [ 
"sg-12345678",
"sg-87654321" 
]

仮に terraform.tfvars というファイル以外を使いたい場合はコマンドライン引数で -var-file を指定することで読み込めます。

terraform plan -var-file base.tfvars -var-file production.tfvars

複数の -var-file を指定した場合は後勝ちになりますので注意が必要です。また、 .tfvars ファイルを意図せずバージョン管理してしまうのは危険です(アクセスキーなどを公開してしまうかもしれに)。明確な理由がなければ .gitignore には *.tfvars を入れておくと安全かもしれません。

環境変数から渡す

TF_VAR_ という接頭辞をつけることで環境変数から variable を渡すことができます。なので下のようにそれぞれ access_key, ami, security_group_ids の値を設定することができます。

TF_VAR_access_key=foo
TF_VAR_ami='{ ap-northeast-1 = "ami-12345678" }'
TF_VAR_security_group_ids='[ "sg-12345678", "sg-87654321" ]'

デフォルト値を渡す

変数の指定を特に行わなかった場合にデフォルト値を用意することもできます。 variable ブロックに default を指定することで実現できます。以下が例となります。

variable "region" {
description = "AWS region"
default = "ap-northeast-1"
}

上のどの方法でも渡さなかった場合

この場合は例えば terraform plan を実行したときにCLIから値の入力を対話形式で求められます。地味にうれしい機能ですね(ありがた迷惑な場合もあるかもしれませんが)

おわりに

ファイルや環境変数から間接的に値を渡せることがわかったかと思います。この方法を使うことで機密情報が漏洩する可能性を下げることができます。例えばCI経由で terraform コマンドが実行されるようにパイプラインを組んでいれば、そこにファイルなり環境変数なりを設定しておくことができます。

またTerraform 0.8からはProviderにVaultが追加されていますので、シークレットの管理をより効率的に行うことができそうです。

APN Consulting Partner
スーパーソフトウエアはAWSパートナーネットワーク(APN)のコンサルティングパートナーです。