Terraformを始める上でのresourceの命名規則について

July 6, 2016

Terraformとは

https://www.terraform.ioここ見てください。
INFRASTRUCTURE AS CODEと書いてあります。

何が便利か

たとえばAWSの新規VPCの作成など画面ポチポチで設定していくオペレーションをコードに落とせる。

それってAPI叩けば同じでは?
PaaSが色々対応している。MySQLにも対応しているの…

伝えたいこと

たとえばVPCを構築するとして

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名をユニークな感じでやろうとしたのだけれど

by designと言われていたので、なんだか使いづらいな〜と考えていた。が

そうなのだ。そもそもこの発想で良く、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などと値を別のファイルに分けておくことで
汎用的なテンプレートが作成可能となる。しかし便利だな〜