※ 기존에 기록해둔 노션 글을 옮겨적은 것으로, 노션 템플릿에 맞게 적게된 글이라 해당 링크를 통해 더 가독성있게 보실 수 있습니다.
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용 키페어 발급 및 등록

이후 생성된 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
🔥 필수 : 테라폼 생성/배포 하는 법
💡앞으로 매 모듈 만들 때마다 해당 과정을 반복하여야 합니다.
- 위치로 가기
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. 베스천 모듈 만들기

# 베스천 서버 권한 주고 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 만들기


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. 사전작업

# 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/

'Project > reciping' 카테고리의 다른 글
| [reciping 3차] 모니터링 구축하기 - 태그기반 팀별 대시보드 구성 및 추이기반 알람 세팅까지 (0) | 2025.11.05 |
|---|---|
| [reciping 3차]Terraform으로 EKS 기반 인프라 구축하기 (2) (0) | 2025.11.05 |
| [reciping 2차] minikube로 로컬 쿠버네티스 테스트하기 (0) | 2025.11.05 |
| [reciping] 프론트단의 Route53 + S3 + CloudFront 설정하기 (0) | 2025.11.05 |
| [reciping] ECS(EC2, Fargate)로 백엔드 애플리케이션 배포하기 + 기본 EC2배포까지 (2) (0) | 2025.11.05 |