Day 1 - Terraform (IaC) · EKS 기반
CI/CD가 돌아갈 인프라를 코드로 만든다
목차
학습 목표
- CI/CD 파이프라인에 필요한 AWS 리소스를 나열한다
- Terraform으로 VPC · EKS · ECR · IAM 역할 골격을 이해한다
apply후kubectl로 클러스터에 접속한다
왜 인프라부터인가
애플리케이션·파이프라인보다 먼저 실행 환경이 있어야 합니다.
| 리소스 | CI/CD에서의 역할 |
|---|---|
| VPC / Subnet | EKS 노드·Pod 네트워크 |
| EKS | 컨테이너 오케스트레이션 |
| ECR | GitHub Actions가 푸시할 이미지 레지스트리 |
| IAM (OIDC) | GitHub Actions → AWS 단기 자격 증명 |
| (선택) ALB Controller / IRSA | Ingress·서비스 계정 권한 |
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
실습 체크리스트
- VPC / EKS / ECR Terraform 작성 및
apply -
kubectl get nodes성공 - ECR 리포 비어 있는 상태로 생성 확인
- GitHub OIDC Role ARN 확보 (Day 3에서 시크릿/변수로 사용)
- 비용 모니터링 · 실습 종료 시
terraform destroy계획