Terraform で変数を使う
Terrafromでは変数が利用でき、variable
を定義して、値を注入する。
一番シンプルな例は次の通り。
provider "aws" { region = "ap-northeast-1" } variable "foo" {} resource "aws_s3_bucket" "s3_bucket" { bucket = "${var.foo}" acl = "private" }
variable
で foo
を宣言し、S3バケットのところで ${var.foo}
利用している。
値の注入方法
値の指定方法は次の4通りある。
- 実行時に指定
- コマンド引数による指定
- 環境変数による指定
- 設定ファイルによる指定
実行時に指定
変数を宣言した後に、terraform plan
などを実行すると、コンソールでどんな値を指定するか聞かれるので、そこで指定する。
❯ terraform plan var.foo Enter a value: bar ... + aws_s3_bucket.s3_bucket ... arn: "<computed>" bucket: "bar" force_destroy: "false" ... Plan: 1 to add, 0 to change, 0 to destroy.
コマンド引数による指定
コマンド実行時 -var
オプションを利用して値を指定する。
試しに terraform plan -var 'foo=test-bucket'
を実行してみると、ちゃんと注入されている。
環境変数による指定
TF_VAR_
のプレフィックスを付けて環境変数を設定すると、その値が変数にロードされる。
TF_VAR_foo='env-test' terraform plan
を実行すると同様の結果が得られる。
設定ファイルによる指定
変数の値を指定する設定ファイルを作成し、-var-file
で指定すると同様のことが出来る。
vars.tfvars
foo = "tfvars-file"
terraform plan -var-file=vars.tfvars
を実行すると同様の結果が得られる。
変数戦略/設計
Terrafromは *.tf
ファイルを全て読み込むので、
変数定義をvariables.tf
などに記述しておき、
実行時に-var-file
で値ファイルを指定して環境などを切り替えると良いかもしれない。
terrafrom plan -var-file=dev.tfvars
terrafrom plan -var-file=prod.tfvars
ディレクトリとか、ファイルはこんな感じにすると雰囲気はつかめると思う。
main.tf
provider "aws" { region = "ap-northeast-1" } resource "aws_s3_bucket" "s3_bucket" { bucket = "${var.foo}" acl = "private" }
variables.tf
variable "foo" {}
dev.tfvars
foo="dev-var"
prod.tfvars
foo="prod-var"
その他Tips
default
を記述するとファイルを指定しなくてもそれになる。
また、type
などで型も指定できる。
description
で、変数の説明もかけるので書いたほうがいい。
variable "foo" { type = "string" default = "default-var" description = "Sample Variable" }
References
- Input Variables - Configuration Language | Terraform by HashiCorp
- How to Use Terraform Variables (Locals, Input, Output) - Tutorial
- Terraformでmappingをmoduleに渡す方法 | Developers.IO
- Terraform 0.7でterraform_remote_stateはdeprecated扱い - kikumotoのメモ帳
- Terraformの出力を別のTerraformで利用する - Qiita
- オレオレterraformディレクトリ構成ベストプラクティス - Qiita
- terraform使い方(超基礎編) - Qiita