Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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で指定できず、ハードコーディングするかそれなりの対応をしないといけない。

ymmy02
sprocket
"Sprocket(スプロケット)は、Webサイトにおけるコンバージョン(購入・入会・資料請求・問合せ等)を増やしたい企業様向けに、自社開発のWeb接客ツールの導入及びコンバージョン改善コンサルティングを行っている会社です。 "
https://www.sprocket.bz/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away