
Busan CMC 1st 활동 중 진행하게 된 Ondo 프로젝트에서 빠른 마케팅과 SEO 노출을 목적으로 Domain을 구매했고 적용하려고 했다.

하지만 우리는 서비스를 Serverless로 운영하면서 DB를 Sass인 Supabase로 선택했는데, Supabase에 CName Record 설정을 하던 중 CF 1014 문제가 발생했다.
CF 1014 Trouble Shooting Docs에서 어떤 에러인지 부터 확인했다.
Error 1014: CNAME Cross-User Banned
This error indicates that a CNAME record between domains in different Cloudflare accounts is prohibited.
해당 에러는 Cloudflare 서로 다른 계정의 도메인에 대해 CNAME을 설정할 수 없다는 내용이다. (Supabase가 Cloudflare로 배포하고 있나보다..)
CF 입장에서 크게 두가지 측면에서 CNAME Record 설정을 막고 있다.

문제 해결 방안은 크게 2가지가 있는데 Supabase 유료 플랜 사용과 CloudFlare Workers를 활용하는 것이다. 두가지 각 각 장단점이 있지만 최종적으로 CloudFlare Workers를 선택했다.
각 각에 대해 한 번 알아보고 어떤 이유로 CloudFlare Workers를 선택했는지 알아보자.

Supabase 유료 플랜은 Custom Domain에 대한 기능을 제공하지만 달달이 돈을 내야한다. 이거 하나면 해결이 된다!
CloudFlare Workers를 선택하면서 이후 프로세스에 대해 자세히는 모르겠지만, 아마도 CF를 사용하는 대표적인 Sass인 Vercel과 같이 Cloudflare for SaaS를 통해 Custom Domain에 대한 승인을 통해 1014를 해결해 줄 것으로 예상된다.
정리하자면 장점은 간단하다는 것이고 단점은 유료라는 것이다.
다음으로 Worker를 활용하는 방식은 CF에서 DNS 설정이 된 Web Server(Vercel)와 Supabase 간에 Proxy를 하나 두는 것이다.

그림과 같이 보안 처리, 요청 가공, 캐싱 등 중간에 필요한 정보들을 Worker에서 처리하는 방법이다. 이 방법에도 장/단점이 존재한다.
장점
단점
각 각의 장단점을 비교 했을 때 핵심은 비용 vs 복잡도로 좁힐 수 있다.
프로젝트의 MVP 관점에서 바라봤을 때 비용 최소화가 가장 중요하게 다가왔다. 복잡도도 간단하면 좋겠지만, 복잡도를 낮추는 것은 MVP 관점이 아닌 유지보수 관점에서 바라봐야 한다고 생각했기 때문에 Worker를 선택했다.

Worker에 대한 설정 방법은 사진에서 보이는 것과 같이 Worker Page에서 Create application -> Start with Hello World를 통해 index.js를 직접 작성할 수 있다.
export default {
async fetch(request, env) {
const SUPABASE_URL = 'https://project-id.supabase.co';
const SUPABASE_KEY = 'supabase-anon-key';
const targetUrl = `${SUPABASE_URL}/rest/v1/store?select=*`;
try {
const response = await fetch(targetUrl, {
method: 'GET',
headers: {
'apikey': SUPABASE_KEY,
'Authorization': `Bearer ${SUPABASE_KEY}`,
'Content-Type': 'application/json',
},
});
const data = await response.json();
return new Response(JSON.stringify(data, null, 2), {
headers: {
'content-type': 'application/json;charset=UTF-8',
'Access-Control-Allow-Origin': 'https://ondoguide.com',
},
});
} catch (error) {
return new Response(JSON.stringify({ error: error.message }), {
status: 500,
headers: { 'content-type': 'application/json' }
});
}
},
};
코드까지 모두 작성을 마치면 Custom Domain 설정만 하면 CF에서 알아서 DNS 설정까지 마무리해준다.

배포된 Worker를 선택해서 Settings -> Domains & Routes -> Add -> Custom Domain에서 구매한 도메인 TLD를 작성하면 된다.
Serverless 기반 프로젝트를 경험하며 CloudFlare의 정책에 대해 일부 알게돼서 의미있었다. 이 정책이 어떤 이유로 생겼을지도 고민해보고, 이 정책으로 발생한 문제점을 해결할 방법들을 고민하면서 인프라 지식이 한단계 더 레벨업 할 수 있었던 것 같다.
결국 인프라의 제약 사항을 이해하는 것은 단순히 에러를 고치는 과정을 넘어, 서비스의 확장성과 비용 효율성을 동시에 고려하는 설계 능력을 기르는 과정임을 다시 한번 느끼게 됐다.