문제 상황#

  • 발생일: 2026-03-22
  • 환경: EKS Staging (goormgb-staging-eks)
  • 증상: Internet-facing ALB에 Elastic IP가 자동으로 할당되어 비용 발생

증상#

발견 경위#

  1. ArgoCD를 type: LoadBalancer (NLB)에서 type: ClusterIP (ALB Ingress)로 변경
  2. NLB 삭제 후 EIP 2개가 남아있음을 발견
  3. EIP 연결 해제/릴리스 시도 시 권한 에러 발생

에러 메시지#

An error occurred (AuthFailure) when calling the DisassociateAddress operation:
You do not have permission to access the specified resource.

확인된 상태#

aws ec2 describe-network-interfaces \
  --filters "Name=addresses.private-ip-address,Values=10.0.18.47" \
  --query 'NetworkInterfaces[*].[Description,NetworkInterfaceId]'

# 결과: ELB app/k8s-stagingalb-4f414fcf8f/...

원인 분석#

AWS 공식 답변#

Internet-facing ALB의 자동 EIP 할당은 정상 동작입니다.

핵심 사항#

항목설명
자동 할당Internet-facing ALB는 EC2 퍼블릭 IPv4 주소 풀에서 자동으로 EIP 할당
서비스 관리service_managed: ALB로 표시되며 AWS가 완전히 관리
수정 불가수동으로 disassociate/release 불가능 (권한 에러 정상)
할당량 미포함계정의 EIP 제한(quota)에 포함되지 않음
자동 정리ALB 삭제 시 자동으로 해제됨

비용 분석#

Public IPv4 주소 비용 (2024년 2월부터 적용)#

  • 시간당: $0.005 per IP
  • ALB 구성: 2개 AZ = 2개 IP
  • 월간 비용: 2 × $0.005 × 24 × 30 = 약 $7.20/월

Staging 환경 예상 비용#

ALB EIP (2개)     : ~$7.20/월
NAT Gateway EIP   : ~$3.60/월 (별도)
----------------------------
총 Public IP 비용 : ~$10.80/월

해결#

Option 1: 현재 유지 (권장 - Staging)#

인터넷 → ALB (Public IP) → Pod

장점:

  • 설정 변경 없음
  • 가장 간단한 구조
  • Grafana, ArgoCD 등 관리 도구 직접 접근 가능

단점:

  • 월 ~$7 비용 발생

적합한 경우:

  • Staging/Dev 환경
  • 관리 도구를 인터넷에서 직접 접근 필요
  • 비용보다 편의성 우선

Option 2: Internal ALB + CloudFront VPC Origin#

인터넷 → CloudFront → (VPC Origin) → Internal ALB → Pod

장점:

  • ALB Public IP 비용 없음
  • CloudFront 캐싱/보안 이점
  • WAF 적용 용이

단점:

  • CloudFront 비용 별도 발생
  • VPC Origin 설정 복잡
  • 모든 도메인을 CloudFront로 라우팅해야 함

설정 방법:

# Ingress annotation 변경
alb.ingress.kubernetes.io/scheme: internal  # internet-facing → internal
# CloudFront VPC Origin (Terraform)
resource "aws_cloudfront_vpc_origin" "alb" {
  vpc_origin_endpoint_config {
    name                   = "alb-origin"
    arn                    = aws_lb.internal.arn
    http_port              = 80
    https_port             = 443
    origin_protocol_policy = "https-only"
  }
}

적합한 경우:

  • Production 환경
  • 강화된 보안 필요
  • 모든 트래픽 CloudFront 경유 가능

Option 3: 관리 도구 VPN 전용 접근#

api.staging.playball.one → CloudFront → Internal ALB
grafana/argocd/kiali     → VPN → Internal ALB

장점:

  • 관리 도구 인터넷 미노출 (보안 강화)
  • API만 public 노출

단점:

  • VPN 설정/운영 필요
  • 관리 도구 접근 불편

적합한 경우:

  • 보안 요구사항 높은 환경
  • 이미 VPN 인프라 있는 경우

Option 4: BYOIP + IPAM (Enterprise)#

자체 IP 블록 사용 → AWS IPAM 통합 → ALB 할당

장점:

  • Public IPv4 비용 절감 가능
  • 고정 IP 블록 사용 가능
  • IP allowlist 관리 용이

단점:

  • BYOIP 구매 필요
  • 설정 복잡
  • 대규모 환경에서만 비용 효율적

적합한 경우:

  • 대규모 Production
  • IP allowlist 요구사항 있는 경우
  • 기존 IP 블록 보유

현재 Staging 결정#

선택: Option 1 (현재 유지)#

이유:

  1. Staging 환경으로 월 $7 비용 수용 가능
  2. Grafana, ArgoCD, Kiali 직접 접근 필요
  3. 추가 설정 복잡도 회피
  4. 프로젝트 종료 예정 (2026-04)으로 단기 운영

현재 아키텍처#

                    ┌─────────────────────────────────────────┐
                    │              Internet                    │
                    └─────────────────┬───────────────────────┘
                                      │
              ┌───────────────────────┼───────────────────────┐
              │                       │                       │
              ▼                       ▼                       ▼
    ┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐
    │   CloudFront    │    │   Direct Access │    │   Direct Access │
    │ api.staging...  │    │ grafana.staging │    │ argocd.staging  │
    └────────┬────────┘    └────────┬────────┘    └────────┬────────┘
             │                      │                      │
             └──────────────────────┼──────────────────────┘
                                    │
                                    ▼
                    ┌───────────────────────────────┐
                    │  ALB (k8s-stagingalb-...)     │
                    │  - internet-facing            │
                    │  - Auto EIP (AWS managed)     │
                    │  - 2 AZ (ap-northeast-2a/c)   │
                    └───────────────┬───────────────┘
                                    │
              ┌─────────────────────┼─────────────────────┐
              │                     │                     │
              ▼                     ▼                     ▼
    ┌─────────────────┐  ┌─────────────────┐  ┌─────────────────┐
    │ Istio Gateway   │  │    Grafana      │  │    ArgoCD       │
    │ → VirtualService│  │  (monitoring)   │  │    (argocd)     │
    │ → Backend Pods  │  └─────────────────┘  └─────────────────┘
    └─────────────────┘

관련 설정 파일#

ALB Ingress (staging/charts/alb-ingress/values.yaml)#

ingress:
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing  # internal로 변경 가능
    alb.ingress.kubernetes.io/target-type: ip

ArgoCD Application (staging/root/values.yaml)#

gitCharts:
  alb-ingress:
    enabled: true
    path: staging/charts/alb-ingress
    namespace: istio-system
    syncWave: "5"
    syncOptions:
      - ApplyOutOfSyncOnly=true
      - PrunePropagationPolicy=foreground
      - Prune=false  # multi-namespace 배포로 prune 비활성화

참고 자료#


트러블슈팅 체크리스트#

EIP 관련 에러 발생 시#

  • EIP가 service_managed: ALB인지 확인
  • ALB가 internet-facing인지 확인
  • EIP 직접 해제 불가 - ALB 삭제 필요

ALB 재생성 시 주의사항#

  • External-DNS가 새 ALB 주소로 업데이트되는지 확인
  • DNS 전파 시간 대기 (1-2분)
  • Target Group 등록 확인

ArgoCD alb-ingress 앱 이슈#

  • Prune=false 설정 확인 (multi-namespace 배포)
  • destination namespace가 아닌 다른 namespace 리소스 삭제 방지