Terraform で変数を使う

Terrafromでは変数が利用でき、variableを定義して、値を注入する。 一番シンプルな例は次の通り。

provider "aws" {
  region = "ap-northeast-1"
}

variable "foo" {}

resource "aws_s3_bucket" "s3_bucket" {
  bucket = "${var.foo}"
  acl = "private"
}

variablefoo を宣言し、S3バケットのところで ${var.foo} 利用している。

値の注入方法

値の指定方法は次の4通りある。

  1. 実行時に指定
  2. コマンド引数による指定
  3. 環境変数による指定
  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