Cloudflare Proxy가 내 Lambda ALB 통신을 조용히 깨뜨린 방법
Source: Dev.to
번역할 텍스트를 제공해 주시면 한국어로 번역해 드리겠습니다.
흐름 (수정 전)
flowchart LR
Browser -->|①| CF1[Cloudflare Edge (api.hoge.com)]
CF1 -->|②| Lambda
Lambda -->|③ backend.hoge.com = Cloudflare IP| CF2[Cloudflare Edge (backend.hoge.com)]
CF2 -->|❌ Error 1000| ALB
빠른 해결책
backend.hoge.com에 대해 Proxy OFF로 설정합니다.
장기 계획: Lambda → ALB 통신을 VPC 내부로 이동합니다.
오류
프론트엔드에서 API를 호출했을 때 403 Forbidden와 함께 다음과 같은 본문이 반환되었습니다:
Cloudflare Error 1000
DNS points to prohibited IP
API Gateway와 Lambda는 정상으로 보였으며, ECS 측에서는 로그가 없었으므로 ALB/WAF가 원인이 아니었습니다.
아키텍처
flowchart LR
Browser -->|HTTPS| APIGW[API Gateway]
APIGW --> Lambda
Lambda -->|HTTPS backend.hoge.com| ALB
ALB --> ECS
ECS --> RDS
Lambda는 BFF(Backend‑for‑Frontend) 역할을 합니다. 백엔드는 ALB + ECS(레거시 제약)에서 실행됩니다. Lambda는 backend.hoge.com 도메인을 사용해 HTTPS로 ALB에 호출합니다.
문제 해결 단계
-
초기 의심 대상 – WAF 규칙, 보안‑그룹 제한, ECS 인증 로직, API‑Gateway 인증자.
-
ECS 로그 없음 – 요청이 ALB에 도달하지 않았음을 나타냄.
-
curl테스트curl -v https://backend.hoge.com응답 헤더에 포함된 내용:
server: cloudflare본문에
DNS points to prohibited IP가 포함되어 있어, Cloudflare 자체가 403을 반환하고 있음을 확인함. -
문서 확인 – Cloudflare 오류 1000은 A 레코드가 Cloudflare 소유 IP를 가리키거나, 요청이 다른 역방향 프록시를 통해 라우팅되어 다시 Cloudflare에 도달할 때 발생합니다.
Source: …
근본 원인
Cloudflare DNS 설정:
| 레코드 | 프록시 |
|---|---|
api.hoge.com | ON |
backend.hoge.com | ON |
api.hoge.com의 프록시가 ON 상태였기 때문에, 브라우저 트래픽은 이미 Lambda에 도달하기 전에 Cloudflare Edge를 통과했습니다.- Lambda가
backend.hoge.com(프록시 ON)에 요청을 보냈을 때, 해당 도메인은 Cloudflare Anycast IP로 해석되어 요청이 다시 Cloudflare Edge로 들어가 루프가 발생했습니다.
루프 다이어그램
flowchart LR
Browser -->|①| CF1[Cloudflare Edge (api.hoge.com)]
CF1 -->|②| Lambda
Lambda -->|③ backend.hoge.com = Cloudflare IP| CF2[Cloudflare Edge (backend.hoge.com)]
CF2 -->|❌ Error 1000| ALB
ALB --> ECS
ECS --> RDS
왜 Error 1000인가?
Cloudflare는 루프가 감지되었거나 해석된 오리진 IP가 다음 중 하나에 해당할 때 Error 1000을 반환합니다:
- Cloudflare 소유 IP 대역 (루프 방지)
- RFC 1918 사설 주소 (
10.x.x.x,172.16.x.x,192.168.x.x) - 루프백 주소 (
127.0.0.1)
우리 경우 backend.hoge.com이 Cloudflare IP로 해석되었기 때문에, Cloudflare는 해당 요청을 자신에게 향한 것으로 판단하고 차단했습니다.
Fix #1 – 빠른 해결
backend.hoge.com에 대한 Proxy OFF를 설정합니다.
| 레코드 | Proxy |
|---|---|
backend.hoge.com | OFF |
이제 DNS는 Cloudflare IP 대신 실제 원본 CNAME(ALB 도메인)을 반환하여 루프가 끊어집니다.
수정 후 흐름
flowchart LR
Lambda -->|backend.hoge.com = ALB domain| ALB
ALB --> ECS
ECS --> RDS
요청이 다시 정상적으로 흐릅니다.
배운 점
Cloudflare는 DNS 그 이상이다
권한 있는 DNS, 리버스‑프록시, CDN, 그리고 WAF를 결합합니다. Proxy ON일 때 모든 트래픽은 원본에 도달하기 전에 Cloudflare Edge를 통해 라우팅됩니다.
- 브라우저 트래픽에 적합 (DDoS 방어, 캐싱, WAF).
- 원본이 Cloudflare 뒤에 있을 경우 서버‑간 통신에 문제가 발생할 수 있음.
Proxy ON과 OFF가 전체 트래픽 경로를 변경한다
flowchart LR
subgraph Proxy_OFF
C1[Client] -->|ALB domain| ALB1[ALB]
end
subgraph Proxy_ON
C2[Client] --> CF[Cloudflare Edge] --> ALB2[ALB]
end
사용 사례에 맞게 Proxy 설정 맞추기
| 사용 사례 | 프록시 |
|---|---|
| 브라우저 → API | ON (CDN + WAF 이점) |
| 서버 → 서버 (내부) | OFF (루프 방지) |
핵심 요약: 자체 인프라에서 호출될 모든 도메인에 대해 Cloudflare 프록시 설정을 항상 확인하세요. 간단한 “Proxy ON” 설정이 의도치 않게 요청 루프를 만들고 Cloudflare 오류 1000으로 나타날 수 있습니다.
빠른 해결책 (임시)
서버가 Proxy ON 도메인을 호출하고, 호출하는 서비스 자체가 Cloudflare 뒤에 있는 경우, Error 1000을 유발하는 루프가 발생할 위험이 있습니다.
Source:
장기적인 해결 방안
공용 DNS 이름을 통해 Lambda → ALB 트래픽을 라우팅하는 것은 작동하지만 이상적이지 않습니다.
이 통신을 VPC 내부로 이동하는 것이 올바른 해결책입니다.
flowchart LR
Browser -->|HTTPS| APIGW[API Gateway]
APIGW --> Lambda
subgraph VPC
Lambda -->|VPC‑internal| ALB
ALB --> ECS
ECS --> RDS
end
이 마이그레이션을 진행할 때 유의할 점
- Lambda는 VPC 내부에 배포되어야 합니다 (아직 배포되지 않았다면).
- VPC 배치에 따른 콜드 스타트 영향은 현재 최소 수준이며, AWS가 크게 개선했습니다.
- 보안 그룹에
Lambda → ALB트래픽을 허용하는 명시적인 규칙이 필요합니다.
이 접근 방식은 내부 트래픽에 대한 Cloudflare 의존성을 없애고, 지연 시간을 줄이며, 네트워크 토폴로지를 단순화합니다.
왜 갑자기 깨졌나요?
Proxy ON 설정은 오랫동안 안정적이었는데, 왜 이제야 실패가 발생했을까요?
- 변경 로그에서 Error 1000 감지 또는 프록시 동작에 대한 Cloudflare 공식 발표를 찾을 수 없었습니다.
- “Error 1000이 갑자기 나타남”이라는 커뮤니티 보고는 보통 사용자 측 설정 변경(예: DNS 레코드 업데이트, 호스팅 측 IP 변경)으로 거슬러 올라갑니다.
- 최근 실패를 설명할 수 있는 항목이 있는지 Cloudflare 감사 로그를 아직 검토 중입니다. 더 자세한 내용을 발견하면 이 글을 업데이트하겠습니다.
요약
- 요청이 Proxy ON 도메인을 통과하고 그 요청이 이후에 또 다른 Proxy ON 도메인을 호출하면, Cloudflare가 루프를 생성하여 Error 1000이 발생합니다.
- 서버‑간 통신의 경우, 내부 도메인에 대해 Proxy OFF 로 전환하거나 트래픽을 VPC 내부에만 유지하십시오.