Project/reciping

[reciping 3차]Terraform으로 EKS 기반 인프라 구축하기 (1)

S_N_Y 2025. 11. 5. 05:45

※ 기존에 기록해둔 노션 글을 옮겨적은 것으로, 노션 템플릿에 맞게 적게된 글이라 해당 링크를 통해 더 가독성있게 보실 수 있습니다.

https://www.notion.so/Terraform-EKS-2690661ce62880908eafea7c3e73742c

 

Terraform으로 EKS 기반 인프라 구축하기 | Notion

1. 인텔리제이에서 테라폼 만들기

pleasant-sand-55a.notion.site


1. 인텔리제이에서 테라폼 만들기

깃허브에서 레포지토리 만들 때, .gitignore: Terraform 템플릿 선택하고 로컬에 clone합니다.

일단 마켓플레이스에서 테라폼 플러그인 다운로드

테라폼 CLI 설치

brew tap hashicorp/tap
brew install hashicorp/tap/terraform
terraform -v


2. 테라폼 적용하기 위한 CLI용 키페어 발급 및 등록

본인 계정에서 cli용 키페어 발급

 

이후 생성된 Access Key ID / Secret Access Key를 복사해서 아래 명령어로 CLI에 등록

aws configure
AWS Access Key ID     [None]: (복사한 키)
AWS Secret Access Key [None]: (복사한 시크릿 키)
Default region name   [None]: ap-northeast-2
Default output format [None]: json

3. VPC 모듈 만들기

https://github.com/Reciping/reciping-terraform/commit/d703134e94028821c8dc8c2a63135ae9988bf23d

 

:sparkles: feat : add vpc modules · Reciping/reciping-terraform@d703134

+ # - VPC, 서브넷, NAT, IGW, RT 구성 정의

github.com

https://github.com/Reciping/reciping-terraform/commit/31680cfca3735ff947b2a3561de7ae5a2038d64b

 

:sparkles: feat : add vpc modules · Reciping/reciping-terraform@31680cf

+ value = "" # The actual value to be outputted

github.com


 

🔥 필수 : 테라폼 생성/배포 하는 법

💡앞으로 매 모듈 만들 때마다 해당 과정을 반복하여야 합니다.

  1. 위치로 가기
cd /Users/sini/Desktop/dev_sini/reciping-terraform/env/prod

2. 테라폼 초기화

terraform init

3. 코드 검사(문법) → 문법 에러 있으면 여기서 먼저 잡힙니다.

terraform validate

4. 실제 적용될 변경 미리 보기

terraform plan

5. AWS에 실제 적용

terraform apply

# 혹은 특정 테라폼 모듈(타겟) 실행하고 싶을 때(예 : EKS 클러스터)
terraform apply -target=module.eks_cluster

6. 결과 확인

terraform output

 

4. 베스천 모듈 만들기

pem키는 수동으로 생성(베스천용 팸키와 운영레벨 범용성 팸키 두 가지 만들기)

# 베스천 서버 권한 주고 SSH 접속
chmod 400 /Users/sini/Desktop/dev_documents/reciping-bastion-ec2-key.pem

ssh -i /Users/sini/Desktop/dev_documents/reciping-bastion-ec2-key.pem ec2-user@43.202.58.107


# [0] 베스천 서버 기본 패키지 전체 업데이트 (시간 조금 걸릴 수 있음)
sudo yum update -y

# [1] EKS용 도구 설치를 위한 기본 패키지 설치
sudo yum install -y unzip curl wget git

# [2] kubectl 설치 (EKS용 Kubernetes CLI)
curl -o kubectl https://s3.us-west-2.amazonaws.com/amazon-eks/1.29.0/2024-05-09/bin/linux/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin
kubectl version --client  # 버전 확인

# [3] eksctl 설치 (EKS 클러스터 관리용)
curl --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
sudo mv /tmp/eksctl /usr/local/bin
eksctl version  # 버전 확인

# [4] Helm 설치 (쿠버네티스 패키지 매니저)
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
helm version  # 버전 확인

# 
# -----------------------------------------------------------------------------
# [5] aws configure 실행
aws configure

# [6] EKS 구축 후, EKS 클러스터 kubeconfig 연동(Bastion 서버에서 EKS 클러스터에 연결할 수 있도록 kubeconfig 설정)
aws eks update-kubeconfig \
  --region ap-northeast-2 \
  --name reciping-cluster
  
# [7] 연결 테스트
kubectl get nodes

https://github.com/Reciping/reciping-terraform/commit/9e35bd26ffe74ea4e7275a2e2410feb894f30755

 

:sparkles: feat : add bastion modules · Reciping/reciping-terraform@9e35bd2

@@ -32,3 +32,31 @@ variable "private_db_subnet_cidrs" {

github.com


 

5. EKS 클러스터 및 node Group 모듈 생성하기

  • 사전 작업

5-1) EKS 클러스터용 IAM Role 만들기

 

5-2) 노드그룹용 IAM Role 만들기

이미지와 같은 role 선택 후, 생성 클릭하고 생성된 화면

https://github.com/Reciping/reciping-terraform/commit/2924742b1830b84bcb9dd84368d964b874fd7a03

 

:sparkles: feat : add eks cluster modules · Reciping/reciping-terraform@2924742

+ value = aws_eks_cluster.this.certificate_authority[0].data

github.com

https://github.com/Reciping/reciping-terraform/commit/fba6c723cfb2349159b1d051d330eedc2c8103b3

 

:sparkles: feat : add eks node group modules · Reciping/reciping-terraform@fba6c72

@@ -14,3 +14,21 @@ resource "aws_eks_cluster" "this" {

github.com


6. ALB Ingress Controller 설치

ALB Ingress Controller는 AWS ALB를 Kubernetes Ingress로 사용할 수 있도록 하는 컨트롤러 ⇒ kubectl에서 Ingress만 정의하면 ALB가 자동 생성되도록 도와줌

 

0. 사전작업

modules/eks/main.tf 초기 구축할 때는 endpoint_public_access = true 로 두고 다음 과정 수행해야 합니다. (나중에 운영환경일 때, false 로 바꿔줘야 합니다.) terraform apply하기

# kubeconfig 설정
aws eks --region ap-northeast-2 update-kubeconfig --name reciping-cluster
# 노드 연결 확인하기
kubectl get nodes

 

1. OIDC Provider 연결

EKS 클러스터는 IRSA (IAM Roles for Service Accounts)방식으로 AWS 리소스 접근을 안전하게 제어할 수 있는 준비
# 사전 작업(로컬 터미널에서 실행)

# eksctl 설치
curl --silent --location "https://github.com/eksctl-io/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp

sudo mv /tmp/eksctl /usr/local/bin
eksctl version # 설치 후, 동작 확인

# OIDC Provider 연결
eksctl utils associate-iam-oidc-provider \
  --region ap-northeast-2 \
  --cluster reciping-cluster \
  --approve

 

2. ALB Ingress Controller용 IAM 정책 생성

컨트롤러가 ALB, Target Group, Listener등을 자동으로 만들 수 있게 IAM 정책을 하나 만들어줄 것임
# 1. IAM 정책 JSON 파일 다운로드
curl -o iam-policy-alb.json \
  https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy.json

# 2. IAM 정책 생성
aws iam create-policy \
  --policy-name ALBIngressControllerIAMPolicy \
  --policy-document file://iam-policy-alb.json

 

3. IRSA 기반 ServiceAccount생성 (IAM 연결)

컨트롤러가 EKS 내에서 IAM 역할을 사용하기 위해, ‘aws-load-balancer-controller’라는 이름의ServiceAccount를 만들어줄 것임
# kube-system 네임스페이스에
# aws-load-balancer-controller 이름의 서비스 어카운트를 만들고
# 위에서 만든 IAM 정책을 연결해주는 작업

eksctl create iamserviceaccount \
  --cluster reciping-cluster \
  --region ap-northeast-2 \
  --namespace kube-system \
  --name aws-load-balancer-controller \
  --attach-policy-arn arn:aws:iam::082808744580:policy/ALBIngressControllerIAMPolicy \
  --approve

 

4. ALB Ingress Controller 설치

# 사전작업(로컬 터미널에서 실행)

# Helm 설치(brew 설치 안 되어있으면 안되니 brew 먼저 설치하기)
brew install helm
# 설치 후 버전 확인
helm version

# ----------
# CRD YAML 수동 다운로드(깃헙에서 내 로컬로 파일 다운로드)
# 이 yaml 안에 TargetGroupBinding과 IngressClassParams, 즉 2가지 CRD가 함께 정의되어 있음
curl -o targetgroupbinding.yaml https://raw.githubusercontent.com/aws/eks-charts/master/stable/aws-load-balancer-controller/crds/crds.yaml
# kubectl 로 적용(EKS에 연결된 상태에서 실행됨)
kubectl apply -f targetgroupbinding.yaml

💡 여기서 Helm이란? : 로컬에서 클러스터로 패키지를 배포하는 도구

# helm으로 ALB Ingress Controller 설치
helm upgrade -i aws-load-balancer-controller eks/aws-load-balancer-controller \
  -n kube-system \
  --set clusterName=reciping-cluster \
  --set serviceAccount.create=false \ # Helm chart가 새로운 ServiceAccount를 생성하지 않도록 설정, IRSA 연결된 SA를 직접 만들었기 때문에 false로 설정
  --set serviceAccount.name=aws-load-balancer-controller # 이미 만들어진 IRSA 연결된 ServiceAccount를 사용하겠다는 뜻
  --set region=ap-northeast-2 \
  --set vpcId=vpc-0f9af5c58379e17f9 \
  --set image.repository=602401143452.dkr.ecr.ap-northeast-2.amazonaws.com/amazon/aws-load-balancer-controller

# 설치 확인
kubectl get deployment -n kube-system aws-load-balancer-controller

결과화면

 

4-1) Helm chart로 쿠버네티스 리소스 관리하기EKS 클러스터에 ALB Ingress Controller가 잘 동작하는지 “확인"하기 위한 테스트용 Deployment로 NGINX를 간단히 띄우겠습니다.

이거 외에도 이 레포에서 ArgoCD를 관리 및 사용해서 GitOps 방식으로 위 디렉토리 구조를 기준으로 쿠버네티스에 지속 배포하거나 Helm chart로 하나의 서비스 리소스를 Chart로 관리하고 버전 별 배포하기 위한 아래와 같은 커스텀 쿠버네티스 리소스 레포지토리를 팝니다.

https://github.com/Reciping/reciping-k8s-resources

 

GitHub - Reciping/reciping-k8s-resources: AI기반 통합 레시피 추천 및 검색 플랫폼 '레시핑' - Helm chart, ArgoCD

AI기반 통합 레시피 추천 및 검색 플랫폼 '레시핑' - Helm chart, ArgoCD, Manifest, Monitoring, kubectl - Reciping/reciping-k8s-resources

github.com

 

※ 테라폼과 리소스YAML 레포의 다른 점

항목 Terraform 레포 Kubernetes 리소스 레포
책임 AWS 인프라 생성 (EKS, VPC, IAM 등) 앱 배포와 쿠버 설정
배포 도구 Terraform kubectl, Helm, ArgoCD, Kustomize
주기 비교적 느림 (인프라 변경 시만) 비교적 자주 (앱 배포, 설정 변경 등)
권한 AWS 관리자 IAM 권한 EKS kubeconfig 접근 권한

 

초기 레포지토리 구조(현재는 바뀜)

reciping-k8s-resources/
├── base/                         # 모든 서비스가 공통으로 사용하는 리소스
│   ├── ingress-class.yaml        # ALB IngressClass 정의
│   └── cluster-issuer.yaml       # Cert-Manager 인증서용 (향후 HTTPS 대비)
├── test/
│   └── nginx-test.yaml           # ALB 테스트용 NGINX + Ingress
├── user-service/
│   ├── deployment.yaml
│   ├── service.yaml
│   └── ingress.yaml
├── recipe-service/
│   └── ...
└── README.md

 

아무튼 다시 돌아가서 EKS 클러스터에 ALB Ingress Controller가 잘 동작하는지 “확인"하기 위한 테스트용 Deployment로 NGINX를 간단히 띄우겠습니다.

https://github.com/Reciping/reciping-k8s-resources/commit/88869d85d233dd3ad52f32f5a5f544e0e57699b1

 

:sparkles: feat : EKS 클러스터에 ALB Ingress Controller가 잘 동작하는지 확인하기 위한 서… · Reciping/recip

…비스 테스트용 NGINX Ingress 적용

github.com

 

작성 후, 순차적으로 진행

cd ~/Desktop/dev_sini/reciping-k8s-resources
kubectl apply -f test/nginx-test.yaml       # NGINX 서비스 및 디플로이먼트(Service + Deployment) 생성 -> pod 배포
kubectl apply -f base/ingress-class.yaml    # ALB Ingress 리소스 생성 -> 경로를 연결

# ALB 생성 확인
kubectl get ingress

여기서 Deployment, Service, Ingress의 개념에 대해 정리해보겠습니다. Ingress는 마치 “외부 트래픽이 들어왔을 때 어느 내부 Service로 연결시킬지 정의하는 설정”하는 것.

그래서 먼저 Deployment + Service → 그 다음 Ingress 입니다.

+) 브라우저 접속해보기

# 위에 ADDRESS 나온걸로 접속하면 NGINX 환영 화면이 뜹니다.
http://k8s-default-nginxing-31cfb49cd0-64845225.ap-northeast-2.elb.amazonaws.com/

결과화면