Skip to content

Latest commit

Β 

History

History
102 lines (76 loc) Β· 4.29 KB

File metadata and controls

102 lines (76 loc) Β· 4.29 KB

πŸš€ 배포 κ°€μ΄λ“œ (단일 EC2 + Docker + Terraform)

리전: ap-northeast-2 (μ„œμšΈ) / ꡬ쑰: 단일 EC2 μ•ˆμ— app + mysql + redis μ»¨ν…Œμ΄λ„ˆ 운영 방식: ν…ŒμŠ€νŠΈν•  λ•Œλ§Œ terraform apply둜 올리고, λλ‚˜λ©΄ terraform destroy둜 λ‚΄λ¦Ό (μž„μ‹œ ν™˜κ²½)

μ΅œμ’… λͺ©ν‘œ: 단일 μ„œλ²„λ‘œ λ°°ν¬ν•˜λ˜ scale-out(닀쀑 μ„œλ²„) μ„±λŠ₯ 차이λ₯Ό μΈ‘μ •ν•  수 있게 λ§Œλ“œλŠ” 것. 이 λ¬Έμ„œλŠ” 첫 배포 κΈ°μ€€ μ²΄ν¬λ¦¬μŠ€νŠΈλ‹€.


μ•„ν‚€ν…μ²˜

        EC2 (t3.medium, Ubuntu, ap-northeast-2)
   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
   :80  app (Spring Boot)
          β”œβ”€β”€ mysql   (μ»¨ν…Œμ΄λ„ˆ, EBS λ³Όλ₯¨)
          └── redis   (μ»¨ν…Œμ΄λ„ˆ)
   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
   Terraform둜 ν”„λ‘œλΉ„μ €λ‹ Β· user-data둜 λΆ€νŠΈμŠ€νŠΈλž©

Phase 0 β€” 사전 μ€€λΉ„ (μ½”λ“œ + 계정)

배포 3단계 전에 λ°˜λ“œμ‹œ 끝내야 ν•˜λŠ” μ€€λΉ„.

μ½”λ“œ

  • docker-compose.prod.yml에 MySQL μ»¨ν…Œμ΄λ„ˆ μΆ”κ°€ + app이 DB_HOST=mysql둜 μ—°κ²°
  • μ•± 이미지 μž¬λΉŒλ“œ & Docker Hub push β€” ⚠️ μ΅œμ‹  λ¦¬νŒ©ν„°λ§ 반영본으둜 (κΈ°μ‘΄ μ΄λ―Έμ§€λŠ” μ˜› μ½”λ“œ) bash ./gradlew clean bootJar docker build -t <DOCKER_USERNAME>/docker-springboot:latest . docker push <DOCKER_USERNAME>/docker-springboot:latest
  • μ‹œλ“œ 데이터 β€” ⚠️ κ³Όλͺ©/νšŒμ›μ΄ μ—†μœΌλ©΄ λΆ€ν•˜ν…ŒμŠ€νŠΈμ—μ„œ μ‹ μ²­ν•  λŒ€μƒμ΄ μ—†μŒ β†’ DataInitializer(CommandLineRunner)둜 κ³Όλͺ© + ν…ŒμŠ€νŠΈ νšŒμ› Nλͺ… 생성 (BCrypt ν•΄μ‹œ 처리)
  • .env μž‘μ„± (DB λΉ„λ²ˆ λ“±) + .gitignore 확인 (컀밋 κΈˆμ§€)

계정 / 도ꡬ

  • AWS 계정, IAM μ‚¬μš©μž + μ•‘μ„ΈμŠ€ν‚€ λ°œκΈ‰ (Terraform용, μ΅œμ†ŒκΆŒν•œ)
  • λ‘œμ»¬μ— AWS CLI μ„€μΉ˜ + aws configure (region: ap-northeast-2)
  • λ‘œμ»¬μ— Terraform μ„€μΉ˜
  • SSH ν‚€νŽ˜μ–΄ 생성 (ssh-keygen -t ed25519)

Phase 1 β€” ν”„λ‘œλΉ„μ €λ‹ (Terraform)

μ½”λ“œλ‘œ AWS λ¦¬μ†ŒμŠ€λ₯Ό μ •μ˜ν•˜κ³  apply.

  • Terraform ν”„λ‘œμ νŠΈ ꡬ쑰
    • provider.tf β€” AWS provider, region = "ap-northeast-2"
    • main.tf β€” λ¦¬μ†ŒμŠ€ μ •μ˜
    • variables.tf / terraform.tfvars(gitignore) β€” λ³€μˆ˜Β·λΉ„λ°€κ°’
    • outputs.tf β€” μ™„λ£Œ ν›„ 퍼블릭 IP 좜λ ₯
  • λ¦¬μ†ŒμŠ€
    • κΈ°λ³Έ VPC/μ„œλΈŒλ„· (data둜 μ°Έμ‘°, μƒˆλ‘œ μ•ˆ λ§Œλ“¦)
    • Security Group: 22(SSH, λ‚΄ IP만), 80(HTTP, 전체)
    • Key Pair (Phase 0 κ³΅κ°œν‚€ 등둝)
    • EC2: t3.medium, Ubuntu 22.04 (AMIλŠ” data둜 μ΅œμ‹  쑰회)
    • (선택) Elastic IP β€” μž¬μ‹œμž‘ μ‹œ IP κ³ μ • (μ•ˆ μ“°λ©΄ μƒλž΅)
  • terraform init β†’ plan β†’ apply β†’ 퍼블릭 IP νšλ“

Phase 2 β€” λΆ€νŠΈμŠ€νŠΈλž© (user-data)

EC2κ°€ λΆ€νŒ…ν•˜λ©° μžλ™ μ‹€ν–‰ν•˜λŠ” 슀크립트.

  • user-data.sh
    • Docker + docker-compose plugin μ„€μΉ˜
    • μ•± 파일 배치: docker-compose.prod.yml, .env (git clone λ˜λŠ” scp)
    • .env λΉ„λ°€κ°’ μ£Όμž… (ν•™μŠ΅ λ‹¨κ³„λŠ” scp, 이후 SSM Parameter Store ꢌμž₯)
  • lua λ“± λ¦¬μ†ŒμŠ€λŠ” jar(classpath)에 ν¬ν•¨λ˜λŠ”μ§€ 확인 β†’ ν¬ν•¨λ˜λ©΄ 별도 전솑 λΆˆν•„μš”

Phase 3 β€” 배포 & 검증

  • docker compose -f docker-compose.prod.yml up -d
  • MySQL μŠ€ν‚€λ§ˆ: ddl-auto: updateκ°€ ν…Œμ΄λΈ” μžλ™ 생성 β†’ μ‹œλ“œλ‘œ κ³Όλͺ© 데이터 확인
  • 슀λͺ¨ν¬ ν…ŒμŠ€νŠΈ: http://<IP> 접속 β†’ 둜그인 β†’ μˆ˜κ°•μ‹ μ²­ ν”Œλ‘œμš° 1회 (λ¦¬νŒ©ν„°λ§ ν›„ 첫 μ‹€λ™μž‘ 검증)
  • 둜그 확인: docker compose logs -f

Phase 4 β€” 운영 (올리기/내리기)

  • 내릴 λ•Œ: terraform destroy β†’ 과금 λ¦¬μ†ŒμŠ€ 0
  • ⚠️ destroy μ‹œ MySQL μ»¨ν…Œμ΄λ„ˆ 데이터도 μ‚­μ œλ¨ β†’ λΆ€ν•˜ν…ŒμŠ€νŠΈλŠ” 맀번 κΉ¨λ—ν•œ μƒνƒœκ°€ μ’‹κ³ , μ‹œλ”κ°€ λ‹€μ‹œ 채움
  • λ‹€μ‹œ 올릴 λ•Œ: terraform apply

λ‚˜μ€‘μ— (scale-out μ‹€ν—˜ 단계)

  • μ„Έμ…˜ μ™ΈλΆ€ν™”: spring-session-data-redis (닀쀑 μΈμŠ€ν„΄μŠ€ 둜그인 μœ μ§€)
  • nginx + app replica 닀쀑화, 이후 EC2 닀쀑 + ALB
  • μŠ€μΌ€μ€„λŸ¬ 쀑볡 μ‹€ν–‰ 문제 발견 β†’ ShedLock으둜 단일 μΈμŠ€ν„΄μŠ€ μ‹€ν–‰ 보μž₯
  • 단일 vs 닀쀑 μ„œλ²„ λΆ€ν•˜ν…ŒμŠ€νŠΈ(k6) 비ꡐ