※ 기존에 기록해둔 노션 글을 옮겨적은 것으로, 노션 템플릿에 맞게 적게된 글이라 해당 링크를 통해 더 가독성있게 보실 수 있습니다.
https://www.notion.so/Terraform-EKS-2690661ce62880908eafea7c3e73742c
Terraform으로 EKS 기반 인프라 구축하기 | Notion
1. 인텔리제이에서 테라폼 만들기
pleasant-sand-55a.notion.site
7. Fluent Bit DaemonSet 구성하기(Helm Provider를 이용한 배포 자동화)
Helm chart로 배포하는 것 뿐만 아니라, Helm Chart + Terraform 방식으로 재구성하고 Terraform에 있는 Helm Provider를 이용해 배포 자동화를 구현하겠습니다.
reciping-k8s-resources/
└── logging/
├── fluent-bit-configmap.yaml
└── fluent-bit-daemonset.yaml
# 원래 버전은 위와 같으나(helm으로만 하는 것), 자동화 설정을 테라폼에서 하였으니 이 부분은 지워도 됩니다.
여기서 configmap이란? : 로그 포맷, 출력 대상, 필터 등 공통 설정값을 따로 관리 Terraform Helm Provider란? : 배포를 GitOps 스타일로 관리, 인프라 코드에 배포 상태를 통합
1. AWS에서 제공하는 Fluentbit 공식 Helm chart 설치
Terraform에서 helm_release를 통해 배포할 때는 Helm CLI 명령어를 직접 쓰지 않고, Terraform이 Helm Provider를 통해 Helm Chart를 알아서 받아와서 설치합니다.
helm repo add fluent https://fluent.github.io/helm-charts
helm repo update
2. 태깅 포함 Fluent Bit DaemonSet을 Helm + Terraform으로 자동화 구성하기
reciping-terraform/
├── modules/
│ └── fluent-bit/
│ ├── main.tf # Helm Release 정의
│ ├── variables.tf # Helm에 넘겨줄 변수 정의
│ ├── outputs.tf # Helm 설치 결과 출력 정의
│ └── values.yaml # Helm chart용 Fluent Bit 설정
└── environments/
└── prod/
├── main.tf # module "fluent-bit" 호출
├── variables.tf # 모듈에 넘겨줄 변수 선언
└── terraform.tfvars # 실제 배포 환경 변수 주입
# 테라폼/생성 배포하는 법 다 완수 후, 해야할 일
# 1. fluent bit pod 확인
kubectl get pods -n observability
# 2. 로그 수집 정상 여부 확인(<fluent-bit-pod-name>에 위에서 name 뜬거 복붙)
kubectl logs -n observability <fluent-bit-pod-name>
# 3. Fluent Bit DaemonSet 확인
kubectl get pods -n observability -l app.kubernetes.io/name=fluent-bit
# 4. kafka에 정상 수집 확인
kafka-console-consumer.sh \
--bootstrap-server 10.0.128.81:9092 \
--topic logs.observability \
--from-beginning
최종 결과 :
https://github.com/Reciping/reciping-terraform/tree/dev/modules/fluent-bit
reciping-terraform/modules/fluent-bit at dev · Reciping/reciping-terraform
AI기반 통합 레시피 추천 및 검색 플랫폼 '레시핑' - 테라폼. Contribute to Reciping/reciping-terraform development by creating an account on GitHub.
github.com
8. 각 서버를 Pod에 띄우기 & ArgoCD 세팅(CD)
ECR에 prod버전 이미지를 업로드한 후의 배포 문서입니다. ECR에 올리는 과정은 다음 과정에 정리되어 있습니다. (4. ECR 생성하기 참고)
🛎️ECS(EC2, Fargate)로 백엔드 애플리케이션 배포하기 + 기본 EC2배포까지 - 7. ECR 생성하기
혹은 CI 스크립트가 github actions에 세팅되어있으면 ECR에 이미지 쉽게 업로드 되어있으니 참고
https://github.com/Reciping/reciping-user-service-BE/blob/dev/.github/workflows/ci.yml
Hem chart로 정의하고 본격적인 배포를 해보겠습니다.
reciping-k8s-resources/
└── charts/
└── reciping-like-service/
├── Chart.yaml ←
├── values.yaml ← 실제 JWT 값 등을 저장하는 장소(진짜 적용은 secret)
└── templates/
├── rollout.yaml ← 🔜 (카나리/블루그린 유연하게 변경 가능)
├── service.yaml ← 🔜 ClusterIP 서비스 정의
├── ingress.yaml ← 🔜 선택사항) ALB 연동시 필요(ALB 연동용 Ingress 리소스)
├── configmap.yaml ← 🔜 application-prod.yaml (환경변수) 주입
├── secret.yaml ← 🔜 JWT/DB credential 등 민감 정보
안에 내용들은 주석으로 설명을 세세하게 달았습니다. 커밋 참고해주세요.
https://github.com/Reciping/reciping-k8s-resources/commit/26853ccbdf3bae06192112f13d7299911fa36cd2
:sparkles: feat : update helm chart(reciping-like-service) · Reciping/reciping-k8s-resources@26853cc
+ name: like-service # 서비스 이름. Rollout, Ingress, DNS 모두 이 이름을 사용하게 됨
github.com
+) like-service여서 다른 서비스(user-service..) 주석 달아놓은 커밋 참고하시면 됩니다.
8-1 . 가장 처음 CD 시작할 시, argoCD UI가 아닌 argo CLI로 배포하기
- ArgoCD 네임스페이스 설정
⇒ 보통 ArgoCD는 argocd라는 네임스페이스에 설치하는 것이 업계 표준입니다.
kubectl create namespace argocd
2. ArgoCD Helm 저장소 추가
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update
3. helm chart로 argoCD 설치
helm install argocd argo/argo-cd \
--namespace argocd \
--create-namespace \
--set server.service.type=LoadBalancer
# argo/argo-cd: ArgoCD의 공식 Helm Chart.
# --namespace argocd: 앞서 만든 네임스페이스에 설치.
# --set server.service.type=LoadBalancer: ArgoCD Web UI를 외부에서 접속할 수 있도록 ELB 생
4. ArgoCD 제대로 설치되어있는지 확인
kubectl get all -n argocd

+) ArgoCD CLI 설치하고 아래 명령어로 제대로 설치되어있는지 확인
argocd version
5. ArgoCD 서버에 CLI 로그인하기
ArgoCD는 CLI를 사용하려면 먼저 로그인해야합니다. 그 전에 포트포워딩을 먼저 해야 CLI에서 localhost로 통신할 수 있습니다.
kubectl port-forward svc/argocd-server -n argocd 8080:443
# 로컬의 8080 포트를 ArgoCD 서버의 443 포트에 연결
6. 포트포워딩 후, 로그인하기
argocd login localhost:8080 --username admin --password <초기 비밀번호>
# 여기서 초기 비밀번호는 아랫 명령어로 찾을 수 있음
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
7. ArgoCD에 Git 연동 설정
argocd repo add https://github.com/Reciping/reciping-k8s-resources \
--username <YOUR_USERNAME> \
--password <YOUR_PASSWORD>
# 여기서 <YOUR_USERNAME>는 깃허브 닉네임 (예 : beginninggrace)
# <YOUR_PASSWORD>는 token(classic)에서 토큰 발급 후 나온 시리얼값

이제 본격적으로 배포하기 위해, Application 리소스 정의하려고 합니다. ArgoCD에 Helm Chart를 기반으로 Application을 생성해야 실제 배포가 이뤄지기 때문입니다.
[ 필요한 정보 ]
-name: gateway-app (원하는 이름으로 설정)
-repo: GitHub 저장소 URL -path: Helm Chart 디렉토리 경로 (예: helm/gateway)
-dest-server: Kubernetes API 주소 (보통 https://kubernetes.default.svc)
-dest-namespace: 네임스페이스 (예: reciping) -values: values-prod.yaml을 사용하고 있다면 해당 경로 지정
⇒ 이 옵션을 주면 기본 values.yaml을 기반으로 하되, values-prod.yaml의 값으로 덮어씌워서 배포한다는 뜻
⇒ 우리는 아직 없으니 빼두기
다시 5번 과정(로컬의 8080 포트를 ArgoCD 서버의 443 포트에 연결)후, 그 다음 스텝입니다.
- Argo CD 로그인
argocd login localhost:8080 --username admin --password ZSWm4a4eI7hDl17I --insecure
# --insecure는 포트포워딩을 통해 HTTPS 인증서를 무시하므로 꼭 붙이기
2. appliaction 생성
argocd app create gateway-app \
--repo https://github.com/Reciping/reciping-k8s-resources \
--path gateway \
--dest-server https://kubernetes.default.svc \
--dest-namespace reciping \
--sync-policy automated

⇒ 이제 Argo CD가 reciping-gateway-service를 Helm Chart 기반으로 자동 동기화하게 됩니다.
argocd app get gateway-app
# 자동 동기화 상태 확인
# 이 명령어로 앱이 제대로 떠있는지 확인 가능
# 자동으로 Synced 상태로 바뀌었는지 확인하고, Healthy 상태여야 성공적으로 배포된 것

※ 추후에, 이미지 버전 업(v1.0.0 → v1.0.1)이 됐을 시, 배포하는 방법
- 새로 빌드 및 ECR에 푸시
- Helm upgrade 다시 수행:
helm upgrade reciping-gateway ./charts/reciping-gateway-service -n reciping
# 최초로 배포할 때에는 helm inatall~로 하나 업데이트될 때는 이처럼 수행합니다

8-2 . 가장 처음 CD 시작할 시, argoCD UI가 아닌 YAML로 정의해서 kubectl apply로 배포하기
폴더 구조는 아래와 같습니다.
reciping-k8s-resources/
└── app/
└── gateway-app.yaml
yaml파일을 생성해서 넣어줍니다.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: gateway-app
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/Reciping/reciping-k8s-resources
targetRevision: HEAD
path: charts/reciping-gateway-service
helm:
valueFiles:
- values.yaml
destination:
server: https://kubernetes.default.svc
namespace: reciping
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
커밋 및 푸쉬 완료 후, 아래의 명령어를 치면 앱 배포가 완료됩니다.
kubectl apply -f app/gateway-app.yaml
이 파일이 클러스터에 적용되면 Argo CD는 이 Application을 인식하고 지정된 Helm Chart (charts/reciping-gateway-service)를 기준으로 자동 배포합니다.
❇️ 최종 버전 : argoCD UI 보기 위한 argocd용 A 레코드 만들고 helm chart로 쉽게 배포하기
1. A 레코드 만들기(https://argocd.reciping.kr) - 테라폼
https://github.com/Reciping/reciping-terraform/commit/0934a711109930b709b1d87e6155a00a28960938
:recycle: refactor : add A record from route53-acm modules · Reciping/reciping-terraform@0934a71
@@ -36,3 +37,29 @@ resource "aws_acm_certificate_validation" "cert" {
github.com
https://github.com/Reciping/reciping-terraform/commit/06360454fedd396c42f23d567cd8aa439a25af4e
:recycle: refactor : add argoCD A record from route53-acm modules(wat… · Reciping/reciping-terraform@0636045
…ch argoCD UI)
github.com
[ 🚒 2번 하기 전 체크 리스트 ]
- ALB Deployment 상태가 (2/2 replicas, 모두 READY) 이런 식으로 되어있는지 확인
- ALB pod 상태가 모두 1/1 Running 상태인지 확인
- 설치 경로가 kube-system 네임스페이스인지 확인

# 초기 관리자 비밀번호 확인
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo

+) gateway-service 배포시, 아래와 같이 명령어 입력하기만 하면 됩니다.
( reciping-k8s-resource 레포지토리에 푸쉬된 상태, 즉 gitOps 기반으로 동작되기 때문에 해당 레포지토리 참조)
kubectl apply -f app/gateway-app.yaml

9. ACM / Route53 모듈 만들기
가비아에서 산 DNS인 reciping.kr을 연결해보겠습니다. 기존에 AWS 콘솔로 설정했던 방법은 아래를 참고하시면 됩니다. → 왜 설정하고 이게 뭔지 다 정리되어 있습니다.
🛎️ECS(EC2, Fargate)로 백엔드 애플리케이션 배포하기 + 기본 EC2배포까지 - 3. HTTPS 연결을 위한 ACM 인증서 발급하기
🛎️ECS(EC2, Fargate)로 백엔드 애플리케이션 배포하기 + 기본 EC2배포까지 - 5. Route 53에서 A 레코드 생성 (api.reciping.kr → ALB)
👒프론트단의 Route53 + S3 + CloudFront 설정하기 - 1. 가비아에서 산 DNS를 Route53에 연결하기
1. ACM-Route53 모듈 추가
https://github.com/Reciping/reciping-terraform/commit/fa830122c9f7d764777ce95517731a210bd8934a
:sparkles: feat : set acm-route53 modules · Reciping/reciping-terraform@fa83012
@@ -67,3 +67,22 @@ module "fluent_bit" {
github.com
2. gateway-service helm chart로 세부 설정해서 배포하기

https://github.com/Reciping/reciping-k8s-resources/commit/599a8238c30daa21ffa6d3ed1e68e8779f65e237
:sparkles: feat : update helm chart(reciping-gateway-service) · Reciping/reciping-k8s-resources@599a823
+ {"Type": "redirect", "RedirectConfig": { "Host": "reciping.kr", "StatusCode": "HTTP_301"}}
github.com
배포 과정은 7. 각 서버를 Pod에 띄우기 & ArgoCD 세팅(CD) 참고하시면 됩니다.

10. DB(DocumentDB, RDS), S3 모듈 만들기
1) documentDB 모듈 추가
https://github.com/Reciping/reciping-terraform/tree/dev/modules/documentdb
reciping-terraform/modules/documentdb at dev · Reciping/reciping-terraform
AI기반 통합 레시피 추천 및 검색 플랫폼 '레시핑' - 테라폼. Contribute to Reciping/reciping-terraform development by creating an account on GitHub.
github.com
2) rds 모듈 추가
https://github.com/Reciping/reciping-terraform/tree/dev/modules/rds
reciping-terraform/modules/rds at dev · Reciping/reciping-terraform
AI기반 통합 레시피 추천 및 검색 플랫폼 '레시핑' - 테라폼. Contribute to Reciping/reciping-terraform development by creating an account on GitHub.
github.com
3) s3 모듈 추가
https://github.com/Reciping/reciping-terraform/tree/dev/modules/s3
reciping-terraform/modules/s3 at dev · Reciping/reciping-terraform
AI기반 통합 레시피 추천 및 검색 플랫폼 '레시핑' - 테라폼. Contribute to Reciping/reciping-terraform development by creating an account on GitHub.
github.com
terraform apply 완료 후, db 설정들은 각 secret에 맞춰 업로드하면 됩니다.
'Project > reciping' 카테고리의 다른 글
| [reciping 3차] 서비스에 맞춰 배포 전략을 직접 비교해봐요! - 장/단점 정리 (1) | 2025.11.05 |
|---|---|
| [reciping 3차] 모니터링 구축하기 - 태그기반 팀별 대시보드 구성 및 추이기반 알람 세팅까지 (0) | 2025.11.05 |
| [reciping 3차]Terraform으로 EKS 기반 인프라 구축하기 (1) (0) | 2025.11.05 |
| [reciping 2차] minikube로 로컬 쿠버네티스 테스트하기 (0) | 2025.11.05 |
| [reciping] 프론트단의 Route53 + S3 + CloudFront 설정하기 (0) | 2025.11.05 |