Terraform에서 GitOps까지: 11개의 마이크로서비스로 엔드‑투‑엔드 DevOps 플랫폼 구축
Source: Dev.to
이 문서에서는
- Terraform를 사용하여 점프호스트를 프로비저닝한 방법
- Ansible로 점프호스트를 구성한 방법
- 보너스: 이 프로젝트를 구축하면서 AWS CostWatch를 사용해 AWS 비용을 실시간으로 모니터링하기
대상 독자
- 프리 티어 사용자
- 자신의 노트북 터미널에서 모든 작업을 수행하고 싶은 사람
보너스: 실시간으로 AWS 비용 모니터링 (AWS CostWatch)
서버가 필요 없습니다 – 노트북 터미널만 있으면 됩니다.
단계별
-
리포지토리 복제
git clone https://github.com/vsaraths/AWS-Cost-Watch.git cd AWS-Cost-Watch -
종속성 설치
pip install boto3 rich sqlite-utils -
AWS 자격 증명 구성
이미 자격 증명이 있는지 확인하세요:
aws sts get-caller-identity아직 자격 증명이 구성되지 않았다면:
aws configure프롬프트가 표시되면 다음을 입력하세요:
- 액세스 키 ID
- 시크릿 액세스 키
- 기본 리전 이름
- 기본 출력 형식 (선택 사항)
-
CostWatch 실행
python3 aws_cost_dashboard.py이 도구는 즉시 AWS 계정을 스캔하고 실시간으로 비용 정보를 표시하기 시작합니다.
Terraform & Ansible – Jumphost 구축
아래는 Terraform(인프라)과 Ansible(구성) 을 사용하여 점프호스트를 프로비저닝하는 간결한 단계별 가이드입니다.
1️⃣ 인프라 레포지토리 클론
git clone <REPO_URL>
cd <REPO_DIRECTORY>
<REPO_URL>와<REPO_DIRECTORY>를 프로젝트에 맞는 실제 값으로 교체하세요.
2️⃣ AWS CLI 설정 (아직 설정하지 않았다면)
aws configure
Terraform 에 사용할 AWS 자격 증명을 동일하게 입력합니다.
3️⃣ Terraform 상태를 위한 S3 백엔드 생성
cd s3-buckets
# 버킷을 생성하는 Terraform 스크립트를 실행합니다
terraform init
terraform apply -auto-approve
S3 버킷은 Terraform 상태를 원격에 저장하여 안전하고 협업 가능한 인프라 관리를 가능하게 합니다.
3.1️⃣ (선택) 네트워크 인프라 생성
cd ../network
terraform init
terraform apply -auto-approve # VPC, 서브넷, 라우트 테이블 등을 생성합니다
샘플 검증
terraform state list
4️⃣ 점프호스트 EC2 프로비저닝 (Terraform + Ansible)
cd ../ec2-jumphost
terraform init
terraform apply -auto-approve # EC2 인스턴스를 생성합니다
인스턴스가 올라간 후, 함께 제공되는 Ansible 플레이북이 필요한 모든 도구를 설치·구성하여 설정을 재현 가능하고 멱등하게 만듭니다.
5️⃣ EC2 인스턴스에 연결하고 Jenkins 접근
# <KEY_NAME>.pem, <PUBLIC_IP> 를 자신의 값으로 교체하세요
ssh -i <KEY_NAME>.pem ec2-user@<PUBLIC_IP>
Git 설치 여부 확인
git --version
Jenkins 관리자 비밀번호 가져오기
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
📌 빠른 요약
| 단계 | 작업 | 주요 명령 |
|---|---|---|
| 1 | 레포지토리 클론 | git clone … |
| 2 | AWS CLI 설정 | aws configure |
| 3 | S3 백엔드 생성 | terraform apply (s3-buckets 디렉터리) |
| 3.1 | (선택) VPC 구축 | terraform apply (network 디렉터리) |
| 4 | 점프호스트 생성 | terraform apply (ec2-jumphost 디렉터리) |
| 5 | SSH 및 Jenkins | ssh … → cat …/initialAdminPassword |
명령에 -var 플래그를 추가하거나 다른 백엔드를 사용하는 등 환경에 맞게 자유롭게 조정하세요. 즐거운 프로비저닝 되세요!
Jenkins – 설치 및 파이프라인 설정
단계 6 – Jenkins 플러그인 설치
- 탐색:
Jenkins Dashboard → Manage Jenkins → Plugins - 필요한 플러그인 설치 (예: Git, Docker, Kubernetes, Pipeline 등).
- 설치가 완료되면 Jenkins를 재시작합니다 (실행 중인 작업이 없도록 확인).
단계 7 – Jenkins 자격 증명 설정
GitHub Personal Access Token (PAT) 추가:
Jenkins Dashboard → Manage Jenkins → Credentials → (global) → Global credentials (unrestricted) → Add Credentials → Secret text
단계 8 – Jenkins 파이프라인 작업 생성
모든 파이프라인은 동일한 GitHub 저장소를 가리킵니다:
https://github.com/vsaraths/Deploy--E-Commerce-Application-eks-microservices-platform-11-Services-.git
8.1 EKS 클러스터 생성
| 설정 | 값 |
|---|---|
| 작업 유형 | Pipeline (Multibranch) |
| 브랜치 지정자 | */main |
| Build with Parameters → ACTION | create-eks-cluster |
8.2 Elastic Container Registry (ECR) 생성
| 설정 | 값 |
|---|---|
| 작업 유형 | Pipeline (Multibranch) |
| 브랜치 지정자 | */main |
| Build with Parameters → ACTION | create-ecr |
다음 명령으로 저장소를 확인합니다:
aws ecr describe-repositories --region us-east-1
8.3 Docker 이미지 빌드 및 ECR에 푸시
각 마이크로서비스마다 별도의 파이프라인 작업(또는 단일 멀티브랜치 작업)을 생성합니다. 아래 표를 참고하여 ACTION 파라미터를 정의합니다.
| 서비스 | 빌드 파라미터 (ACTION) |
|---|---|
| emailservice | build-emailservice |
| checkoutservice | build-checkoutservice |
| recommendationservice | build-recommendationservice |
| frontend | build-frontend |
| paymentservice | build-paymentservice |
| productcatalogservice | build-productcatalogservice |
| cartservice | build-cartservice |
| loadgenerator | build-loadgenerator |
| currencyservice | build-currencyservice |
| shippingservice | build-shippingservice |
| adservice | build-adservice |
예시 Jenkinsfile (Groovy)
pipeline {
agent any
environment {
AWS_DEFAULT_REGION = 'us-east-1'
ECR_REPO = "your-account-id.dkr.ecr.${env.AWS_DEFAULT_REGION}.amazonaws.com/${params.SERVICE}"
}
stages {
stage('Checkout') {
steps {
git url: 'https://github.com/vsaraths/Deploy--E-Commerce-Application-eks-microservices-platform-11-Services-.git',
branch: 'main'
}
}
stage('Build Docker Image') {
steps {
sh "docker build -t ${params.SERVICE}:latest ./services/${params.SERVICE}"
}
}
stage('Login to ECR') {
steps {
sh "aws ecr get-login-password | docker login --username AWS --password-stdin ${ECR_REPO}"
}
}
stage('Push Image') {
steps {
sh """
docker tag ${params.SERVICE}:latest ${ECR_REPO}:latest
docker push ${ECR_REPO}:latest
"""
}
}
}
}
각 작업에 맞는 서비스 이름으로 ${params.SERVICE} 를 교체하십시오.
Argo CD – 점프호스트 EC2에 설치
단계 13 – Argo CD 설치
# 13.1 Create a namespace for Argo CD
kubectl create namespace argocd
# 13.2 Install Argo CD manifests
kubectl apply -n argocd \
-f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
# 13.3 Verify the installation
kubectl get pods -n argocd # All pods should be in the Running state.
# 13.4 (Optional) Validate the cluster nodes
kubectl get nodes
Argo CD UI에 접근하기 (포트‑포워드 예시)
kubectl port-forward svc/argocd-server -n argocd 8080:443
# Then open https://localhost:8080 in your browser.
요약
- AWS 비용을 실시간으로 모니터링 – CostWatch 사용.
- 재사용 가능한 점프호스트를 Terraform + Ansible으로 프로비저닝.
- Jenkins를 설정하고, 필요한 플러그인, 자격 증명, 그리고 EKS, ECR 및 모든 마이크로서비스용 파이프라인을 구성.
- 점프호스트에 Argo CD를 설치하여 GitOps 배포를 관리.
이러한 단계를 따르면 반복 가능하고 디버깅이 용이하며 프로덕션 준비가 된 DevOps 기반을 구축할 수 있습니다. 즐거운 개발 되세요!
테스트 포드 (필요한 경우)
kubectl get nodes
13.5 – 모든 ArgoCD 리소스 나열하기
출력 생략.
13.6 – LoadBalancer 로 ArgoCD 서버 노출하기
13.6.1 – ArgoCD 서버 서비스 편집
-
ArgoCD 서버 서비스 매니페스트(예:
argocd-server-svc.yaml)를 찾습니다. -
다음 줄을 찾아 교체합니다:
Original snippet
type: ClusterIP # ' send_resolved: trueUpdated snippet
type: LoadBalancerNote:
send_resolved: true라인은 Alertmanager 설정에 해당하므로 ArgoCD 서비스 매니페스트에서 제거해야 합니다. -
변경 사항을 적용합니다
kubectl apply -f argocd-server-svc.yaml
13.6.2 – Alertmanager Pod 재시작
kubectl rollout restart deployment/kube-prom-stack-alertmanager -n monitoring
⚠️ Gmail users: Gmail을 통해 알림을 보내야 하는 경우, “보안 수준이 낮은 앱 허용”을 활성화하거나 Google 계정 보안 설정에서 앱 비밀번호를 생성하십시오. 이렇게 하면 Gmail SMTP 서버를 사용할 때 Alertmanager가 인증할 수 있습니다.
CPU 사용량 알림 규칙 추가
cpu-alert-rule.yaml 파일을 생성합니다:
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: cpu-alert
namespace: monitoring
spec:
groups:
- name: cpu.rules
rules:
- alert: HighCPUUsage
expr: sum(rate(container_cpu_usage_seconds_total{namespace="argocd"}[5m])) by (pod) > 0.7
for: 2m
labels:
severity: warning
annotations:
summary: "CPU usage > 70% on pod {{ $labels.pod }}"
description: "CPU usage has been above 70% for more than 2 minutes."
규칙을 적용합니다:
kubectl apply -f cpu-alert-rule.yaml
Prometheus 서비스 편집
서비스 유형을 LoadBalancer 로 변경하고 (Alertmanager와 동일한 단계) 변경 사항을 적용합니다.
Prometheus LoadBalancer IP 가져오기
kubectl get svc -n monitoring kube-prom-stack-prometheus
예시 URL
http://a1b2c3d4.us-east-1.elb.amazonaws.com:9090
이제 Prometheus, Grafana에 접근할 수 있으며, CPU 사용량이 정의된 한도를 초과하면 이메일 알림을 받을 수 있습니다.
🎉 Final Checklist
- ✅ Prometheus & Grafana installed
- ✅ Grafana dashboards imported (Kubernetes, Argo CD, etc.)
- ✅ Alertmanager reachable via LoadBalancer and email alerts configured
- ✅ CPU/RAM metrics for your Argo CD app visible in Grafana
You’re all set! 🎉