Terraform을 사용한 AWS EKS 클러스터 배포: 단계별 가이드
Source: Dev.to
오늘날 클라우드‑네이티브 환경에서 Kubernetes는 컨테이너 오케스트레이션의 사실상 표준이 되었으며, **Amazon Elastic Kubernetes Service (EKS)**는 클러스터 관리를 단순화하는 관리형 Kubernetes 서비스를 제공합니다. Terraform과 결합하면, HashiCorp의 Infrastructure‑as‑Code(IaC) 도구를 활용해 재현 가능하고, 버전‑관리되며, 자동화된 Kubernetes 인프라 배포를 구현할 수 있습니다.
이 포괄적인 가이드는 Terraform을 사용하여 프로덕션‑레디 AWS EKS 클러스터를 배포하는 과정을 단계별로 안내하며, 초기 설정부터 운영 모범 사례까지 모두 다룹니다.
필수 조건
- 적절한 IAM 권한이 있는 AWS 계정
- AWS CLI가 설치되고 구성됨
- Terraform (v1.0+)이 설치됨
kubectl(Kubernetes 클러스터와 상호 작용하기 위해)- AWS 서비스, Kubernetes 및 Terraform에 대한 기본 이해
아키텍처 개요
- 다중 가용 영역에 걸친 퍼블릭 및 프라이빗 서브넷을 포함하는 VPC
- AWS에서 관리하는 EKS 컨트롤 플레인
- 워커 노드를 위한 관리형 노드 그룹
- 필요한 IAM 역할 및 보안 그룹
- 네트워크 구성 요소(NAT 게이트웨이, 인터넷 게이트웨이, 라우트 테이블)
Source:
효율적인 Terraform 모듈 설계를 활용한 EKS 클러스터 프로비저닝
이 구현은 사전 정의된 구성을 포함하는 Terraform 모듈을 사용하여 Amazon EKS 클러스터 생성을 간소화하고, 인프라스트럭처‑코드(IaC)의 효율성을 보여줍니다.
Step 1 – 환경 준비 (도구 설치)
Terraform
brew install terraform
AWS CLI
brew install awscli
kubectl
brew install kubernetes-cli
다른 운영 체제에서 설치하려면 공식 문서를 참고하세요:
- Terraform:
- AWS CLI:
- kubectl:
Step 2 – AWS CLI 접근 권한 설정
aws configure
프롬프트가 표시되면 다음을 입력합니다:
- AWS Access Key ID
- AWS Secret Access Key
- Default region (예:
us-east-1)
Terraform는 이 자격 증명을 사용하여 AWS 리소스를 생성하고 관리합니다.
Step 3 – 코드 환경 준비
커뮤니티에서 유지 관리하는 terraform-aws-modules/eks/aws 모듈을 사용합니다.
data "aws_availability_zones" "available" {}
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
tags = {
Name = "main-vpc-eks"
}
}
resource "aws_subnet" "public_subnet" {
count = 2
vpc_id = aws_vpc.main.id
cidr_block = cidrsubnet(aws_vpc.main.cidr_block, 8, count.index)
availability_zone = data.aws_availability_zones.available.names[count.index]
map_public_ip_on_launch = true
tags = {
Name = "public-subnet-${count.index}"
}
}
resource "aws_internet_gateway" "main" {
vpc_id = aws_vpc.main.id
tags = {
Name = "main-igw"
}
}
resource "aws_route_table" "public" {
vpc_id = aws_vpc.main.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.main.id
}
tags = {
Name = "main-route-table"
}
}
resource "aws_route_table_association" "a" {
count = 2
subnet_id = aws_subnet.public_subnet.*.id[count.index]
route_table_id = aws_route_table.public.id
}
module "eks" {
source = "terraform-aws-modules/eks/aws"
version = "~> 20.31"
cluster_name = "sage-nodes"
cluster_version = "1.31"
# 선택 사항 – 퍼블릭 엔드포인트 접근
cluster_endpoint_public_access = true
# 현재 호출자에게 클러스터 접근 엔트리를 통해 관리자 권한 부여
enable_cluster_creator_admin_permissions = true
eks_managed_node_groups = {
sage-nodes = {
instance_types = ["t3.medium"]
min_size = 1
max_size = 3
desired_size = 2
}
}
vpc_id = aws_vpc.main.id
subnet_ids = aws_subnet.public_subnet.*.id
tags = {
Environment = "dev"
Terraform = "true"
}
}
Step 4 – Terraform 구성 적용
-
작업 디렉터리 초기화 (프로바이더 플러그인 및 모듈 다운로드):
terraform init -
실행 계획 생성 및 검토:
terraform plan
-
계획 적용 (리소스 생성):
terraform apply확인 후 몇 분 정도 기다리면 모든 리소스가 프로비저닝됩니다.


다음 단계
kubectl을 새 클러스터에 사용하도록 구성합니다 (aws eks update-kubeconfig --name sage-nodes).- 워크로드를 배포합니다 (예: 샘플 nginx 배포).
- 모니터링을 설정합니다 (CloudWatch, Prometheus) 및 로깅을 설정합니다 (Fluent Bit, Loki).
- CI/CD 파이프라인을 구현합니다 (GitHub Actions, GitLab CI)하여 향후 변경을 자동화합니다.
단계 5 – kubectl 액세스 구성
다음 명령을 실행합니다:
aws eks --region us-east-1 update-kubeconfig --name example

클러스터에 로그인에 성공했는지 확인합니다:
kubectl config current-context

단계 6 – 클러스터 관리
클러스터의 모든 노드를 확인합니다:
kubectl get nodes

클러스터를 검증하기 위해 NGINX 인스턴스를 배포합니다:
kubectl run --port 80 --image nginx nginx
상태를 확인합니다:
kubectl get pods

로컬 환경에서 포드로 터널을 설정합니다:
kubectl port-forward nginx 3000:80

단계 7 – 리소스 정리
terraform destroy
Note: 생성된 리소스를 반드시 삭제하여 과도한 AWS 비용이 발생하지 않도록 하세요.
결론
이 가이드를 완료함으로써 Terraform의 인프라스트럭처‑코드(IaC) 방식을 사용하여 프로덕션 준비가 된 AWS EKS 클러스터 배포를 구축했습니다. 이 기반을 통해 모든 환경에서 일관되고 버전 관리된 Kubernetes 인프라스트럭처를 관리할 수 있습니다.
Chidubem Chinwuba는 기술과 그 산업 전반에 걸친 변혁적 잠재력에 깊은 열정을 가진 헌신적인 클라우드/DevOps 엔지니어입니다. 그는 클라우드/DevOps 분야에서 의미 있는 영향을 만들고자 하는 열망에 의해 움직이며, 기술의 미래를 형성하는 프로젝트에 기여하면서 전문적 성장을 지속하기를 기대합니다.