IaC/Terraform

[Terraform] Variable 입력 변수

dhyuck 2022. 9. 3. 21:58
반응형

variables / 입력 변수

  • 입력 변수(Input variable)를 사용하면 테라폼 구성 파일을 수정하지 않고 유연하게 정의할 수 있습니다.
  • 입력 변수는 테라폼이 실행 되기 전에 할당되기에 인프라를 보다 안전하게 정의할 수 있습니다.
  • 변수 선언은 모든 구성파일의 모든 위치에서 가능하지만, variables.tf에서 선언 할 것을 권장합니다.

변수 선언 블럭

  • description : 변수의 목적을 문서화하는 간단한 설명
  • type : 변수의 데이터 타입
  • default : 변수의 기본 값
  • 모든 변수에 대해 description과 type을 지정하고, 가능한 경우 default까지 설정하는 것이 좋습니다.
variable "aws_region" {
  description = "AWS region"
  type        = string
  default     = "us-west-2"
}
  • 테라폼 구성에서 입력 변수를 매개변수화(parameterize)하려면 입력 변수를 선언하고 구성 파일에서 하드코딩된 정보를 변수에 대한 참조로 변경하면 됩니다.
  • var.<variable_name>으로 변수를 참조 할 수 있습니다.
  • 표현식을 문자열에 삽입하는 방법인 Interpolation(보간)“${var.cluster_name}-web-sg”와 같이 가능

변수 자료형

  • number

      variable "instance_count" {
        description = "Number of instances to provision."
        type        = number
        default     = 2
      }
  • bool

      variable "enable_vpn_gateway" {
        description = "Enable a VPN gateway in your VPC."
        type        = bool
        default     = false
      }
  • list

    • 같은 유형의 값 시퀀스, 0부터 시작하는 인덱스로 개별 항목을 참조할 수 있습니다.

      variable "public_subnet_cidr_blocks" {
      description = "Available cidr blocks for public subnets."
      type        = list(string)
      default     = [
        "10.0.1.0/24",
        "10.0.2.0/24"
      ]
      }
  • map

    • 같은 유형의 데이터를 키와 값으로 일치시키는 룩업테이블

    • 키는 항상 문자열(string)이고, type이 map(number)라면 값은 숫자이다.

    • var.resource_tags[”environment”]와 같이 사용 가능하다

      variable "resource_tags" {
      description = "Tags to set for all resources"
      type        = map(string)
      default.    = {
        project     = "project-alpha", 
        environment = "dev"
      }
      }
  • set

    • 같은 유형인 고유한 값이 저장되며 정렬되지 않는 자료형입니다.

      variable "users" {
      description = "user names"
      type        = set(string)
      default     = ["nice", "value", "lion"]
      }
  • object

    • 여러가지 타입의 value를 가질 수 있는 자료형

      variable "user_information" {
      type = object({
        no     = number
        name   = string
        leader = bool
      })
      default = {
        no     = 0,
        name   = "hyuckang"
        leader = true
      }
      }
  • tuple

    • 고정된 길이로 여러 타입의 변수를 있는 자료형

      variable "team_leader_info" {
      description = "Team leader information"
      type        = tuple([number, string, bool])
      default     = [0, "hyuckang", true]
      }

변수 할당

  • 변수에 default를 설정하지 않으면 terraform apply 이전에 변수를 지정해야 합니다. 테라폼은 unassigned variable을 지원하지 않습니다.
  • 테라폼에 변수를 전달하는 방법은 여러가지이며, 여러개의 변수가 전달되었을 경우 우선순위에 따라 가장 마지막에 찾은 값을 사용합니다.
  • 변수 할당하는 방법
    1. prompted : 할당되지 않은 변수가 있는 채로 plan, destroy, apply 할 경우 사용
    2. file : 파일명이 terraform.tfvars, *.auto.tfvars 인 파일을 생성하면 자동으로 변수가 로딩 되며, -var-file 플래그를 사용하여 다른 파일명을 가진 변수 파일도 로드 할 수 있습니다.
    3. CLI flag : CLI flag를 통해서 변수를 할당

변수 유효성 검증

  • 리소스를 선언할 때 리소스의 이름의 길이, 허용되는 문자 등의 제한이 있을 수 있다.

    이를 위해 variable 블럭 안의 validation으로 변수의 값을 사전에 검증 할 수 있다.

      variable "resource_tags" {
        description = "Tags to set for all resources"
        type        = map(string)
        default     = {
          project     = "my-project",
          environment = "dev"
        }
    
        validation {
          condition     = length(var.resource_tags["project"]) <= 16
          error_message = "The project tag must be no more than 16 characters, and only contain letters, numbers, and hyphens."
        }
      }

반응형