본문 바로가기

Terraform

[Terraform] Terrform 사용법 데이터소스 / 변수(Variable)

이번에는 데이터소스와 변수에 대해서 알아보겠습니다.

 

 

데이터소스

데이터소스는 테라폼으로 정의되지 않은 외부 리소스 또는 저장된 정보를 테라폼 내에서 참조할 때 사용합니다.

 

데이터소스의 구성은 아래와 같이 구성을 할 수 있습니다.

또한, data 로 시작하고 "데이터 소스 유형"을 정의합니다.

# Terraform Code
data "<리소스 유형>" "<이름>" {
  <인수> = <값>
}

 

참조하기 위해서는 data.<리소스 유형>.<이름>.<속성> 를 사용합니다.

 

예를 들면 아래와 같이 최신 AWS AMI 버전을 가져 온 후 ec2를 생성 합니다. 

// AWS AMI 최신 버전 가져오는 data soruce
data "aws_ami" "ubuntu" {
  most_recent = true

  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
  }

  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }

  owners = ["099720109477"] # Canonical
}

// 위에 설정한 data soruce를 참조해서 ec2 생성
esource "aws_instance" "example" {
  //위에 설정한 AMI로 생성
  ami                    = data.aws_ami.ubuntu.id
  //EC2 type 지정
  instance_type          = "t2.micro"

  //Tag 이름
  tags = {
    Name = "blog-ec2"
  }
}

 


변수 Variable

변수는 인프라를 구성하는 데 필요한 속성 값을 정의해 코드의 변경 없이 여러 인프라를 생성하는 데 목적이 있습니다.

테라폼에서는 이것을 입력 변수 Input Variables 로 정의하고 terrafrom plan에서 수행을 합니다. 

 

변수 선언 방식은 아래 variable으로 시작하는 블록으로 구성이 되어 있습니다.

변수 블록 뒤의 이름 값은 동일 모듈 내 모든 변수 선언에서 고유해야 하며, 이 이름으로 다른 코드 내에서 참조가 됩니다.

# variable 블록 선언의 예
variable "<이름>" {
 <인수> = <값>
}

variable "image_id" {
 type = string
}

주의 사항은 테라폼의 예약 변수 이름으로는 사용이 불가능합니다. 

예약 변수들은 source, version, providers, count, for_each, lifecycle, depends_on, locals 입니다.

 

변수 정의 시 사용 가능한 메타인수

  • default : 변수 값을 전달하는 여러 가지 방법을 지정하지 않으면 기본값이 전달됨, 기본값이 없으면 대화식으로 사용자에게 변수에 대한 정보를 물어봄
  • type : 변수에 허용되는 값 유형 정의, string number bool list map set object tuple 와 유형을 지정하지 않으면 any 유형으로 간주
  • description : 입력 변수의 설명
  • validation : 변수 선언의 제약조건을 추가해 유효성 검사 규칙을 정의
  • sensitive : 민감한 변수 값임을 알리고 테라폼의 출력문에서 값 노출을 제한 (암호 등 민감 데이터의 경우)
  • nullable : 변수에 값이 없어도 됨을 지정 가능

유효성 검사

입력되는 변수 타입 지징 이외, 사용자 지정 유효성 검사가 가능합니다.

  • 변수 블록 내에 validation 블록에서 조건인 condition에 지정되는 규칙이 true 또는 false를 반환해야 하며, error_message는 condition 값의 결과가 false 인 경우 출력되는 메시지를 정의 합니다.
  • regex 함수는 대상의 문자열에 정규식을 적용하고 일치하는 문자열을 반환하는데, 여기에 can 함수를 함께 사용하면 정규식에 일치하지 않는 경우의 오류를 검출 합니다.
  • validation 블록은 중복으로 선언할 수 있습니다.

변수에서 사용가능한 데이터 타입

  • string : 글자 유형
  • number : 숫자 유형
  • bool : true 또는 false
  • any : 명시적으로 모든 유형이 허용됨을 표시
  • list (<유형>): 인덱스 기반 집합
  • map (<유형>): 값 = 속성 기반 집합이며 키값 기준 정렬
  • set (<유형>): 값 기반 집합이며 정렬 키값 기준 정렬
  • object ({<인수 이름>=<유형>, …})
  • tuple ([<유형>, …])