본문 바로가기
DevOps

ArgoCD + ALB + CloudFront 환경에서 HTTPS 리다이렉션 정리

by Rainbound-IT 2025. 8. 24.
반응형

쿠버네티스에서 ArgoCD와 여러 앱을 ALB(aws-load-balancer-controller) 뒤에 붙이고, 그 앞단에 CloudFront를 둔 구조를 쓰다 보면 HTTP→HTTPS 리다이렉션 충돌 문제가 자주 발생합니다. 이번 글에서는 실제 경험한 케이스와 함께, 왜 문제가 생기는지, 그리고 어떻게 정리하는 것이 좋은지 정리합니다.


문제 상황

  • ArgoCD, Grafana, Invitation 앱 등 여러 서비스가 같은 ALB 그룹(shared-alb) 을 공유.
  • Invitation 앱의 Ingress에 리다이렉트 액션 (alb.ingress.kubernetes.io/actions.redirect-to-https) 이 설정되어 있었음.
  • 이 액션이 host 제한 없이 / catch-all 로 걸려 있어, 같은 ALB를 쓰는 ArgoCD까지 영향을 받음.

결과적으로 ArgoCD UI 접속 시 브라우저에서같은 에러 발생.

Unable to load data: Request has been terminated

 

재밌는 점은, Grafana 같은 다른 앱은 정상 접속이 가능했다는 것.
→ 왜 유독 ArgoCD만?


왜 ArgoCD만 문제가 됐을까?

  1. ALB DNS로 접근
    • ArgoCD는 http://<ALB-DNS> 로 접속하고 있었음.
    • invitation Ingress가 host 제한 없이 리다이렉트 룰을 걸어둔 상태라, ALB DNS로 들어오는 트래픽은 그대로 redirect 매칭.
  2. 포트 착각
    • ArgoCD Ingress는 listen-ports: [{"HTTP":8080}] 이었지만, 브라우저가 :8080을 명시하지 않으면 기본적으로 80/443 리스너를 탐.
    • 그 리스너에 invitation의 redirect 룰이 있었음.
  3. ArgoCD의 특성
    • /api, /events, /stream 같은 XHR/SSE 통신을 많이 사용.
    • 한 번이라도 301/302 redirect가 섞이면 브라우저에서 바로 실패.
    • 반대로 Grafana는 단순 GET 요청 위주라 체감 영향이 적었음.

ALB 레벨 리다이렉션의 문제점

ALB에서 HTTP→HTTPS 리다이렉션을 걸면 다음과 같은 문제가 있습니다.

  • 같은 ALB 그룹(group.name)을 공유하는 모든 서비스가 영향을 받음.
  • 특정 호스트/경로에만 걸어야 하는데, host 없는 catch-all / 규칙으로 걸리면 사실상 전역 redirect.
  • 규칙 우선순위 충돌 때문에 원치 않는 서비스까지 영향을 받음.

해결 방법

1. Ingress에서 리다이렉션 제거

  • alb.ingress.kubernetes.io/ssl-redirect 주석 제거
  • alb.ingress.kubernetes.io/actions.redirect-to-https 주석 제거
  • 액션 backend (name: redirect-to-https, port.name: use-annotation) 경로 삭제

→ Ingress는 순수 라우팅만 담당.

2. CloudFront에서만 HTTPS 강제

  • CloudFront Behavior의 Viewer protocol policy
    → Redirect HTTP to HTTPS 로 설정
  • CloudFront ACM 인증서(us-east-1) 연결
  • HSTS 헤더도 Response Headers Policy로 추가 가능

이렇게 하면 ALB/Ingress 쪽 리다이렉션은 필요 없습니다. CloudFront가 전부 책임지기 때문입니다.

3. (선택) ArgoCD에 전용 호스트 부여

  • argocd.example.com 같이 명시적인 host를 Ingress에 지정
  • invitation 등 다른 서비스도 host를 반드시 명시
  • ALB DNS로 직접 접속하지 말고, CloudFront + 전용 도메인으로만 접근

4. (대안) ALB 분리

  • 리다이렉트가 꼭 필요한 서비스는 group.name 을 분리해서 별도 ALB 사용
  • 비용은 늘지만 서비스 간섭은 0

점검 방법 (Windows PowerShell)

Ingress 전수 검사:

리눅스용

# 같은 ALB로 병합되는지 확인
kubectl get ing -A -o jsonpath='{range .items[*]}{.metadata.namespace}{"\t"}{.metadata.name}{"\t"}{.metadata.annotations.alb\.ingress\.kubernetes\.io/group\.name}{"\n"}{end}' | sort

# 전역 ssl-redirect 쓰는 Ingress 찾기
kubectl get ing -A -o jsonpath='{range .items[*]}{.metadata.namespace}{"\t"}{.metadata.name}{"\t"}{.metadata.annotations.alb\.ingress\.kubernetes\.io/ssl-redirect}{"\n"}{end}' | grep -v '^\s*$'

# 액션 리다이렉트 쓰는 Ingress 찾기
kubectl get ing -A -o json | jq -r '
.items[] as $i
| ($i.metadata.annotations // {}) | to_entries[]
| select(.key|startswith("alb.ingress.kubernetes.io/actions."))
| "\($i.metadata.namespace)\t\($i.metadata.name)\t\(.key)"'

 

윈도우용
# ALB 그룹 이름 확인
kubectl get ing -A -o json | ConvertFrom-Json |
  Select-Object -ExpandProperty items |
  ForEach-Object {
    $ns=$_.metadata.namespace; $name=$_.metadata.name
    $group=$_.metadata.annotations."alb.ingress.kubernetes.io/group.name"
    if ($group) { "$ns`t$name`t$group" }
  }

# ssl-redirect 주석 확인
kubectl get ing -A -o json | ConvertFrom-Json |
  Select-Object -ExpandProperty items |
  ForEach-Object {
    $ns=$_.metadata.namespace; $name=$_.metadata.name
    $redirect=$_.metadata.annotations."alb.ingress.kubernetes.io/ssl-redirect"
    if ($redirect) { "$ns`t$name`t$redirect" }
  }

# 액션 redirect 주석 확인
kubectl get ing -A -o json | ConvertFrom-Json |
  Select-Object -ExpandProperty items |
  ForEach-Object {
    $ns=$_.metadata.namespace; $name=$_.metadata.name
    $_.metadata.annotations.PSObject.Properties.Name |
      Where-Object { $_ -like "alb.ingress.kubernetes.io/actions.*" } |
      ForEach-Object { "$ns`t$name`t$_" }
  }

최종 아키텍처 권장안

  • CloudFront
    • Viewer protocol policy = Redirect HTTP to HTTPS
    • ACM(us-east-1) 인증서 연결
    • WAF, Caching, HSTS 헤더 관리
  • ALB/Ingress
    • 순수 라우팅만 (redirect 없음)
    • host와 path를 명확히 지정
    • group.name 공유 시에도 redirect 간섭 없음
  • ArgoCD
    • --insecure 로 HTTP 모드 + ALB HTTPS 종료,
      또는 end-to-end TLS(backend-protocol=HTTPS)로 일관되게
    • 전용 host 지정 후 CloudFront로만 접근

결론

  • HTTP→HTTPS 리다이렉션은 CloudFront에서만
  • Ingress/ALB는 리다이렉션을 제거하고 순수 라우팅만 담당
  • 서비스마다 host를 명시해 충돌 방지
  • (필요시) ALB 그룹 분리로 간섭 완전 제거

이렇게 구성하면 ArgoCD 같은 민감한 앱도 안정적으로 동작하고, 리다이렉션 정책도 CloudFront에서 일원화할 수 있습니다.

반응형

댓글