카테고리 없음

terraform 의 HCL(variable,arguments,output)

sangwoon 2022. 5. 20. 23:51

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
}