CloudNet@팀의 EKS 스터디 AEWS 2기에 작성된 자료를 토대로 작성합니다.
▶ 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
테라폼 기본 사용법
hashiCorp Configuration Language은 하시코프사에서 IaC와 구성 정보를 명시하기 위해 개발된 오픈 소스 도구이다
오픈소스 도구라고 하면 이해하기 모호해서, 개인적으론 테라폼에서 쓰이는 언어로 이해한다.
Java나 python처럼 웹 개발 언어와 마찬가지로 조건문, 반복문 등 기본적인 코딩 언어 특성을 가지고 있다.
테라폼 블록이란?
테라폼 버전이나 , 프로바이더 버전과 같은 값들을 설정하고, 멱등성을 보장하기 위해서 이러한 부분을 명시적으로 선언하고
필요 조건들을 입력하여, 실행오류를 최소화 하기 위해 사용된다.
✅ 예시
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 |