AWS ALB Ingress Path Configuration
정의 (Definition)
AWS Load Balancer Controller에서 Ingress의 rules는 ALB의 Listener Rule로 변환되며, 이때 경로(Path)의 유일성과 어노테이션 기반의 리디렉션(Redirect) 설정이 올바른 라우팅과 우선순위를 보장하는 핵심 메커니즘입니다.
문제가 되는 배경 (Problem Context)
Ingress를 설정할 때 “HTTP(80)와 HTTPS(443) 트래픽을 모두 받아야 한다”는 요구사항을, rules 목록에 동일한 경로(/)를 포트만 다르게 하여 중복 정의하는 방식으로 구현하려는 시도가 흔합니다.
# ❌ 잘못된 패턴: 동일 Path 중복 정의
rules:
- http:
paths:
- path: / # 1번 규칙
backend: { service: { name: svc, port: { number: 443 } } }
- path: / # 2번 규칙 (중복)
backend: { service: { name: svc, port: { number: 80 } } }이 경우 ALB는 규칙 우선순위(Priority) 에 따라 평가하므로, 먼저 매칭되는 규칙만 유효하고 나머지는 무시되거나 예측 불가능한 라우팅 동작을 유발합니다.
핵심 메커니즘 (How it Works)
- Rule Priority (순차 평가): ALB Listener는 규칙을 우선순위 숫자 순서대로 평가합니다. 조건(Path)이 같은 규칙이 두 개 있다면, 상위 우선순위 규칙이 트래픽을 처리해버립니다.
- Listen Ports:
alb.ingress.kubernetes.io/listen-ports어노테이션은 ALB가 소켓을 열 포트(80, 443) 를 정의하는 것이지, 이를rules에 1:1로 매핑해야 한다는 의미가 아닙니다. - SSL Redirect: HTTP를 HTTPS로 보내는 것은 경로 규칙이 아니라,
alb.ingress.kubernetes.io/ssl-redirect: '443'어노테이션을 통해 HTTP 리스너의 기본 동작(Default Action) 으로 처리해야 합니다.
✅ 권장 설정 패턴
metadata:
annotations:
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]'
alb.ingress.kubernetes.io/ssl-redirect: '443' # HTTP -> HTTPS 강제
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: svc
port:
number: 80 # ALB가 TLS 종료 후 평문으로 전달불변 조건과 보장 범위 (Invariants & Guarantees)
- 보장:
ssl-redirect어노테이션이 설정되면, AWS Controller는 HTTP 리스너에 대해 가장 높은 우선순위의 리디렉션 규칙을 자동 생성합니다. - 비보장: Ingress 매니페스트에 동일 경로를 중복 정의했을 때, 어느 백엔드(80 vs 443)로 트래픽이 흐를지는 보장되지 않습니다(Controller의 처리 순서에 의존).
비유 (Analogy)
- 중복 경로: 건물 로비에 “안내 데스크” 표지판을 두 개 나란히 세워두는 것과 같습니다. 방문객은 눈에 먼저 띄는 첫 번째 표지판만 따르게 됩니다.
- SSL Redirect: 1층(HTTP) 입구에 “업무는 2층(HTTPS)에서 봅니다”라는 안내판을 붙여두는 것입니다. 1층 안쪽에 굳이 안내 데스크를 또 만들 필요가 없습니다.
실무적 함의 (Operational Implications)
- Rule 간소화: Ingress
spec.rules에는 실제 비즈니스 로직이 수행될 백엔드 경로만 정의합니다. (프로토콜 분기는 어노테이션의 영역) - TLS Termination: ALB에서 암호화가 풀리므로(Termination), 백엔드 서비스 포트는 보통 평문 통신 포트(80)를 가리킵니다. (Pod까지 HTTPS여야 한다면
backend-protocol: HTTPS별도 필요)
주의사항 / 오해 (Pitfalls & Misconceptions)
- “포트별로 룰이 필요하다?”:
listen-ports에 80, 443이 있다고 해서rules에도 두 번 적어야 하는 것은 아닙니다.rules는 “어디로 보낼지(Destination)“를 정의하는 곳입니다. - Service Port 혼동:
backend.service.port는 ALB가 트래픽을 보낼 도착지 포트입니다. ALB가 수신하는 포트와 일치시킬 필요가 없습니다.
References
- AWS Load Balancer Controller: SSL Redirect
- AWS Load Balancer Controller: Traffic Routing