본문 바로가기

DevOps

[AWS EKS] EKS IaC with Terraform (1)

CloudNet@팀의 EKS 스터디 AEWS 2기에 작성된 자료를 토대로 작성합니다.
IAC

▶ IAC ( infrastructure as a code )

아래 그림중 몇번째 단계를 말할까요? 

 

4번째 단계인 Cloud 단계부터 인프라를 더이상 소유하지 않고 상품화 된 인프라와 데이터 센터를 사용하는 단계부터 IAC 개념이 크게 도입되기 시작했습니다. API를 통해 더 많은 기술 계층을 가상화 하고 더많은 소프트웨어와 자동화 기술로 지금의 데이터 센터를 포함한 이외의 환경을 제공 할수 있기 때문이죠.

 

테라폼

테라폼은 인프라스트럭처를 코드로서 정의, 관리 및 프로비저닝 합니다.

테라폼  준비물

 

✅ terraform

✅ aws cli & eksctl &  watch, jq ,tree 등  https://themapisto.tistory.com/195

 

테라폼 설치

  • 맥 os 기준으로 설치
# tfenv 설치
brew install tfenv

# 설치 가능 버전 리스트 확인
tfenv list-remote

# 테라폼 1.5.1 버전 설치
tfenv install 1.8.1

# 테라폼 1.5.1 버전 사용 설정 
tfenv use 1.8.1

# tfenv로 설치한 버전 확인
tfenv list

# 테라폼 버전 정보 확인
terraform version

# 자동완성
terraform -install-autocomplete
## 참고 .zshrc 에 아래 추가됨
cat ~/.zshrc
autoload -U +X bashcompinit && bashcompinit
complete -o nospace -C /usr/local/bin/terraform terraform
  • 설치완료
 koo  ~/Desktop/toy   main  tfenv list

* 1.3.2 (set by /opt/homebrew/Cellar/tfenv/3.0.0/version)
 koo  ~/Desktop/toy   main  terraform version

Terraform v1.3.2
on darwin_arm64

테라폼  기본 사용법 

 

[T102 1주차] (3) 테라폼 기본 사용법(1)

cloudNet@ 팀의 가시다 님이 진행하는 테라폼 102 스터디 1주차 정리입니다. 1주차 내용: 테라폼 HCL 분석 1. 테라폼 HCL HCL이란? hashiCorp Configuration Language은 하시코프사에서 IaC와 구성 정보를 명시하기

themapisto.tistory.com

HCL 

hashiCorp Configuration Language은 하시코프사에서 IaC와 구성 정보를 명시하기 위해 개발된 오픈 소스 도구이다

오픈소스 도구라고 하면 이해하기 모호해서, 개인적으론 테라폼에서 쓰이는 언어로 이해한다.

 

 

Java나 python처럼 웹 개발 언어와 마찬가지로 조건문, 반복문 등 기본적인 코딩 언어 특성을 가지고 있다.

Block (블록)

테라폼 블록이란?

 

테라폼 버전이나 , 프로바이더 버전과 같은 값들을 설정하고, 멱등성을 보장하기 위해서 이러한 부분을 명시적으로 선언하고

필요 조건들을 입력하여, 실행오류를 최소화 하기 위해 사용된다.

 

 예시

terraform {
  required_version = "~> 1.3.0" # 테라폼 버전

  required_providers { # 프로바이더 버전을 나열
    random = {
      version = ">= 3.0.0, < 3.1.0"
    }
    aws = {
      version = "4.2.0"
    }
  }

  cloud { # Cloud/Enterprise 같은 원격 실행을 위한 정보
    organization = "<MY_ORG_NAME>"
    workspaces {
      name = "my-first-workspace"
    }
  }

  backend "local" { # state를 보관하는 위치를 지정
    path = "relative/path/to/terraform.tfstate"
  }
}

 

  백엔드 블록

terraform {
  backend "local" {
    path = "state/terraform.tfstate"
  }
}

 

  리소스 블록 

  • 리소스 블록은 resource로 시작. 이후 리소스 블록이 생성할 ‘리소스 유형’을 정의한다.
  • 리소스 선언 : 리소스 유형(프로바이더이름_제공리소스유형), 동일한 유형에 대한 식별자 역할로 고유한 이름, 구성 인수들이 이름 뒤에 중괄호 내에 선언됨
resource "<리소스 유형>" "<이름>" {
  <인수> = <값>
}

resource "local_file" "abc" {
  content  = "123"
  filename = "${path.module}/abc.txt"
}

  데이터 블록

  • 데이터 소스는 data로 시작
  • 테라폼으로 정의되지 않은 외부 리소스 또는 저장된 정보를 테라폼 내에서 참조할 때 사용
data "local_file" "abc" {
  filename = "${path.module}/abc.txt"
}
테라폼 변수

테라폼 변수 

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

variable "server_port" {
  description = "The port the server will use for HTTP requests"
  type        = number
  default     = 8080
}
  • 예시

 테라폼 변수 유형

  • 단순 변수 유형 (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
}

 

  • 복합 변수 유형
# 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 변수

  • 코드 내에서 사용자가 지정한 값 또는 속성 값을 참조 하여, 코드 내에서 재사용 가능한 값으로 선언
  • 입력 변수와 달리 선언된 모듈 내에서만 접근 가능하고, 변수처럼 실행 시에 입력받을 수 없다.
  •  사용자가 테라폼 코드를 구현할 때 이나 표현식을 반복적으로 사용할 수 있는 편의를 제공한다.
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" # 중복 선언되었으므로 오류가 발생한다.
}

 

 

output 변수

  • 출력변수는 말그대로 리소스 배포 후에 출력되는 변수입니다.
  • public ip가 출력 변수로 출력되면 해당 변수를 다시 재사용 할수 있음
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

'DevOps' 카테고리의 다른 글

[AWS EKS] EKS IaC with Terraform (2)  (0) 2024.04.23
[AWS EKS] EKS CICD  (0) 2024.04.15
[AWS EKS] EKS Security (Kyverno)  (0) 2024.04.13
[AWS EKS] EKS Security (IRSA)  (0) 2024.04.11
[AWS EKS] EKS Security ( IAM Authenticator)  (0) 2024.04.08