LoginSignup
93
34

More than 3 years have passed since last update.

Terraformの「ここはvariable使えないのか...」となった所

Last updated at Posted at 2019-09-29

Terraformってすごいツールですよね。ブラウザコンソールとかで一個ずつちまちま作らずともコマンド一発で一連のインフラができてしまいます。
ソースを落としてきてterraform.tfvarsの variable を編集して terraform init, terrafrom apply で構築完了するように設計しようとしていたのですが、ところどころvariableが使えない箇所でハマったので備忘録としてメモ。

TL;DR

  • プロバイダーバージョンの指定にはvariableは使えない。
  • バックエンドの定義にはvariableは使えない。
  • terraform init で必要な定義はvariableで指定できない。

プロバイダーのバージョン指定

issueでのコメントによると

provider "aws" {
  version = "${var.aws_provider_version}"
  region  = "${var.aws_region}"
}

このようにproviderのversionのvariableによる定義はダメらしく、

provider "aws" {
  version = "~> 2.0"
  region  = "${var.aws_region}"
}

としないといけない仕様らしい。ここは大人しくハードコーディングにて対応しました...。

バックエンドの定義

terraform.apply をすると構築したインフラの状態がJSON形式で記された terraform.tfstate が作成されるが、バックエンドを定義すると、このtfstateファイルをS3バケットなどに保存して管理できる。

terraform {
  backend "s3" {
    bucket = "${var.bucket_name}"
    key    = "${var.key}"
    region = "${var.region}"
  }
}

といきたいところだがこれもやはりダメらしい...

解決策1: 大人しくハードコーディング

一番簡単な解決策。

terraform {
  backend "s3" {
    bucket = "mybucket"
    key    = "path/to/terraform.tfstate"
    region = "us-east-1"
  }
}

この人が「なんでこれハードコーディングせなあかんねん」と代わりに文句を言ってくれている。

解決策2: terraform init 実行時に -backend-config にて指定

Command-line key/value pairs: Key/value pairs can be specified via the init command line. Note that many shells retain command-line flags in a history file, so this isn't recommended for secrets. To specify a single key/value pair, use the -backend-config="KEY=VALUE" option when running terraform init.

ドキュメントに書いてあるように terrarfom init 実行時に -backend-config で指定することが可能。

main.tf
terraform {
  backend "s3" {
  }
}

としておいて

$ terraform init -backend-config="bucket=backend.bucket" \
                 -backend-config="key=path/to/terraform.tfstate" \
                 -backend-config="region=us-east-1"

のように terraform init を実行。

解決策3: 別ファイルに設定を書く

issueのコメントで言われているように変数を別のファイルに書いておいて terraform init 時に読み込ませる方法がある。

main.tf
terraform {
  backend "s3" {
  }
}
production.tfbackend
bucket = "mybucket"
key    = "path/to/terraform.tfstate"
region = "us-east-1"

としておいて

$ terraform init -reconfigure -backend-config=production.tfbackend

のように実行する。

まとめ

variableの値の反映は terraform planterraform apply などのタイミングで行われるようで terraform init で必要な定義はvariableで指定できず、ハードコーディングするかそれなりの対応をしないといけない。

93
34
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
93
34