terraform 의 HCL(variable,arguments,output)
VARIABLE
반복되는 작업을 줄이기 위해 중복되는 값은 변수로 선언한다.
block type 을 이용한 variable
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
name = "my-vpc"
cidr = "10.0.0.0/16"
azs = ["eu-west-1a", "eu-west-1b", "eu-west-1c"]
private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
public_subnets = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]
}
vpc를 생성해 준다.
하지만 이 vpc 의 이름을 variable 이라는 block type 으로 정의해줄 것이다.
provider "aws" {
region = "eu-west-1"
}
variable "vpc_name" {
}
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
name = var.vpc_name
cidr = "10.0.0.0/16"
azs = ["eu-west-1a", "eu-west-1b", "eu-west-1c"]
private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
public_subnets = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]
}
이렇게 variable 이라는 block type 을 지정하고 block label(vpc_name)을 지정해준다.
저장후
terraform apply
실행하면
vpc 의 이름을 명령하라고 나올 것이다.
이러한 block type 으로 작성해 값을 입력받아서 사용도 가능하지만
Variable Definition Precedence(변수 정의 우선순위)
로도 가능하다. 변수의 우선순위 규칙이라고 생각해 주면 된다.
우선 순위1:Environment variables(환경 변수)
export TF_VAR_vpc_name="test"
export TF_VAR 이라는 옵션을 주면 환경변수가 생성이 된다
그리고
export TF_VAR_vpc_name="test" vpc_name의 환경 변수를 test로 지정하겠다는 뜻이다.
이번에는 입력값을 받지 않고
export TF_VAR_vpc_name = "test"를 통해서
값이 들어간 것을 알 수 있다.
우선순위2:The terraform.tfvars file, if present. (파일을 통한 선언 방식)
vi terraform.tfvars
파일을 만들고
파일 안에 내용을
vpc_name="limsangwoon"
이런식으로 정의 해준뒤 저장한다.
그리고 위에 환경 변수 실습을 통해 이미 export TF_VAR로 환경 변수를 만들 었다면
unset TF_VAR_vpc_name
으로 변수를 지워준다
그 후
terraform apply
이름이 변한 것을 알 수 있다.
우선순위3: Any *.auto.tfvars (우선 순위 하나가 위에 더 있긴 한데 json 방식을 사용하지 않을 것이기에 패스)
원래 terraform.tfvars 파일처럼 terraform 이라는 이름과 tfvars 확장자가 아니면 변수를 지정할 수 없다.
하지만 .auto.tfvars라는 확장자를 이용해서 사용한다면 이름 상관 없이 파일로 변수 선언이 가능해 진다.
파일을 생성한 후
vi kkk.auto.tfvars
내용을 작성하고
vpc_name ="king"
실행시키면
terraform apply
결과
변경 되었다는 것을 알 수 있다
ARGUMENTS
description: This specifies the input variable's documentation (협업할 때 설명하기 위해 사용하는 옵션)
이런 식으로
description 을 사용하면
이러한 출력물 또한 볼 수 있다
default: 변수의 값을 지정하지 않으면 기본적으로 들어가는 값
예시
이런식으로 default 값을 limsangwoon 으로 해두면 변수값을 지정하지 않는 경우
default 의 값이 들어간다
local 변수의 사용
지역 변수처럼 사용할 수 있는 값
locals{
common_tag = {
Project= "Network"
}
}
이런식으로 지역 변수를 설정해 준다
이렇게 설정해서
vpc 리소스의 tags 를 local.common_tags로 설정해 줄 수 있다
그럼 local 변수랑 그냥 variable 변수랑 뭐가 다른지 궁금할 수 있다
가장 큰 차이점이라고 한다면 variable은 terraform.tfvars 파일의 값을 참조하거나
TF_VAR 변수로 정의해서 사용하는 것이기에 다른 프로젝트에서도 사용이 가능하다.
하지만 local 값은 경우 현재 파일에 있는 리소스에게만 변수 값을 지정할 수 있는 것이다.
그래서 위와 같이 보통 tag 값을 지정할 때 사용한다.
output
Terraform 은 변수 이외에 출력 변수도 설정해서 원하는 값을 출력할 수 있다.
그럼 왜 써야할까?
output을 사용하면 terraform apply 결과로 내가 지정한 값들이 출력되고, .fstate 파일에도 output 값이 저장되기
때문에 원하는 정보를 개발환경에서 사용할 수 있어 좋다.
output "vpc_name" {
value = module.vpc.name
}
apply 를 진행 시키면
이러한 결과 값이 나온다
terraform.fstate 파일의 출력 내용
실습할 때 사용했던 코드
provider "aws" {
region = "eu-west-1"
}
variable "vpc_name" {
description = "이름을 입력해 주세요"
default = "limsangwoon"
}
locals {
common_tags = {
Project = "Network"
}
lim = {
Pro = "lim"
}
}
output "vpc_name" {
value = module.vpc.name
}
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
name = var.vpc_name
cidr = "10.0.0.0/16"
azs = ["eu-west-1a", "eu-west-1b", "eu-west-1c"]
private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
public_subnets = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]
tags = local.lim
}