けけずんセルフハッキング

エンジニアっぽい雰囲気を醸しだしているかのようなブログです!

Terraform使ってみる(2) 〜 設定に変数用いて外から値を注入してみる編

概要

前回に引き続き、今回もTerraform触ってみる。 今回は設定ファイルに変数を使用し、コマンド実行時に外から値を注入してみる。

前回の記事はこちら

Terraform使ってみる

Terraformで設定ファイルに変数を使用する

公式的なサイトはこちら。 HashCorp Learn - Define Input Variables

事前準備

前回同様、任意の場所フォルダを作成する。

$ mkdir terraform-example
$ cd terraform-example

以下の内容で設定ファイル main.tf を作成する。

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 2.70"
    }
  }
}

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

resource "aws_instance"  "example" {
  ami = "ami-830c94e3"
  instance_type = "t2.micro"
}

準備おっけー。

変数定義ファイルの作成と参照

設定ファイル main.tf と同じ場所に、以下の内容で変数定義ファイル variables.tf を作成する。 ここで変数として定義しておくことで、 terraform apply コマンド実行時にオプションで変数に値を割り当てることができる。 変数の値を指定していない場合は variables.tf で定義した default 値が使用される。

variables "region" {
   default = "ap-northeast-1"
}

これで設定ファイル main.tf の中で変数の値を参照できるようになった。 設定ファイル main.tf を以下のように編集する。

provider "aws" {
  profile = "default"
-  region = "ap-northeast-1"
+  region = var.region
}

変数への値割当て

上述したように terraform apply コマンド実行時にオプションで変数に値を割り当てることができる。 以下では region という変数に ap-northeast-1 という値を割り当てている。

$ terraform apply -var 'region=ap-northeast-1'

また、変数への値の割当をファイルから行うこともできる。 以下の内容の terraform.tfvars というファイルを作成する。 terraform.tfvarsterraform apply コマンド実行時にデフォルトとして自動で読み込まれる。

region = "ap-northeast-1"

なお terraform.tfvars ではなく my-variables.tfvars といった任意の名前をつけたとき、 以下のように terraform apply コマンド実行時にオプションでファイルを指定することで、ファイルに記述された値を変数に割り当てることができる。

$ terraform apply -var-file 'my-variables.tfvars'

変数のタイプ

変数には List や Map を使用することができる。

List

こちらが変数の定義。

variable "cidrs" { default = [] }

こちらが値の割当て。

cidrs = [ "10.0.0.0/16", "10.1.0.0/16" ]

Map

こちらが変数の定義。

variable "amis" {
  type = "map"
  default = {
    "us-east-1" = "ami-b374d5a5"
    "us-west-2" = "ami-fc0b939c"
  }
}

こちらが値の割当て。

resource "aws_instance" "example" {
  ami = var.amis[var.region]
  instance_type = "t2.micro"
}

おわりに

Terraformの設定ファイルに変数を用いて、値を外部から注入してインフラを構築できるようにはなった。 ファイル内に値を直書きするのもいいけど、それだと再利用性低いので、可変な値は変数化して使いまわしできるようにしていくとよさそう。