Terraform で変数を扱う
Terraform では "variable" といういわゆる変数を定義して、『.tfvars』の拡張子を持つ外部ファイルから値を読み込むことが出来ます。
たとえば、以下のような感じです。
$ terraform plan -var-file sample.tfvars
そして、terraform.tfvars は外部ファイルの中でも特別なファイルで、上記のように引数に指定しなくても自動的に読み込まれます。
環境情報は外出しが基本
なぜ、環境情報を外部ファイルにできれば、prd/stg/dev といった環境を構築する時、prd.tfvars, stg.tfvars, dev.tfvars を用意するだけ事足ります。
Terraform が活用されている理由の一つは簡単に複数面の環境を用意できるところにあります。
実際にやってみましょう
VPC だけを構築する以下の main.tf から始めたいと思います。
main.tf
# Terraform のバージョン指定
terraform {
required_version = "= 0.12.26"
}
# Provider 指定
provider "aws" {
version = "2.66.0"
access_key = "XXXXXXXXXXXXXXXXXX"
secret_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXX"
region = "eu-west-1"
}
# VPC の作成
resource "aws_vpc" "vpc" {
cidr_block = "10.0.0.0/16"
instance_tenancy = "default"
enable_dns_support = "true"
enable_dns_hostnames = "false"
tags = {
Name = "terraform-vpc"
}
}
まずは、terraform.tfvars に環境情報を移しましょう。
terraform.tfvars
aws_access_key = "XXXXXXXXXXXXXXXXXXXX"
aws_secret_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
aws_region = "eu-west-1"
aws_vpc_cidr = "10.0.0.0/16"
aws_vpc_tags_name = "terraform-vpc"
そして、main.tf の方は値を受け取るために variable xxxxx {} で事前に変数を定義しておく必要があります。
ちなみに、terraform fmt で自動的にコードを整形してくれます。
main.tf
# 変数定義
variable aws_access_key {}
variable aws_secret_key {}
variable aws_region {}
variable aws_vpc_cidr {}
variable aws_vpc_tags_name {}
# Terraform のバージョン指定
terraform {
required_version = "= 0.12.26"
}
# Provider 指定
provider "aws" {
version = "2.66.0"
access_key = var.aws_access_key
secret_key = var.aws_secret_key
region = var.aws_region
}
# VPC の作成
resource "aws_vpc" "vpc" {
cidr_block = var.aws_vpc_cidr
instance_tenancy = "default"
enable_dns_support = "true"
enable_dns_hostnames = "false"
tags = {
Name = var.aws_vpc_tags_name
}
}
terraform plan の実行
$ terraform plan
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create
...
Plan: 1 to add, 0 to change, 0 to destroy.
コマンド実行に失敗する場合は、.terraform フォルダが存在するか確認し、存在しなければ、terraform init を実行しておきましょう。
terraform apply の実行
$ terraform apply
...
Enter a value: yes
aws_vpc.vpc: Creating...
aws_vpc.vpc: Still creating... [10s elapsed]
aws_vpc.vpc: Creation complete after 13s [id=vpc-02d47954b623060fa]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
コンソールでも VPC が作成されていることを確認したら、destroy しておきましょう。
$ terraform destroy
まだ、続きます。
さらに応用で variables.tf もあります
ここまでで何となく想像できるかと思いますが、変数が増えると variable xxxxxx {} も増えてしまい邪魔ですね。
variables.tf は、variable xxxxxx {} を外出しするためのものです。
いや~、terraform を開発している方々は本当に頭が良いですね。便利になるように作りこまれていると感じます。
variables.tf
variable aws_access_key {}
variable aws_secret_key {}
variable aws_region {}
variable aws_vpc_cidr {}
variable aws_vpc_tags_name {}
main.tf
# Terraform のバージョン指定
terraform {
required_version = "= 0.12.26"
}
# Provider 指定
provider "aws" {
version = "2.66.0"
access_key = var.aws_access_key
secret_key = var.aws_secret_key
region = var.aws_region
}
# VPC の作成
resource "aws_vpc" "vpc" {
cidr_block = var.aws_vpc_cidr
instance_tenancy = "default"
enable_dns_support = "true"
enable_dns_hostnames = "false"
tags = {
Name = var.aws_vpc_tags_name
}
}
terraform plan, terraform apply を実行
$ terraform plan
Plan: 1 to add, 0 to change, 0 to destroy.
$ terraform apply
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
無事にコマンドの実行も成功しました。
まとめ
今回やったことは、前回「Terraform VPC編」の続きでした。
これから色々な AWS 環境を構築する前に、事前に重要な環境情報を外出しするという目的が果たせました。
これで、Git push する前に『*.tfvars』を .gitignore に指定すれば除外することが出来ますね。
Terraform で環境情報、変数定義を外だしする
|-- main.tf
|-- terraform.tfvars
|-- variables.tf
Terraform は動かしていて、なんか楽しい!
これから、もっと複雑な Terraform tree が作れるよう頑張りたいと思います。
VPCTerraform