Skip to content

fix: self-fetch 522 에러 해결을 위한 호환성 플래그 추가#29

Merged
devchanki merged 1 commit intomainfrom
8-big-o
Apr 17, 2026
Merged

fix: self-fetch 522 에러 해결을 위한 호환성 플래그 추가#29
devchanki merged 1 commit intomainfrom
8-big-o

Conversation

@devchanki
Copy link
Copy Markdown
Contributor

커스텀 도메인에서 같은 Worker로 self-fetch 시 522가 발생하는
Cloudflare 제한을 global_fetch_strictly_public 플래그로 해제

커스텀 도메인에서 같은 Worker로 self-fetch 시 522가 발생하는
Cloudflare 제한을 global_fetch_strictly_public 플래그로 해제

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@cloudflare-workers-and-pages
Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
github 1d09416 Commit Preview URL Apr 17 2026, 02:58 PM

@devchanki devchanki requested a review from sounmind April 17, 2026 14:59
@devchanki devchanki merged commit 43488ff into main Apr 17, 2026
2 checks passed
@lkhoony
Copy link
Copy Markdown
Contributor

lkhoony commented Apr 19, 2026

트러블슈팅

1. 문제 상황

PR 이벤트 발생 시 AI 분석 댓글(패턴 태깅 / 학습 현황 / 복잡도 분석)이 작성되지 않는 현상.

Cloudflare Workers 로그에서 handlePullRequestEvent는 정상 실행되고 다음 로그까지 찍히지만,

[handlePullRequestEvent] Dispatched 3 AI handlers for PR #<N>

디스패치된 /internal/* 핸들러가 실제로는 실행되지 않았음.

2. 에러 로깅 추가로 원인 식별

기존 디스패치 코드는 .catch()만 있어 네트워크 에러만 포착했고, fetch가 HTTP 5xx로 정상 resolve된 경우는 로그에 남지 않았음. 복잡도 분석 디스패치에 응답 상태 로깅 추가 (5bb8f7b):

const res = await fetch(`${baseUrl}/internal/complexity-analysis`, { ... });
if (!res.ok) {
  const text = await res.text().catch(() => "");
  console.error(`[dispatch] complexityAnalysis HTTP ${res.status}: ${text}`);
}

로그에서 HTTP 522 (Connection timed out) 확인.

3. 첫 시도 — 환경변수 동기화

wrangler.jsoncWORKER_URLhttps://github.dalestudy.workers.dev로 정상이었으나, Cloudflare 대시보드에 설정된 plain-text vars가 github.daleseo.workers.dev로 오타가 있었음. 대시보드 값이 wrangler.jsoncvars를 오버라이드하여 배포 이후에도 잘못된 URL이 유지되는 상태였음.

대시보드 값을 수정해 양쪽을 일치시켰음 (3f29950). 그러나 522는 계속 발생. 도메인 문제가 아니라 Cloudflare 플랫폼 동작에 원인이 있다고 판단.

4. 522 발생 원인 — Cloudflare self-fetch 동작

참고: Cloudflare 522 공식 문서 — 522는 Cloudflare 엣지가 오리진 서버에 TCP 연결을 수립하지 못했을 때 반환됨.

현재 구조는 Worker가 자기 자신의 커스텀 도메인(github.dalestudy.workers.dev)으로 fetch()를 호출하는 self-fetch 패턴이며, subrequest 예산을 새 invocation으로 분리하기 위한 설계임.

Cloudflare 기본 동작에서는 Worker가 같은 존(zone)의 호스트로 fetch할 때 내부 루프백으로 라우팅을 최적화함. 이 경로에서 다음과 같은 제약이 발생함:

  • 내부 루프백 경로는 같은 Worker로의 재진입을 무한 재귀 방지 정책으로 차단함
  • 커스텀 도메인이 자기 자신을 가리키는 상황에서 내부 리졸버가 연결을 수립하지 못함
  • 엣지 관점에서는 오리진 도달 실패로 판단하여 522 Connection timed out을 반환

오리진(자기 자신)이 실제로는 가용한 상태였지만, Cloudflare의 루프백 최적화 정책에 의해 연결이 거부되는 상황이었음.

5. `global_fetch_strictly_public` 플래그 적용

wrangler.jsonc:5에 호환성 플래그 추가:

{
  "compatibility_flags": ["global_fetch_strictly_public"]
}

이 플래그는 Worker에서 발생하는 모든 fetch() 호출을 외부 트래픽으로 처리하도록 강제함.

구분 플래그 OFF (기본) 플래그 ON
self-fetch 경로 내부 루프백 최적화 퍼블릭 엣지 경유 강제
같은 Worker 재진입 무한 재귀 방지로 차단 → 522 엣지에서 외부 요청으로 인식 → 새 invocation 생성
subrequest 예산 연결 실패 새 invocation마다 독립 할당 (무료 50 / 유료 1000)

플래그 활성화 후 self-fetch는 퍼블릭 엣지를 경유하는 외부 요청으로 처리되어, 엣지가 해당 Worker를 새로운 invocation으로 부팅함. 각 invocation은 독립된 subrequest 예산을 가지며, 이것이 엔드포인트별 예산 분리 구조의 전제 조건임.

배포 후 /internal/tag-patterns, /internal/learning-status, /internal/complexity-analysis 세 디스패치 모두 정상 invocation 생성 및 댓글 작성 확인.

정리

  • fetch().catch()만으로는 HTTP 에러가 로그에 남지 않으므로, 디스패치 코드에는 res.ok 체크와 상태 로깅을 기본으로 포함해야 함.
  • Cloudflare 환경변수는 wrangler.jsonc와 대시보드 양쪽에서 관리될 경우 값이 틀어질 수 있으므로 단일 소스로 관리해야 함.
  • Cloudflare Workers에서 self-fetch로 invocation을 분리하는 구조를 사용할 경우 global_fetch_strictly_public 플래그가 필수임.

@soobing
Copy link
Copy Markdown
Contributor

soobing commented Apr 19, 2026

@devchanki @lkhoony 공유 감사합니다!! 👍🏻

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants