Terraform을 이용한 AWS 리소스 프로비저닝과 Ansible을 이용한 서버 설정 관리를 위한 Infrastructure as Code (IaC) 솔루션.
# 원클릭 배포
./deploy.sh
# 모니터링 스택 포함 배포
./deploy.sh --enable-monitoring
# Ansible 설정만 실행
./deploy.sh --skip-terraform- VPC: 격리된 네트워크 (10.0.0.0/16)와 public/private 서브넷
- EC2: Ubuntu 22.04 t3.micro 인스턴스 및 Elastic IP
- RDS: Private 서브넷의 MySQL 8.0 데이터베이스
- 보안: Key 기반 SSH, fail2ban, SSL 지원 nginx
- 시스템: Swap 메모리, SSH 터널링, 보안 강화
- 도구: zsh, oh-my-zsh, fzf, tmux, vim, docker
- 웹 스택: nginx, certbot, fail2ban, 로그 순환
- 모니터링: Prometheus, Grafana, Node Exporter (선택사항)
./deploy.sh인프라를 배포하고 핵심 서비스로 서버를 설정
./deploy.sh --enable-monitoringPrometheus + Grafana 모니터링 스택을 포함
./deploy.sh --tags "system,folders,tools"특정 Ansible 설정 작업을 실행
# 1. 인프라 배포
cd terraform/environments/dev
terraform apply
# 2. Terraform 출력을 Ansible에 연결
cd ../../ansible
./inventory/get_ec2_ip.sh
# 3. 서버 설정
ansible-playbook playbooks/site.yml --tags "system,folders,tools,infrastructure"infrastructure-project/
├── deploy.sh # 🚀 원클릭 배포 스크립트
├── terraform/
│ ├── environments/
│ │ └── dev/ # 개발 환경
│ └── modules/ # 재사용 가능한 Terraform 모듈
│ ├── vpc/ # 네트워크 인프라
│ ├── ec2/ # 컴퓨팅 인스턴스
│ ├── eip/ # Elastic IP 주소
│ └── rds/ # 데이터베이스 인스턴스
└── ansible/
├── inventory/ # 서버 인벤토리 관리
├── playbooks/ # Ansible 플레이북
└── roles/ # 설정 역할
├── system_config/ # 기본 시스템 설정
├── folder_structure/ # 애플리케이션 디렉토리
├── base_tools/ # CLI 도구 및 셸
├── programming_env/ # 개발 환경
├── infrastructure/ # 웹 서비스 및 보안
└── monitoring/ # Prometheus 및 Grafana
- Terraform >= 1.0
- Ansible >= 2.9
- AWS CLI
likelion-terraform프로필로 설정
-
AWS 프로필 생성:
aws configure --profile likelion-terraform
-
EC2 Key Pair 생성 (AWS 콘솔에서):
- 이름:
likelion-terraform-key - 리전:
ap-northeast-2(서울) - 다운로드 후
~/.ssh/aws/likelion-terraform-key에 저장 - 권한 설정:
chmod 600 ~/.ssh/aws/likelion-terraform-key
- 이름:
-
필요한 AWS 권한:
- EC2 (인스턴스, 보안 그룹, 키 페어)
- VPC (네트워크, 서브넷, 게이트웨이)
- RDS (데이터베이스, 서브넷 그룹)
- Route53 (사용자 정의 도메인 사용 시)
- 22 - SSH 접근 (키 기반 인증)
- 80 - HTTP (HTTPS로 리다이렉트)
- 443 - HTTPS (certbot을 통한 SSL 인증서)
- 3000 - Grafana 대시보드 (선택사항)
- 9090 - Prometheus 메트릭 (선택사항)
- fail2ban: SSH 무차별 대입 공격 방지
- 키 인증: 비밀번호 없는 SSH 접근
- Private RDS: Private 서브넷에 격리된 데이터베이스
- SSH 터널링: 팀을 위한 안전한 데이터베이스 접근
- 보안 그룹: 네트워크 수준 접근 제어
--enable-monitoring 플래그로 활성화:
- Prometheus:
http://your-server:9090 - Grafana:
http://your-server:3000(admin/grafana123) - Node Exporter: 포트 9100의 시스템 메트릭
/home/ubuntu/
├── config/
│ ├── prometheus/ # Prometheus 설정
│ └── grafana/ # Grafana 설정
├── apps/monitoring/
│ └── grafana/dashboards/ # 사용자 정의 대시보드
├── logs/ # 애플리케이션 로그
└── /opt/monitoring/ # 데이터 저장소
# 한 번에 터널 생성 + 사용자 설정
./setup_database.sh
# 커스텀 비밀번호로 설정
MYCE_PASSWORD=secure123 JOBDAM_PASSWORD=secure456 ./setup_database.sh
# 터널만 관리
./setup_database.sh tunnel-start
./setup_database.sh tunnel-stop
./setup_database.sh tunnel-status- 호스트: RDS 엔드포인트 (private 서브넷)
- 데이터베이스:
myce_database - 관리자:
admin/myceforever - 터널 포트:
3307(로컬)
MYCE 팀:
myce_choi,myce_gu,myce_g1,myce_leemyce_kim,myce_in,myce_hwang
Jobdam 팀:
jobdam_juan,jobdam_prod
모든 사용자는 myce_database.*에 대한 전체 권한을 가집니다.
자동화된 방법 (권장):
./setup_database.sh tunnel-start # 터널 시작
mysql -h localhost -P 3307 -u myce_choi -p myce_database수동 터널:
# 1. SSH 키 복사 (최초 1회)
scp -i ~/.ssh/aws/likelion-terraform-key ubuntu@43.203.98.133:/home/dbtunnel/.ssh/db_tunnel_key ./dbtunnel_private_key
chmod 600 ./dbtunnel_private_key
# 2. 터널 생성
ssh -N -L 3307:likelion-terraform-dev-mysql.cb06282489sk.ap-northeast-2.rds.amazonaws.com:3306 dbtunnel@43.203.98.133 -i dbtunnel_private_key
# 3. 데이터베이스 연결
mysql -h localhost -P 3307 -u admin -p myce_database데이터베이스 전용 SSH 터널링:
- 터널 사용자:
dbtunnel - 키 위치:
/home/dbtunnel/.ssh/db_tunnel_key(EC2에서) - 제한사항: 포트 포워딩만 가능, 셸 접근 불가
- 로컬 키:
./dbtunnel_private_key(로컬 복사본)
# 전체 설정 (터널 + 사용자 생성)
./setup_database.sh
# 커스텀 비밀번호로 설정
MYCE_PASSWORD=YourPassword123 ./setup_database.sh
# 터널 관리만
./setup_database.sh tunnel-start # 터널 시작
./setup_database.sh tunnel-stop # 터널 중지
./setup_database.sh tunnel-status # 터널 상태 확인
# 도움말
./setup_database.sh helpAnsible playbook 직접 실행:
cd ansible
ansible-playbook -i inventory/hosts playbooks/database.ymlterraform/environments/dev/terraform.tfvars 편집:
db_password = "your-secure-password"배포 후 ansible/group_vars/all.yml에 자동 생성.
배포 후 다음에서 자세한 가이드 찾기:
ansible/database-connection-guide.md- 데이터베이스 접근 지침/home/ubuntu/logs/의 서버 로그/home/ubuntu/config/의 설정 파일
자동으로 생성되는 정리된 애플리케이션 레이아웃:
/home/ubuntu/
├── apps/
│ ├── backend/ # 백엔드 서비스 및 Docker 설정
│ ├── frontend/ # 정적 프론트엔드 빌드
│ └── monitoring/ # 모니터링 도구 및 대시보드
├── logs/ # 중앙화된 애플리케이션 로그
├── scripts/ # 배포 및 유틸리티 스크립트
├── docker/ # Docker Compose 파일
└── config/ # 설정 파일 및 템플릿
권한 오류로 Terraform 실패:
aws sts get-caller-identity --profile likelion-terraformAnsible 연결 불가:
ansible all -m ping # 연결 테스트
ssh -i ~/.ssh/aws/likelion-terraform-key ubuntu@server-ip # 수동 테스트서비스 시작 안됨:
# 서비스 상태 확인
sudo systemctl status nginx
sudo systemctl status prometheus
sudo systemctl status grafana-server# Terraform 상태 확인
cd terraform/environments/dev && terraform show
# Ansible 연결 테스트
cd ansible && ansible all -m ping
# 서버 설정 확인
ansible all -a "df -h" # 디스크 사용량
ansible all -a "free -m" # 메모리 사용량
ansible all -a "systemctl list-units --type=service --state=running" # 서비스 목록cd terraform/environments/dev
terraform plan # 변경사항 검토
terraform apply # 업데이트 적용cd ansible
ansible-playbook playbooks/site.yml --tags "specific-tag"ansible-playbook playbooks/site.yml --tags "monitoring" -e "enable_monitoring=true"- 개발 환경에서 먼저 변경사항 테스트
- 새로운 기능에 대한 문서 업데이트
- 보안 모범 사례 준수
- 의미 있는 커밋 메시지 사용
이 프로젝트에는 S3와 CloudFront를 사용한 정적 웹사이트 호스팅 및 미디어 배포를 위한 별도의 프론트엔드 인프라가 포함되어 있습니다.
새로운 Terraform 모듈:
terraform/modules/s3/- 프론트엔드 자산 및 미디어 저장을 위한 S3 버킷terraform/modules/cloudfront/- CloudFront CDN 배포판
새로운 환경:
terraform/environments/frontend/- 완전한 S3 + CloudFront 구성
- 프론트엔드 버킷: 정적 웹사이트 호스팅용 퍼블릭 S3 버킷 (React/Vue/Angular 앱)
- 미디어 버킷: 서명된 URL로 안전한 미디어 저장을 위한 프라이빗 S3 버킷
- CloudFront CDN: 캐싱 최적화를 통한 글로벌 콘텐츠 배포
- 보안: 안전한 S3 접근을 위한 Origin Access Control (OAC)
- SPA 지원: 단일 페이지 애플리케이션을 위한 사용자 정의 오류 처리
# 프론트엔드 환경으로 이동
cd terraform/environments/frontend
# 변수 파일 복사 및 구성
cp terraform.tfvars.example terraform.tfvars
# 초기화 및 배포
terraform init
terraform plan
terraform applyterraform/environments/frontend/terraform.tfvars 편집:
aws_region = "ap-northeast-2"
aws_profile = "likelion-terraform-current"
project_prefix = "myce"
environment = "frontend"배포 완료 후 다음을 얻을 수 있습니다:
- 프론트엔드 URL:
https://xyz.cloudfront.net- 웹 애플리케이션 호스팅용 - 미디어 URL:
https://abc.cloudfront.net- 미디어 파일 서빙용 - S3 버킷 이름: AWS CLI 또는 SDK를 통한 콘텐츠 업로드용
프론트엔드 파일 업로드:
aws s3 sync ./build/ s3://myce-frontend-bucket --profile likelion-terraform-current미디어 파일 업로드:
aws s3 cp ./image.jpg s3://myce-media-bucket/images/ --profile likelion-terraform-currentCloudFront 캐시 무효화:
aws cloudfront create-invalidation --distribution-id DISTRIBUTION_ID --paths "/*" --profile likelion-terraform-current문제 및 질문은:
- 문제 해결 섹션 확인
- 생성된 문서 검토
/home/ubuntu/logs/의 서비스 로그 확인- AWS 콘솔에서 리소스 상태 확인