본문 바로가기
EKS Study

8주차 - EKS IaC

by 줄스토리 2024. 4. 21.

#스터디 시작

Terraform을 공부하면 DevOps 및 클라우드에서 요구되는 인프라 관리 자동화를 할 수 있습니다. 이를 통해 사용자는 Iac를 이용하여 인프라 구성을 정의한 다음 원하는 상태에 맞게 리소스를 생성, 업데이트 또는 삭제할 수 있습니다. 특히 코드형 인프라, 리소스 공급자, 실행 계획, 상태 관리와 같은 개념을 배우는 것이 필요합니다. 따라서 이번 스터디를 통해 인프라 작업을 자동화하고 일관성과 재현성을 보장하며 다양한 클라우드 플랫폼에서 효율적으로 작업할 수 있도록 실력을 쌓을 것입니다.

 

# Terraform 개념 및 특징

 

Terraform은 HashiCorp에서 개발한 오픈 소스 코드형 인프라(IaC) 도구입니다. 간단하고 사람이 읽을 수 있는 구성 언어를 사용하여 선언적으로 인프라 리소스를 정의하고 관리할 수 있습니다. Terraform을 사용하면 일반적으로 HashiCorp 구성 언어(HCL)로 작성된 Terraform 구성 파일에서 원하는 인프라 상태를 설명할 수 있습니다. 이 구성 파일은 인프라를 생성하고 관리하는 데 필요한 리소스, 공급자 및 해당 구성을 정의합니다.

 

 

  1. 코드형 인프라: Terraform을 사용하면 코드를 사용하여 인프라 리소스와 해당 구성을 정의할 수 있습니다. 이 접근 방식은 버전 제어, 코드 재사용, 자동화와 같은 소프트웨어 엔지니어링 방식의 이점을 인프라 관리에 제공합니다. 인프라를 코드로 처리하면 인프라 프로비저닝에 소프트웨어 개발 원칙을 적용하여 인프라의 안정성, 확장성 및 유지 관리 가능성을 높일 수 있습니다.
  2. 멀티 클라우드 및 하이브리드 환경: 멀티 클라우드 및 하이브리드 클라우드 아키텍처의 인기가 높아짐에 따라 조직은 여러 클라우드 공급자 또는 온프레미스 환경에서 리소스를 관리해야 하는 경우가 많습니다. Terraform은 통합 구성 언어를 사용하여 다양한 인프라 제공자 간에 리소스를 프로비저닝하고 관리할 수 있는 일관된 워크플로 및 추상화 계층을 제공합니다. 이를 통해 복잡한 분산 인프라 배포의 관리가 단순화됩니다.
  3. 인프라 버전 관리 및 감사: Terraform 구성을 버전 제어 시스템에 저장할 수 있으므로 변경 사항을 추적하고, 코드 차이점을 검토하고, 필요한 경우 이전 버전으로 롤백할 수 있습니다. 이를 통해 협업이 향상되고, 코드 검토 및 승인 프로세스가 용이해지며, 시간 경과에 따른 인프라 변경 사항에 대한 감사 추적이 제공됩니다.
  4. 종속성 관리 및 리소스 그래프: Terraform은 리소스 간의 종속성을 자동으로 관리하고 리소스 프로비저닝 및 업데이트에 대한 올바른 순서를 결정합니다. 구성에 정의된 리소스 관계를 분석하고 리소스 그래프를 작성합니다. 이 그래프는 Terraform이 종속성을 이해하는 데 도움이 되며 리소스가 올바른 순서로 생성 또는 수정되어 오류와 충돌을 줄이는 데 도움이 됩니다.
  5. 실행 계획 및 예측 가능성: 인프라에 변경 사항을 적용하기 전에 Terraform은 실행 계획을 생성합니다. 이 계획은 Terraform이 원하는 인프라 상태에 도달하기 위해 어떤 조치를 취하는지 보여줍니다. 변경 사항에 대한 미리 보기를 제공하고 적용하기 전에 영향을 이해하는 데 도움이 됩니다. 이러한 예측 가능성을 통해 변경 사항을 적용하기 전에 검토하고 검증할 수 있으므로 의도하지 않은 수정이 발생할 위험이 줄어듭니다.
  6. 상태 관리 및 협업: Terraform은 Terraform에서 관리하는 실제 인프라 상태를 추적하는 상태 파일을 유지 관리합니다. 이 상태 파일은 Terraform이 인프라의 현재 상태를 이해하고 원하는 상태와 실제 상태 사이의 델타를 결정하는 데 도움이 됩니다. 또한 여러 팀 구성원이 동일한 인프라에서 작업하고 상태 파일을 통해 변경 사항을 조정함으로써 협업을 촉진합니다.

 

 

# EKS IaC  실 

  1. 윈도우에 WSL2 설치
  2. WSL2 실행(Shell 접속)
  3. 테라폼 설치 및 확인 - 링크 (Linux → Ubuntu/Debian 선택)
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

 

 

 

 

- Brew 설치

 

MacOS 는 Unix 커널을 기반으로 한 운영 체제이며 Apple이 일종의 패키지 관리자 와 같은 AppStore를 제공함에도 불구하고 특히 고급 사용자나 개발자인 경우 중요한 내용이 많이 부족합니다. 이를 염두에 두고 커뮤니티에서는 체계적이고 매우 광범위한 패키지 및 앱 저장소(캐스크)를 소유하고 Mac 사용자가 널리 사용하는 명령줄 패키지 관리자인 Homebrew 또는 Brew 프로젝트를 만들었습니다.

 

- AWSCLI : 자신의 PC OS에 맞게 설치- Link ⇒ 이후 aws configure 로 자격증명 설정 할 것

macOS : brew install awscli

 

- EKSCTL : 자신의 PC OS에 맞게 설치- Link

macOS : brew install eksctl

- KUBECTL : 자신의 PC OS에 맞게 설치- Link

  • macOS : brew install kubernetes-cli

-HELM : 자신의 PC OS에 맞게 설치- Link

  • macOS : brew install helm

- 실습에 편리한 툴 : watch, jq, tree 등

# macOS
brew install tree jq watch

# Linux
sudo apt install -y tree jq

 

  • Get Started AWS - Link
    • 기본 환경 준비
mkdir learn-terraform
cd learn-terraform
touch main.tf

 

- Amazon Linux 2 최신 ami id 찾기

#aws ec2 describe-images --owners self amazon
aws ec2 describe-images --owners self amazon --query 'Images[*].[ImageId]' --output text
aws ec2 describe-images --owners amazon --filters "Name=name,Values=amzn2-ami-hvm-2.0.*-x86_64-gp2" "Name=state,Values=available"
aws ec2 describe-images --owners amazon --filters "Name=name,Values=amzn2-ami-hvm-2.0.*-x86_64-gp2" "Name=state,Values=available" --query 'Images|sort_by(@, &CreationDate)[-1].[ImageId, Name]' --output text
ami-0217b147346e48e84	amzn2-ami-hvm-2.0.20240412.0-x86_64-gp2

aws ec2 describe-images --owners amazon --filters "Name=name,Values=amzn2-ami-hvm-2.0.*-x86_64-gp2" "Name=state,Values=available" --query 'Images|sort_by(@, &CreationDate)[-1].[ImageId]' --output text
ami-0217b147346e48e84

AL2ID=`aws ec2 describe-images --owners amazon --filters "Name=name,Values=amzn2-ami-hvm-2.0.*-x86_64-gp2" "Name=state,Values=available" --query 'Images|sort_by(@, &CreationDate)[-1].[ImageId]' --output text`
echo $AL2ID

 

- EC2 생성 모니터링

# [터미널1] EC2 생성 모니터링
export AWS_PAGER=""
while true; do aws ec2 describe-instances --query "Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}" --filters Name=instance-state-name,Values=running --output text ; echo "------------------------------" ; sleep 1; done

 

- 배포 실행 : 터미널2에서 실행

# 초기화
terraform init
ls -al
tree .terraform

# plan 확인
terraform plan

# apply 실행
terraform apply
 Enter a value: yes 입력

# ec2 생성 확인 : aws 웹 관리 콘솔에서도 확인 - 서울 리전 선택
export AWS_PAGER=""
aws ec2 describe-instances --output table

# 테라폼 정보 확인
terraform state list
terraform show
terraform show aws_instance.example

 

 

 

- EC2 태그 정보 수정 : 코드 파일 수정

cat <<EOT > main.tf
provider "aws" {
  region = "ap-northeast-2"
}

resource "aws_instance" "example" {
  ami           = "$AL2ID"
  instance_type = "t2.micro"

  tags = {
    Name = "aews-study"
  }

}
EOT

 

          -

배포 실행

# plan 실행 시 아래와 같은 정보가 출력
terraform plan
# aws_instance.example will be updated in-place
  ~ resource "aws_instance" "example" {
        id                                   = "ami-0a0064415cdedc552"
      ~ tags                                 = {
          + "Name" = "t101-study"
        }
      ~ tags_all                             = {
          + "Name" = "t101-study"
        }
        # (29 unchanged attributes hidden)

        # (7 unchanged blocks hidden)
    }

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

# apply 실행
terraform apply
 Enter a value: yes 입력

# 모니터링 : [터미널1]에 Name 확인

 

 

 

    - 삭제
# 리소스 삭제
terraform destroy
 Enter a value: yes 입력

혹은
terraform destroy -auto-approve

 

 

#스터디 후기

Terraform을 공부하면서 코드를 통해 인프라 관리를 자동화하는 실용적인 기술을 얻을 수 있었습니다. 여러 러닝커브와 과제가 있지만 Terraform을 통해 DevOps 및 클라우드 실무를 더욱 확장할 수 있음을 느꼈습니다. 8주차 마지막 스터디를 마치며 아쉬움과 성취감 모두를 느꼈습니다. 그동안 여러 지식을 쌓고 시야를 넓히면서 성장했다고 생각합니다. 일을 병행했기 때문에 제대로 과제를 해내지 못한 아쉬운 점도 있었지만, 이번 스터디는 저에게 값진 경험이 되었습니다. 앞으로도 꾸준히 노력하여 커리어를 발전하도록 하겠습니다. 특히 Gasida님께 감사드리며, 스터디에 참여한 여러 팀원들도 고생하셨습니다.

'EKS Study' 카테고리의 다른 글

7주차 - EKS CI/CD  (0) 2024.04.14
6주차 - EKS Security  (0) 2024.04.13
5주차 - EKS Autoscaling  (0) 2024.04.07
4주차 - EKS Observability  (1) 2024.03.24
3주차 - EKS Storage & Nodegroup  (1) 2024.03.17