본문 바로가기

IaC/Terraform

[Terraform]테라폼 Input Variables 사용법

Terraform에는 명명된 값을 요청하거나 게시하기 위한 몇 가지 종류의 블록이 포함되어 있습니다.

  • Input Variables 는 Terraform 모듈의 매개변수 역할을 하므로 사용자는 소스를 편집하지 않고도 동작을 커스터마이징할 수 있습니다. 
  • Output Values 은 Terraform 모듈의 반환(return) 값과 같습니다.
  • Local Values 은 표현식에 간단한 이름을 지정할 수 있는 편리한 기능입니다.

2023.02.07 - [IaC/Terraform] - [Terraform]테라폼 Input Variables 사용법

2023.08.14 - [IaC/Terraform] - [Terraform]테라폼 Output Values 사용법

2023.02.09 - [IaC/Terraform] - [Terraform]테라폼 Local Values 사용법

Input Variables doc  Link

사용한 terraform code
2023.02.05 - [IaC/Terraform] - [Terraform]AWS Provider로 Ubuntu AWS EC2 Instance 만들기

Input Variables

테라폼에서 사용하는 값(value)의 이름을 작성하거나 배포하기 위한 몇가지 블럭이 존재한다.

그중 아래에서 Input Variables에 대하여 알아보자.

  • Input Variables은 테라폼 모듈의 파라미터 역할을 하여 사용자가 소스를 편집하지 않고 동작을 customize할 수 있다.
  • 이 기능을 사용하면 다양한 테라폼 구성에서 모듈을 공유할 수 있으므로 모듈을 구성 및 재사용할 수 있다.

테라폼 모듈이란? doc link 모듈은 Terraform으로 리소스 구성을 패키징하고 재사용하는 주요 방법

main.tf 안에서 Input variable 설정하고 apply시 입력하기

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.0"
    }
  }
}

# Configure the AWS Provider
provider "aws" {
  region = "ap-northeast-2"
}

variable "ec2_name" {
  # 공백으로 두고 apply할때 ec2_name을 입력 받는다.  
}

# resource - instanace 
resource "aws_instance" "jeff_tf_ubuntu" {
  ami           = data.aws_ami.ubuntu.id
  instance_type = "t2.micro"
  subnet_id = "subnet-004f0791a0c0c4e57" # jeff-subnet-public-management-1a
  security_groups = [ "sg-07a2fa9eb741e42d6" ] # management
  tags = {
    Name = "var.ec2_name"
  }
}

# data - aws_ami
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
}
  • Input variable을 추가하여 apply시 ec2_name을 입력 받도록 하였다.

tf apply

➜ tf apply
var.ec2_name
  Enter a value: ec2-name-from-variable

      ~ tags                                 = {
          ~ "Name" = "jeff_tf_ubuntu" -> "ec2-name-from-variable"
        }

## 중략

Plan: 1 to add, 0 to change, 1 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

## 중략

Apply complete! Resources: 1 added, 0 changed, 1 destroyed.

결과

  • terraform apply시 입력헀던 값으로 설정됐다.

환경 변수로 Input variable 설정하기

export TF_VAR_ec2_name="ec2-name-from-env"
  • 작업 환경에서 환경 변수에 TF_VAR_[variable] 형식으로 변수를 설정할 수 있다.

tf apply

➜ tf apply
      ~ tags                                 = {
          ~ "Name" = "ec2-name-from-variable" -> "ec2-name-from-env"
        }

Plan: 1 to add, 0 to change, 1 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

Apply complete! Resources: 1 added, 0 changed, 1 destroyed.

결과

  • 환경변수에서 설정했던 값(export TF_VAR_ec2_name="ec2-name-from-env”) 이 variable값으로 설정됐다.

Variable Definition Precedence

우선순위: input(default) < env < terraform.tfvars < custom.auto.tfvars < 파일명 또는 변수 지정

아래와 같은 형식(.tfvars or .tfvars.json)으로 Variable을 정의하여 사용할 수 있다. 파일명 지정 없이도 tfvars 파일을 인식한다.

  • terraform.tfvars
  • terraform.tfvars.json
  • *.auto.tfvars
  • *.auto.tfvars.json

terraform.tfvars 으로 variable 설정하기

terraform.tfvars

ec2_name = "ec2-name-from-terraform.tfvars"

tf apply

➜ tf apply
      ~ tags                                 = {
          ~ "Name" = "ec2-name-from-env" -> "ec2-name-from-terraform.tfvars"
        }

Plan: 1 to add, 0 to change, 1 to destroy.
Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

Apply complete! Resources: 1 added, 0 changed, 1 destroyed.

custom.tfvars으로 variable 설정하기(특정 파일을 지정하여 사용)

custom.tfvars

ec2_name = "ec2-name-from-custom.tfvars"

tf apply

➜ tf apply -var-file=custom.tfvars
      ~ tags                                 = {
          ~ "Name" = "ec2-name-from-terraform.tfvars" -> "ec2-name-from-custom.tfvars"
        }

Plan: 1 to add, 0 to change, 1 to destroy.
Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

Apply complete! Resources: 1 added, 0 changed, 1 destroyed.

*.auto.tfvars으로 variable 설정하기

custom.auto.tfvars

ec2_name = "ec2-name-from-custom.auto.tfvars"

tf apply

  • 파일명 지정 없이도 tfvars 파일을 인식한다.
➜ tf apply
      ~ tags                                 = {
          ~ "Name" = "ec2-name-from-terraform.tfvars" -> "ec2-name-from-custom.auto.tfvars"
        }

Plan: 1 to add, 0 to change, 1 to destroy.
Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

Apply complete! Resources: 1 added, 0 changed, 1 destroyed.

terraform apply 명령어에서 variable 설정하기

tf apply -var

➜ tf apply -var="ec2_name=ec2-name-from-var-option"
      ~ tags                                 = {
          ~ "Name" = "ec2-name-from-terraform.tfvars" -> "ec2-name-from-var-option"
        }
  • *.tfvars 파일 없이도 variable 설정이 가능하다.

variable Arguments 사용법 - Link

  • default - A default value which then makes the variable optional.
  • type - This argument specifies what value types are accepted for the variable.
  • description - This specifies the input variable's documentation.
  • validation - A block to define validation rules, usually in addition to type constraints.
  • sensitive - Limits Terraform UI output when the variable is used in configuration.
  • nullable - Specify if the variable can be null within the module.

description

  • description - This specifies the input variable's documentation.
variable "ec2_name" {
  description = "생성되는 VPC의 이름 설정"
}

tf apply

➜ terraform apply
var.ec2_name
  생성되는 ec2의 이름 설정

  Enter a value:

type

  • type - This argument specifies what value types are accepted for the variable.
variable "ec2_name" {
  description = "생성되는 ec2의 이름 설정"
  type        = string
}

default

  • default - A default value which then makes the variable optional.
variable "vpc_name" {
  description = "생성되는 VPC의 이름 설정"
  type        = string
  default     = "ec2-name-from-input-variable"
}