본문으로 건너뛰기

Day 1 - Terraform (IaC) · EKS 기반

CI/CD가 돌아갈 인프라를 코드로 만든다

목차


학습 목표

  • CI/CD 파이프라인에 필요한 AWS 리소스를 나열한다
  • Terraform으로 VPC · EKS · ECR · IAM 역할 골격을 이해한다
  • applykubectl로 클러스터에 접속한다

왜 인프라부터인가

애플리케이션·파이프라인보다 먼저 실행 환경이 있어야 합니다.

리소스CI/CD에서의 역할
VPC / SubnetEKS 노드·Pod 네트워크
EKS컨테이너 오케스트레이션
ECRGitHub Actions가 푸시할 이미지 레지스트리
IAM (OIDC)GitHub Actions → AWS 단기 자격 증명
(선택) ALB Controller / IRSAIngress·서비스 계정 권한

Terraform 기초는 Terraform 모듈을 참고하고, 여기서는 EKS 파이프라인용 최소 세트에 집중합니다.


구성 범위

실습 비용·시간 절감을 위해 단일 AZ · 작은 노드 타입 · 실습 후 destroy 를 권장합니다.


디렉터리 예시

infra/
├── versions.tf
├── providers.tf
├── variables.tf
├── vpc.tf
├── eks.tf
├── ecr.tf
├── github_oidc.tf
└── outputs.tf

핵심 리소스 스케치

Provider

provider "aws" {
region = var.aws_region
}

# EKS kubeconfig용 (apply 이후)
data "aws_eks_cluster" "this" {
name = module.eks.cluster_name
}

data "aws_eks_cluster_auth" "this" {
name = module.eks.cluster_name
}

ECR

resource "aws_ecr_repository" "app" {
name = "spring-demo"
image_tag_mutability = "MUTABLE"

image_scanning_configuration {
scan_on_push = true
}
}

EKS (모듈 예시 — 공식/커뮤니티 모듈 사용 가능)

module "eks" {
source = "terraform-aws-modules/eks/aws"
version = "~> 20.0"

cluster_name = var.cluster_name
cluster_version = "1.29"

vpc_id = module.vpc.vpc_id
subnet_ids = module.vpc.private_subnets

eks_managed_node_groups = {
default = {
instance_types = ["t3.medium"]
min_size = 1
max_size = 3
desired_size = 2
}
}
}

GitHub Actions OIDC (요약)

# GitHub OIDC Provider + Role
# Condition: repo:ORG/REPO:* (또는 특정 ref)
# Policy: ecr:GetAuthorizationToken, ecr:PutImage, ...

실제 정책은 최소 권한으로 ECR push에 필요한 액션만 부여합니다.


적용 순서

cd infra
terraform init
terraform plan -out=tfplan
terraform apply tfplan

# kubeconfig
aws eks update-kubeconfig --name <cluster_name> --region <region>
kubectl get nodes

상태 파일은 S3 backend + DynamoDB lock 을 권장합니다 (팀 실습 시).

terraform {
backend "s3" {
bucket = "my-tf-state"
key = "cicd/eks/terraform.tfstate"
region = "ap-northeast-2"
dynamodb_table = "tf-locks"
}
}

출력값 활용

CI·문서에 넘길 값 예시:

output "ecr_repository_url" {
value = aws_ecr_repository.app.repository_url
}

output "cluster_name" {
value = module.eks.cluster_name
}

output "github_actions_role_arn" {
value = aws_iam_role.github_actions.arn
}
terraform output -raw ecr_repository_url

실습 체크리스트

  1. VPC / EKS / ECR Terraform 작성 및 apply
  2. kubectl get nodes 성공
  3. ECR 리포 비어 있는 상태로 생성 확인
  4. GitHub OIDC Role ARN 확보 (Day 3에서 시크릿/변수로 사용)
  5. 비용 모니터링 · 실습 종료 시 terraform destroy 계획

관련 문서

그래프 뷰

그래프 데이터 로딩 중…
현재: Day 1 - Terraform (IaC) · EKS 기반
노드 클릭 → 이동 · 드래그 → 위치 조정