Terraform을 사용한 AWS EKS 클러스터 배포: 단계별 가이드

발행: (2026년 1월 15일 오후 07:05 GMT+9)
7 min read
원문: Dev.to

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 구성 적용

  1. 작업 디렉터리 초기화 (프로바이더 플러그인 및 모듈 다운로드):

    terraform init
  2. 실행 계획 생성 및 검토:

    terraform plan

    Terraform plan output

  3. 계획 적용 (리소스 생성):

    terraform apply

    확인 후 몇 분 정도 기다리면 모든 리소스가 프로비저닝됩니다.

    Resources being created

    EKS cluster ready

다음 단계

  • 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 구성 출력

클러스터에 로그인에 성공했는지 확인합니다:

kubectl config current-context

kubectl 현재 컨텍스트 출력

단계 6 – 클러스터 관리

클러스터의 모든 노드를 확인합니다:

kubectl get nodes

kubectl 노드 조회 출력

클러스터를 검증하기 위해 NGINX 인스턴스를 배포합니다:

kubectl run --port 80 --image nginx nginx

상태를 확인합니다:

kubectl get pods

kubectl 포드 조회 출력

로컬 환경에서 포드로 터널을 설정합니다:

kubectl port-forward nginx 3000:80

kubectl 포트 포워드 출력

단계 7 – 리소스 정리

terraform destroy

Note: 생성된 리소스를 반드시 삭제하여 과도한 AWS 비용이 발생하지 않도록 하세요.

결론

이 가이드를 완료함으로써 Terraform의 인프라스트럭처‑코드(IaC) 방식을 사용하여 프로덕션 준비가 된 AWS EKS 클러스터 배포를 구축했습니다. 이 기반을 통해 모든 환경에서 일관되고 버전 관리된 Kubernetes 인프라스트럭처를 관리할 수 있습니다.

Chidubem Chinwuba는 기술과 그 산업 전반에 걸친 변혁적 잠재력에 깊은 열정을 가진 헌신적인 클라우드/DevOps 엔지니어입니다. 그는 클라우드/DevOps 분야에서 의미 있는 영향을 만들고자 하는 열망에 의해 움직이며, 기술의 미래를 형성하는 프로젝트에 기여하면서 전문적 성장을 지속하기를 기대합니다.

Back to Blog

관련 글

더 보기 »

Terraform 스택

개요: 엔터프라이즈 패턴을 전체 애플리케이션, 다중 지역 팬‑아웃, 그리고 Kubernetes 플랫폼에 걸쳐 보여주는 프로덕션 준비가 된 Terraform Stacks 모음.