본문 바로가기

DevOps/Terraform

[T102 2주차] (4) 테라폼 기본 사용법(2)

cloudNet@ 팀의 가시다 님이 진행하는 테라폼 102 스터디 2주차 정리입니다.

2주차 내용: 

테라폼 기본사용법 

  • data블록이란? 
  • variable 변수를 어떻게 사용할까?
  • local 변수? 
  • vpc 관련 테라폼 실습을 통해 data블록과 variable 변수를 더 알아보자

data블록

  • 데이터 소스는 테라폼으로 정의되지 않은 외부 리소스 또는 저장된 정보를 테라폼 내에서 참조할 때 사용
  • 소스를 보면서 이해해보자.
  • local_file ( 프로바이더 = 로컬, 리소스 유형 = 파일 )
  • abc ( 고유한 이름 , 고정된 값인지 아시는분들도 있음!? )
  • { 구성 인수들 } 
  • { 구성인수 안필요해도 } ---> {}
data "local_file" "abc" {
  filename = "${path.module}/abc.txt"
}


# 데이터 소스 블록은 data로 시작, 이후 ‘데이터 소스 유형’을 정의 ← Resource 블록 정의와 유사

## 

- 데이터 소스 유형은 첫 번째 _를 기준으로 앞은 프로바이더 이름, 뒤는 프로바이더에서 제공하는 리소스 유형을 의미한다.
- 데이터 소스 유형을 선언한 뒤에는 고유한 이름을 붙인다. 리소스의 이름과 마찬가지로 이름은 동일한 유형에 대한 식별자 역할을 하므로 중복될 수 없다.
- 이름 뒤에는 데이터 소스 유형에 대한 구성 인수들은 { } 안에 선언한다. 인수가 필요하지 않은 유형도 있지만, 그때에도 { } 는 입력한다

 

테라폼 변수

  • 테라폼 HCL에서 선언하는 내용 중 변경될수 있는 요소는 변수를 사용하는것이 좋습니다.
  • 변수를 정의 하여 테라폼 파일을 손쉽게 재사용 가능합니다.
# 먼저 variable.tf 파일을 만들어봅시다.

variable "server_port" {
  description = "The port the server will use for HTTP requests"
  type        = number
  default     = 8080
}
  • 해당 파일을 main.tf의 resource 블록에서 다시 사용하려면 어떻게 할까요?

  • 이와 같이 ${var.선언한 값} 으로 사용할수 있습니다.
  • = ${var.server_port}
# main.tf를 만들어 봅시다.

provider "aws" {
  region = "ap-northeast-2"
}

resource "aws_instance" "example" {
  ami                    = "ami-0e9bfdb247cc8de84"
  instance_type          = "t2.micro"
  vpc_security_group_ids = [aws_security_group.instance.id]

  user_data = <<-EOF
              #!/bin/bash
              echo "My Web Server - var test" > index.html
              nohup busybox httpd -f -p ${var.server_port} &
              EOF

  user_data_replace_on_change = true

  tags = {
    Name = "Single-MyWebSrv"
  }
}

resource "aws_security_group" "instance" {
  name = var.security_group_name

  ingress {
    from_port   = var.server_port
    to_port     = var.server_port
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

variable "security_group_name" {
  description = "The name of the security group"
  type        = string
  default     = "terraform-my-instance"
}

output "public_ip" {
  value       = aws_instance.example.public_ip
  description = "The public IP of the Instance"
}
  • terraform init & plan & apply
aws_security_group.instance: Creating...
aws_security_group.instance: Creation complete after 2s [id=sg-0831a50908e47eb1d]
aws_instance.example: Creating...
aws_instance.example: Still creating... [10s elapsed]
aws_instance.example: Still creating... [20s elapsed]
aws_instance.example: Creation complete after 21s [id=i-023c425a128de7c45]

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

Outputs:

public_ip = "13.209.13.189"

여기까지 변수를 사용하는 방법에 대해서 알아봤습니다. 조금 더 디테일 한 부분을 살펴보겠습니다.


변수 유형

변수 유형에는 2가지 ( 단순 변수 유형과 복합 변수 유형 )이 있습니다.

  • JAVA와 같은 프로그래밍 언어의 데이터 타입과 같이 String, Number,Bool 과 같은 고유한 형태의 단순 변수유형
# 단순 변수 유형 ( number )
variable "number_example" {
  description = "An example of a number variable in Terraform"
  type        = number
  default     = 42
}

# 단순 변수 유형 ( string )
variable "string_example" {
  description = "An example of a number variable in Terraform"
  type        = string
  default     = "koo"
}

# 단순 변수 유형 ( Bool )
variable "bool-example" {
  type = bool
}
  • List, Set ,Map, Object ,Tuple과 같은 복합 변수 유형이 있습니다.
# map 복합 변수 유형
variable mymap {
  type = map(string)
  default = {
    mykey = "my value"
    yourkey = "your value"
  }
}

# list 복합 변수 유형
variable mylist {
  type = list
  default = [1,2,3]
}

# Set 복합 변수 유형
# List와 같은 형태이지만, 순서를 유지하지 않고 고유한 값만 유지
# [5,1,1,2] 리스트 -> [1,2,5] Set
variable mySet {
  type = list
  default = [1,2,3]
}


# Tuple 복합 변수 유형
# List와 같은 형태이지만, 요소 별로 다른 유형을 포함할수 있음 
# 예 =  0,string,bool
variable myTuple {
  type = list
  default = [1,"koo",false]
}

Local 변수

  • 코드 내에서 사용자가 지정한 값 또는 속성 값을 가공해 참조 가능한 local (지역 값)은 외부에서 입력되지 않고, 코드 내에서만 가공되어 동작하는 값을 선언한다.
  • ‘local’은 입력 변수와 달리 선언된 모듈 내에서만 접근 가능하고, 변수처럼 실행 시에 입력받을 수 없다.
  • 로컬은 사용자가 테라폼 코드를 구현할 때 이나 표현식을 반복적으로 사용할 수 있는 편의를 제공한다.
  • 로컬에서 필요한 파일이나 스크립트 만들어서 ec2나 kuberenetes로 밀어넣을때 유용하겠군.
variable "prefix" {
  default = "hello"
}

locals {
  name    = "terraform"
  content = "${var.prefix} ${local.name}"
  my_info = {
    age    = 20
    region = "KR"
  }
  my_nums = [1, 2, 3, 4, 5]
}

locals {
  content = "content2" # 중복 선언되었으므로 오류가 발생한다.
}
  • 로컬이 선언되는 블록은 locals로 시작한다. 선언되는 인수에 표현되는 값은 상수만이 아닌 리소스의 속성, 변수의 값들도 조합해 정의할 수 있다.
  • 동일한 tf 파일 내에서 여러 번 선언하는 것도 가능하고 여러 파일에 걸쳐 만드는 것도 가능하다.
  • 다만 lcoals에 선언한 로컬 변수 이름은 전체 루트 모듈 내에서 유일해야 한다.
  • 정의되는 속성 값은 지정된 값의 형태에 따라 다양한 유형으로 정의할 수 있다.
variable "prefix" {
  default = "hello"
}

locals {
  name    = "terraform"
  content = "${var.prefix} ${local.name}"
  my_info = {
    age    = 20
    region = "KR"
  }
  my_nums = [1, 2, 3, 4, 5]
}

# content 중복 제거

output 변수

  • 출력 변수
output "public_ip" {
  value       = aws_instance.example.public_ip
  description = "The public IP address of the web server"
}
  • 배포시 출력 내용
#
...
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

Outputs:

public_ip = "43.201.71.161"

# 직접 확인
terraform output
public_ip = "43.201.71.161"

terraform output public_ip
"43.201.71.161"

# 실습 환경 삭제
terraform destroy -auto-approve
terraform init
  • public_ip 나온것을 환경변수로 넣어서 또 다시 다른 명령어에 집어넣을수 있겠네!
  • abspath ? 
    • (참고) abspath : 파일 시스템 경로를 포함하는 문자열을 가져와 절대 경로로 변환하는 함수 - 참고
resource "local_file" "abc" {
  content  = "abc123"
  filename = "${path.module}/abc.txt"
}

output "file_id" {
  value = local_file.abc.id
}

output "file_abspath" {
  value = abspath(local_file.abc.filename)
}

여기까지 2주차 테라폼 기본 사용법에 대한 개념정리를 했다.

배운 개념을 이용하여 vpc와 vpc를 구성하는 리소스를 만드는 실습들을 해보자.