Terraformを始める上でのresourceの命名規則について
July 6, 2016
Terraformとは
https://www.terraform.ioここ見てください。
INFRASTRUCTURE AS CODE
と書いてあります。
何が便利か
たとえばAWSの新規VPCの作成など画面ポチポチで設定していくオペレーションをコードに落とせる。
それってAPI叩けば同じでは?
PaaSが色々対応している。MySQLにも対応しているの…
伝えたいこと
たとえばVPCを構築するとして
Terraformの有識者にどうにかしてresourceの名前にvariableの値を入れる方法を教えてほしい🤔
— kenjiskywalker (@kenjiskywalker) July 5, 2016
resource "aws_vpc" "${var.prefix}-${var.environment_name}-vpc" {
cidr_block = "${var.vpc.cidr_block}"
enable_dns_hostnames = true
enable_dns_support = true
instance_tenancy = "default"
tags {
"Name" = "${var.environment_name}-vpc"
}
}
などとresource
名をユニークな感じでやろうとしたのだけれど
so this is by design.と言われればそれまでだ https://t.co/Im2kwIqiQa
— kenjiskywalker (@kenjiskywalker) July 5, 2016
by design
と言われていたので、なんだか使いづらいな〜と考えていた。が
そもそもresourceは固有な名前を設定すべきではないという思想が理解できていなかった、例えばpublicであればfoo-development-publicなどとうい名前を付けるべきではなかった
— kenjiskywalker (@kenjiskywalker) July 5, 2016
そうなのだ。そもそもこの発想で良く、resource
はあくまでTerraform内での管理するためだけの命名であるので
- vpc.tf
resource "aws_vpc" "main-vpc" {
cidr_block = "${var.vpc.cidr_block}"
enable_dns_hostnames = true
enable_dns_support = true
instance_tenancy = "default"
tags {
"Name" = "${var.environment_name}-vpc"
}
}
このようにName Tags
でユニークな情報を付与すれば良かった。
このことに気付かずresource
にひたすらvariable
の値を入れようと頑張っていた。
結局、上記のようにresource
にユニークな情報を入れない仕組みで汎用性は担保できた。
これで似たような環境も
- vpc.tf
# Create Subnet
# - ec2:CreateSubnet
resource "aws_subnet" "some-subnet-a" {
vpc_id = "${aws_vpc.main-vpc.id}"
cidr_block = "${var.vpc.public_subnet_a}"
availability_zone = "${var.availability_zone.a}"
tags {
Name = "${var.environment_name}-some-subnet-a"
}
}
- variables.tf
variable "region" {
default = "ap-northeast-1"
}
variable "environment_name" {
default = "development"
}
variable "availability_zone" {
default = {
a = "ap-northeast-1a"
c = "ap-northeast-1c"
}
}
variable "vpc" {
default = {
cidr_block = "10.200.0.0/16"
some_subnet_a = "10.200.210.0/24"
some_subnet_c = "10.200.211.0/24"
}
}
上記のようにvariables.tf
などと値を別のファイルに分けておくことで
汎用的なテンプレートが作成可能となる。しかし便利だな〜