이번 포스트의 목표는 Terraform을 활용하여 eks를 구성하는 것입니다.
Terraform이란?
인프라를 코드로 관리하는 도구로, aws등의 클라우드 리소스를 코드로 선언하여 리소스를 손쉽게 구성하는 것.
테라폼을 이용하면 aws의 ec2인스턴스, vpc, s3 등을 생성할 수 있습니다.
또한 코드 수정으로 인프라 변경 사항을 적용할 수 있기 때문에 관리가 매우 용이합니다.
또한, 하나의 코드 베이스로 통합할 수 있기 때문에 편리합니다.
Terraform 디렉토리 구조
eks-terraform/
├── main.tf
├── variables.tf
├── outputs.tf
├── terraform.tfvars
└── modules/
├── vpc/
├── eks/
└── ec2/
main : 핵심 리소스 정의 파일
variables : 사용할 입력 변수들 정의
outputs : 생성된 리소스의 값을 외부(main)로 출력.
사전 작업
작업한 환경은 다음과 같다.
윈도우 환경
powershell 사용
1. aws console에서 iam 사용자 생성 -> 엑세스 id, key 생성
2. aws cli 설치
https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html
Installing or updating to the latest version of the AWS CLI - AWS Command Line Interface
When updating from a previous version, the unzip command prompts to overwrite existing files. To skip these prompts, such as with script automation, use the -u update flag for unzip. This flag automatically updates existing files and creates new ones as ne
docs.aws.amazon.com
aws --version
코드로 설치 확인.
3. aws cli 자격 증명 설정
aws configure
이후, 1번에서 생성한 엑세스 정보들과 region을 넣어준다.
3. Terraform 설치.
https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli
압축 파일을 원하는 파일 경로에 넣고 그 경로를 시스템 환경변수 path에 넣어주어야 한다.
그 후,
terraform -v
의 결과가 나오면 성공.
사전 작업은 여기서 종료합니다.
작업한 테라폼 디렉토리 구조

테라폼을 이용하여 ec2, eks, rds, vpc를 손쉽게 구성하도록 했습니다.
또한 프론트엔드 코드는 s3 + cloudfront를 이용하여 배포하도록 했습니다.
루트 코드
main.tf
terraform {
required_version = ">= 1.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = var.aws_region
}
# VPC 모듈
module "vpc" {
source = "./modules/vpc"
cluster_name = var.cluster_name
vpc_cidr = var.vpc_cidr
public_subnet_cidrs = var.public_subnet_cidrs
private_subnet_cidrs = var.private_subnet_cidrs
aws_region = var.aws_region
}
# EKS 모듈
module "eks" {
source = "./modules/eks"
cluster_name = var.cluster_name
kubernetes_version = var.kubernetes_version
vpc_id = module.vpc.vpc_id
public_subnet_ids = module.vpc.public_subnet_ids
private_subnet_ids = module.vpc.private_subnet_ids
node_group_desired_size = var.node_group_desired_size
node_group_max_size = var.node_group_max_size
node_group_min_size = var.node_group_min_size
node_instance_types = var.node_instance_types
node_ami_type = var.node_ami_type
node_capacity_type = var.node_capacity_type
}
# EC2 모듈 (Bastion Host)
module "ec2" {
source = "./modules/ec2"
cluster_name = var.cluster_name
vpc_id = module.vpc.vpc_id
public_subnet_id = module.vpc.public_subnet_ids[0]
key_pair_name = var.key_pair_name
bastion_ami_id = var.bastion_ami_id
bastion_instance_type = var.bastion_instance_type
aws_region = var.aws_region
}
# rds 모듈
module "rds" {
source = "./modules/rds"
cluster_name = var.cluster_name
vpc_id = module.vpc.vpc_id
private_subnet_ids = module.vpc.private_subnet_ids
eks_node_security_group_id = module.eks.cluster_security_group_id
# DB 설정
db_instance_class = var.db_instance_class
db_allocated_storage = var.db_allocated_storage
db_max_allocated_storage = var.db_max_allocated_storage
db_name = var.db_name
db_username = var.db_username
db_password = var.db_password
# 백업/보안 설정
backup_retention_period = var.backup_retention_period
deletion_protection = var.deletion_protection
}
# Frontend 모듈 (S3 + CloudFront)
module "frontend" {
source = "./modules/frontend"
cluster_name = var.cluster_name
}
outputs.tf
output "vpc_id" {
description = "VPC ID"
value = aws_vpc.main.id
}
output "public_subnet_ids" {
description = "List of public subnet IDs"
value = aws_subnet.public[*].id
}
output "private_subnet_ids" {
description = "List of private subnet IDs"
value = aws_subnet.private[*].id
}
output "internet_gateway_id" {
description = "Internet Gateway ID"
value = aws_internet_gateway.main.id
}
output "nat_gateway_ids" {
description = "List of NAT Gateway IDs"
value = aws_nat_gateway.main[*].id
}
variables.tf
variable "cluster_name" {
description = "Name of the EKS cluster"
type = string
}
variable "vpc_cidr" {
description = "CIDR block for VPC"
type = string
}
variable "public_subnet_cidrs" {
description = "CIDR blocks for public subnets"
type = list(string)
}
variable "private_subnet_cidrs" {
description = "CIDR blocks for private subnets"
type = list(string)
}
variable "aws_region" {
description = "AWS region"
type = string
}
terraform.tfvars 파일(설정들)까지 구성하면 메인 파일들 준비는 완성되었고, 모듈안의 파일도 준비해야 합니다. ( 이 포스트에선 자세한 코드는 생략)
실행방법
powershell> 테라폼 코드가 있는 파일 경로에서 아래 순서대로 실행.
0. 키페어 생성.
1. 초기화
terraform init
2. 계획 확인
terraform plan
3. 리소스 생성
terraform apply
4. kubectl 설정
aws eks update-kubeconfig --region [자신의 리전] --name my-eks-cluster
확인
kubectl get pods -A

정상적으로 잘 실행되었음을 알 수 있습니다.