ASG + ALB 무중단 배포 레시피 (Blue/Green/Canary)

도은호·2025년 10월 7일
0

AWS SAA

목록 보기
22/46

목표: 다운타임 0에 가깝게 새 버전을 점진 배포하고, 문제시 즉시 롤백
도구: ALB(Target Group 가중치 분배) + ASG (+ 선택: CodeDeploy/CodePipeline)


1) 용어 정리

  • Blue: 현재 운영 중인 버전(기존 ASG+Target Group)
  • Green: 신규 배포 버전(신규 ASG+Target Group)
  • Canary: 전체 트래픽의 일부(예: 1~10%)만 Green으로 보내 안전성 검증

2) 참조 아키텍처

Client → Route 53(Alias)
        → ALB(HTTPS 443 Listener)
           └─ Target Group A (Blue ASG)
           └─ Target Group B (Green ASG)
  • ALB Listener Action = Weighted forward(TG A/B에 가중치로 분배)
  • 각 TG는 Health Check(예: /healthz, 200 OK) 필수
  • ASG 들은 각 TG에 연결되어 자동 등록/해제

3) 사전 준비 (공통 베스트 프랙티스)

  • Stateless 권장(세션은 ElastiCache/DynamoDB 등 외부화) → Stickiness Off
  • Deregistration delay(기본 300s) 튜닝: API는 5~60s, 장수명 연결은 더 길게
  • Health Check: 짧고 빠른 엔드포인트(/healthz), ELB Health Check 사용
  • Auto Scaling: Target Tracking(예: ALB RequestCountPerTarget) + 적절한 Warmup
  • 관측: CloudWatch 대시보드(4xx/5xx/TargetResponseTime/RequestCount), ALB Access Logs

4) 단계별 — Blue/Green 배포

4.1 Green ASG 생성 & 예열

  1. 새 Launch Template/AMIGreen ASG 생성(Desired N)
  2. Green Target Group B에 연결 → 인스턴스 Healthy 될 때까지 대기

4.2 트래픽 전환(가중치)

  • 초기: Blue=100 / Green=0
  • 전환: Blue=90 / Green=10 → 50/50 → 0/100 (각 스텝마다 모니터링)

CLI 예시 (ALB Listener 가중치 변경)

aws elbv2 modify-listener \
  --listener-arn arn:aws:elasticloadbalancing:...:listener/app/my-alb/... \
  --default-actions '[
    {"Type":"forward",
     "ForwardConfig":{
        "TargetGroups":[
          {"TargetGroupArn":"arn:...:targetgroup/tg-blue/...",  "Weight":90},
          {"TargetGroupArn":"arn:...:targetgroup/tg-green/...", "Weight":10}
        ]
     }
    }
  ]'

4.3 모니터링 & 검증

  • 지표: HTTPCode_Target_5XX_Count, TargetResponseTime, RequestCountPerTarget, 앱 오류율
  • 로그: 샘플링(Trace/분산추적), Error 로그 급증 여부
  • 사용자 시나리오: 주요 기능 합격(로그인/결제 등)

4.4 완료 & 정리

  • Blue=0 / Green=100 도달 → 안정 운영 1~2배포창 모니터링
  • Blue ASG Scale to 0 → 삭제(또는 일정 기간 Warm standby)

5) Canary 전략

5.1 가중치 기반 Canary (권장, 가장 단순)

  • 1~5%로 시작 → 충분한 트래픽/시간(예: 10~30분) 관찰 → 단계 확대

5.2 규칙 기반 Canary (고급)

  • Header/Path 기반(예: /canary 또는 x-canary: true) 으로 내부 사용자/테스터만 Green 사용
  • 장점: 외부 영향 최소화, 특정 유저 그룹 검증

주의: Stickiness가 켜져 있으면 분배 편향이 생길 수 있으니 Canary 구간에서는 Off 권장


6) 롤백 전략(필수 플랜)

  • 가중치 즉시 복구: 문제 시 Blue=100 / Green=0 로 즉시 회귀(수 초)
  • Launch Template/AMI 롤백: Green ASG를 이전 템플릿로 재생성
  • DB/스키마: Backward-compatible 마이그레이션 원칙(Feature flag)
  • 자동 롤백(선택): CodeDeploy의 실패 기준/CloudWatch Alarm 연계

7) CodeDeploy 연동(선택, 자동화)

  • 배포 전략: CodeDeployDefault.AllAtOnce / Canary10Percent5Minutes / Linear10PercentEvery1Minute
  • Lifecycle Hooks: BeforeInstall / AfterInstall / AfterAllowTestTraffic / BeforeAllowTraffic / AfterAllowTraffic
  • Health 기준: ALB 5xx/응답시간/커스텀 CloudWatch 경보 → 실패 시 자동 롤백

8) CloudFormation 스니펫

Resources:
  TgBlue:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      TargetType: instance
      Protocol: HTTP
      Port: 80
      VpcId: vpc-xxxx
      HealthCheckPath: /healthz
      TargetGroupAttributes:
        - Key: deregistration_delay.timeout_seconds
          Value: '60'  # API라 짧게

  TgGreen:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      TargetType: instance
      Protocol: HTTP
      Port: 80
      VpcId: vpc-xxxx
      HealthCheckPath: /healthz

  Alb:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Type: application
      Subnets: [subnet-a, subnet-b]
      SecurityGroups: [sg-alb]

  Lsnr443:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      LoadBalancerArn: !Ref Alb
      Port: 443
      Protocol: HTTPS
      Certificates: [{CertificateArn: arn:aws:acm:...}]
      DefaultActions:
        - Type: forward
          ForwardConfig:
            TargetGroups:
              - TargetGroupArn: !Ref TgBlue
                Weight: 100
              - TargetGroupArn: !Ref TgGreen
                Weight: 0

배포마다 ForwardConfig.Weight만 업데이트하면 Canary/Shift를 자동화할 수 있습니다.


9) 운영 체크리스트

  • Stateless & Stickiness Off(Canary/전환 구간)
  • Deregistration delay/Idle timeout 튜닝(연결 드레이닝)
  • Health Check 빠르고 가벼운 경로 사용
  • 가중치 단계/관측 항목/허용 오류율(OKR) 사전 정의
  • Rollback 스위치(가중치 100/0) 핫키화
  • 알람: 5xx, 지연, 에러율, 배포 실패
  • 로그/트레이싱: Blue/Green 구분 Tag/필드 첨부

10) 흔한 이슈와 대처

  • 트래픽 편향: Stickiness On → Off로 전환
  • 롱 커넥션 종료 지연: deregistration_delay 상향 또는 배포 전 강제 드레인(Graceful shutdown)
  • Green 헬스 불안정: Warmup 늘리기, ASG Desired 임시 상향
  • WAF/캐시 간섭: Canary 구간은 버전별 Path/Host 분리로 캐시/WAF Rule 충돌 최소화

요약

  • 두 개의 Target Group(Blue/Green)ALB 가중치로 분배 → Canary → 점진 전환 → 완전 전환
  • 문제면 가중치 즉시 롤백(Blue=100)
  • Stateless/드레이닝/헬스체크/관측/알람무중단 배포의 5요소
  • 자동화를 원하면 CodeDeployCanary/Linear 전략과 자동 롤백을 붙이기
profile
`•.¸¸.•´´¯`••._.• 🎀 𝒸𝓇𝒶𝓏𝓎 𝓅𝓈𝓎𝒸𝒽💞𝓅𝒶𝓉𝒽 🎀 •._.••`¯´´•.¸¸.•`

0개의 댓글