8주차 - EKS IaC(Terraform) 이론

728x90

IaC란

 

  • Infrastructure as a Code로 코드를 작성하여 인프라를 구성하는것을 의미
    • ex: 퍼블릭 클라우드의 경우, 직접 콘솔에 접속하여 VPC 생성 / Subnet 생성 / SG생성 / Instance 생성을 진행하지만 IaC를 사용하면 코드를 이용하여 콘솔에 접속하지 않고 간단하게 인프라 구성 및 클라우드 자원을 생성 할 수 있음  

Terraform이란

  • 하시코프사에서 공개한 IaC(Infrastructure as a Code) 도구로, 현재 IaC 도구로 가장 널리 사용되고 있는 플랫폼
  • 다양한 Provider를 제공하여 테라폼 문법 하나로 다양한 클라우드 인프라 및 리소스를 생성
  • Provider를 통해 각 Target에 API를 호출하여 리소스를 생성하기 때문에 속도가 매우 빠름

 

 

실습 환경 준비 / Terraform 설치

  • 윈도우 Desktop를 사용하는 경우 WSL2 리눅스 환경 세팅 / VSCODE 연동
    • terraform 설치
    • awscli 설치
    • eksctl 설치
    • helm 설치
  • 기타 실습에 편리한 툴
    • tree
    • jq

 WSL2 설치 및 구성

# Windows wsl2 설치
# 자신의 windows 업데이트 버전을 확인하여 wsl설치가 가능한지 확인 필요

1. wsl2 설치 #CMD창을 관리자 권한으로 실행
wsl --install #wsl 설치
wsl --set-default-version 2 # wsl 버전 기본값을 2로 변경

2. 마이크로소프트 스토에서에서 설치하고 싶은 리눅스 배포반 검색 및 설치

3. ubuntu 22.04 설치 
설치 클릭하면 자동으로 앱이 실행되면서 터미털이 열리고 설치 진행
만약 터미널이 자동으로 열리지 않는다면 PC 재부팅 후 진행

4. 초기 사용자 계정 / 패스워드 설정

5. 설치 확인 # cmd에서 확인
wsl -l -v
C:\Users\Burst>wsl -l -v
  NAME            STATE           VERSION
* Ubuntu          Running         2
  Ubuntu-22.04    Stopped         2

 

 Terraform 및 기타 Tool 설치

# 1. Terraform 설치

wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install terraform

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

# 2. awscli2 설치
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

# 자격증명 진행
aws configure

# 3. eksctl 설치

curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
sudo mv /tmp/eksctl /usr/local/bin
eksctl version

# 4. helm 설치
curl -s https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash

# 5. kubectl 설치
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
# 버전 확인
kubectl version --client

# 6. 실습에 편리한 툴 설치
apt install -y tree jq

 

vscode 설정 및 추가 확장 팩 설치

 

  • HashiCorp HCL : HCL 파일에 대한 문법 하이라이팅 기능 제공
  • HashiCorp Terraform : 테라폼에 대한 문법 하이라이팅 기능 제공

 

  • vscode에서 wsl 연동 / vscode 터미널에서 리눅스 명령어 작업 및 해당 디렉토리 내 파일 편집

 

HCL(HashiCorp Configuration Language)

  • HCL은 하시코프사에서 IaC와 구성 정보를 명시하기 위해 개발된 오픈소스 도구
  • 테라폼의 경우 확장자가 *.tf 파일을 사용하며, HCL언어로 작성
  • 인프라가 코드로 표현되고 이 코드는 곧 인프라이기 때문에 선언적 특성을 갖게 되고 튜링 완전한 Turing-complete 언어적 특성을 갖음
  • HCL에서 변수와 문자열 값을 함께 사용하는 인터폴레이션 interpolation 표현 방식을 사용
  • 내부 구조는 Block으로 구성

 

주요 명령어 & 순서

 

  • 테라폼 코드 작성 후 실행 순서는 init - plan - apply 순으로 실행

  • init
    • 테라폼 초기화 명령어
    • terraform init 입력 시 .terraform디렉토리가 생성되며 해당 디렉토리 내 provider 관련 프러그인 다운

  • plan
    • 작성한 테라폼 코드가 어떻게 구성되는지 미리 보여주는 명령어
  • apply
    • 테라폼 코드를 실행하는 명령어
    • -auto-approve 시 yes를 별도로 입력하지 않아도 됨
  • destory
    • 테라폼 코드를 실행하여 생성된 자원 삭제 명령어
    • -auto-approve 시 yes를 별도로 입력하지 않아도 됨
  • state
    • 테라폼으로 실행 후, 워크스페이스에 상태를 확인
    • 서브 명령어로 list, show, mv, pull, push, rm, replace-provider가 있음

 

 

Terraform 주요 구성 요소

  • provider
    • Terraform으로 정의할 Infrastructure Provider를 의미
    • 테라폼 0.13 버전 이전에는 provider 블록에 함께 버전을 명시했지만 해당 버전 이후 프로바이더 버전은 terraform 블록에서 required_providers에 정의

  • resource
    • 실제로 생성할 인프라 자원을 의미
    • 프로바이더이름_제공리소스유형), 동일한 유형에 대한 식별자 역할로 고유한 이름, 구성 인수들이 이름 뒤에 중괄호 내에 선언됨
      • ex: resource "aws_instance" "example"
  • data
    • terraform에서 정의되지 않은 외부 리소스 또는 저장된 정보를 terraform 내에서 참조할 때 사용
# AWS 가용역역을 data로 저장

data "aws_availability_zones" "available" {
  state = "available"
}

#state list로 확인 시 data로 시작되는 객체 확인
terraform state list
data.aws_availability_zones.available

#해당 data에 어떤 내용이 저장되어 있는지 확인하고 싶으면 terraform console에서
#해당 data를 입력하면 확인 가능

terraform console
> data.aws_availability_zones.available
{
  "all_availability_zones" = tobool(null)
  "exclude_names" = toset(null) /* of string */
  "exclude_zone_ids" = toset(null) /* of string */
  "filter" = toset(null) /* of object */
  "group_names" = toset([
    "ap-northeast-2",
  ])
  "id" = "ap-northeast-2"
  "names" = tolist([
    "ap-northeast-2a",
    "ap-northeast-2b",
    "ap-northeast-2c",
    "ap-northeast-2d",
  ])
  "state" = "available"
  "timeouts" = null /* object */
  "zone_ids" = tolist([
    "apne2-az1",
    "apne2-az2",
    "apne2-az3",
    "apne2-az4",
  ])
}
  • variable
    • 입력 변수는 인프라를 구성하는 데 필요한 속성 값을 정의해 코드의 변경 없이 여러 인프라를 생성하는 데 목적
    • 변수 값을 전달하는 여러 가지 방법을 지정하지 않으면 기본값이 전달되고, 기본값이 없으면 대화식으로 사용자에게 변수에 대한 정보를 물어봄
  • state
    • 테라폼 명령어를 실행한 결과값을(상태)를 출력
    • terraform.tfstate 파일에 정의
  • output
    • 출력 값은 주로 테라폼 코드의 프로비저닝 수행 후의 결과 속성 값을 확인하는 용도로 사용
    • terraform output 명령어를 사용해서 확인
  • module
    • resource를 기반으로 작성된 변수들을 상속 받아, 필요한 부분을 override해서 사용
728x90