DevOpsTerraform06. Variables

Introduction

CIDR 주소를 변수로 놓고 재사용하고 싶을 때 사용
용도:

  • 가독성을 위해 가변적인 변수만 하나의 파일로 분리
  • 여러 군데 동시에 들어가는 변수를 분리해서 관리
  • dev와 prd 환경에 prefix나 suffix만 다르고 비슷한 이름을 사용하고 싶을 때
    결론:
  • 무조건 변수는 분리해서 쓰자

main.tf에 추가

variable "subnet_cidr_block" {
	description = "subnet cidr block"
}

귀찮으면 description도 안 적어도 된다.

variable "subnet_cidr_block" {}

이렇게 놓고 사용

선언하고 다음을 수정 → var.<variable_name>

#cidr_block = "10.0.10.0/24"  # 기존 코드
cidr_block = var.subnet_cidr_block  # 바꿀 코드

Value

값 넣는 방법은 세 가지

  1. 위 코드를 그대로 실행(terraform apply)하면 변수 값을 입력하라고 나옴
terraform apply
  1. command line argument를 이용하는 방법
terraform apply -var "subnet_cidr_block=10.0.20.0/24"

이러면 변수 입력하는 메세지는 뜨지 않음.
위 두 가지 방법은 가능하다는 얘기지 저렇게 쓰지는 않을 것이다.

  1. best practice이며 대부분 사용하게 될 방법
    → 변수를 따로 파일에 지정
    Terraform이 자동으로 읽어올 파일명은 terraform.tfvars
subnet_cidr_block = "10.0.20.0/24"
terraform apply

vpc cidr block도 변수로 빼자

variable "vpc_cidr_block" {
	description = "vpc cidr block"
}
 
resource "aws_vpc" "development-vpc" {
	#cidr_block = "10.0.0.0/16"
	cidr_block = var.vpc_cidr_block
vpc_cidr_block = "10.0.0.0/16"

Use case for variables

React에서는 .env.dev.env.production으로 하듯이
dev와 prd 환경 둘로 구분해서
dev환경: terraform-dev.tfvars
prod환경: terraform-prod.tfvars
으로 할 수 있다.

그러나 테라폼의 default 파일명은 terraform.tfvars이기 때문에
이 경우에는 테라폼 실행 시 파일 이름을 parameter로 넘겨야한다.

terraofrm apply -var-file terraform-dev.tfvars

Default value

variable "subnet_cidr_block" {
	description = "subnet cidr block"
	default = "10.0.10.0/24"
}

default 값을 적어주면 Terraform이 변수 값을 찾지 못하거나 지정해놓은 것이 없을 때 사용한다.

Type Constraints

팀에서 공통으로 개발할 때 typescript처럼 변수에 type을 지정할 수도 있다.

String

variable "subnet_cidr_block" {
	description = "subnet cidr block"
	default = "10.0.10.0/24"
	type = string
}
  • type으로 number, bool, list(<TYPE>), object 등 가능
  • 대부분 string이라 지정해주지 않아도 됨

List

type = list(string)으로 바꿀 수 있다.

cidr_block = ["10.0.0.0/16", "10.0.10.0/24"]
# 참조시에는
var.cidr_block[0]  # 첫번째 값

Object

object도 가능

cidr_blocks = [
	{cidr_block = "10.0.0.0/16", name = "dev-vpc"},
	{cidr_block = "10.0.10.0/24", name = "dev-subnet"}
]

이 경우에는

variable "cidr_blocks" {
	description = "cidr blocks for vpc and subnet"
	type = list(object({
		cidr_block = string
		name = string
	}))
}

으로 type을 선언한다.

reference 할 때는

resource "aws_vpc" "dev-vpc" {
	cidr_block = var.cidr_blocks[0].cidr_block