はじめに
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が追加されていますので、シークレットの管理をより効率的に行うことができそうです。