はじめに
Terraformには、汎用性、再利用性、機密性を上げるためにvariableが用意されています。
Terraform内で${var.変数名}という記述方法でterraform実行時に値を渡すことができます。
この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が追加されていますので、シークレットの管理をより効率的に行うことができそうです。


 
			


