Cloudflare Workers — 서버리스
서버리스(Serverless)는 요즘 꽤 흔한 단어가 된것 같다. AWS Lambda로 부터 시작해서 Azure, GCP등 다양한 클라우드 제공자들이 모두 비슷한 기능을 제공하고 있다. 클라우드플레어도 Workers라는 Serverless를 서비스 하고 있다.
Cloudflare Workers는 다른 Serverless 서비스와는 다르게 여러가지 장점이 있고, 실제로 사용해보니 독특한 매력이 있어 소개해보려고 한다.
엣지 컴퓨팅(Edge computing) = 빠른 응답 속도
클라우드플레어는 CDN(Content Delivery Network) 사업자라고 볼 수 있는데, 전세계 100개 이상 국가, 200개의 도시에 엣지(Edge)서버를 보유하고 있다. Workers를 사용하여 배포하게 되면 전세계 엣지서버에 동시에 배포가 되며, 접속하는 유저의 가장 가까운 엣지 서버에서 실행이 된다.
반면 AWS Lambda로 배포시 한국에서 미국 리젼으로 접속하면 최소 100ms~200ms정도의 기본 Latency가 발생하는데, Workers를 사용하여 배포하여 한국 엣지 서버를 쓰는 경우 ~10ms 정도 Latency밖에 들지 않는다.🚀
글로벌 서비스를 하고 있다면 전세계 어디서든 낮은 Latency로 서비스를 제공할수 있다는게 큰 장점이다.
참고로, AWS에도 Lambda@edge라는 이름으로 Cloudfront CDN 엣지에서 Lambda를 실행하는 서비스도 있다.
한국 엣지 서버는 엔터프라이즈 사용자에게만 제공되기 때문에 예시로 써둔 ~10ms 이하 Latency는 볼수 없다.😭
Cold Start
Serverless는 서버가 꺼져 있다가 누군가 접속하면 그 즉시 서버가 켜진다. 하지만, Lambda에 배포한 경우 서버 크기/종류마다 다르겠지만 약 1초 정도의 딜레이가 발생한다. 이 딜레이를 없애기 위해서는 Provisioned Concurrency 기능을 사용하여 미리 몇대를 켜둘지 정할 수 있다. 그런데 미리 켜둔다면 이게 Serverless라고 불러도 되는건가? 라는 생각이 든다.
클라우드플레어 Workers는 Cold Start가 발생하지 않는다.
그 이유는 AWS Lambda 처럼 별도의 실행환경을 만드는것이 아니라, V8엔진에 포함된 Isolates라는 기능을 통해 실행하기 때문에 빠르게 실행이 가능하기 때문이다.
AWS Lambda의 경우 트래픽이 갑자기 크게 늘어나는 경우 에러나 날수 있지만, Cloudflare Workers는 큰무리 없이 Scale가능하다.
이걸로 뭘 할수 있을까?
Worker에서 할수 있는것들을 나열해보면 다른 서버리스에서 하던걸 거의 다 할 수 있다.
- Static 웹사이트 호스팅
- A/B 테스팅
- 여러 API 취합하는 API만들기
- 복잡한 로직의 Redirect
- QR코드, 바코드 생성
- …
기본적으로 fetch 함수를 통해 외부에 API를 실행할 수 있다. 예를들면 S3에 파일을 올리거나, DynamoDB에 데이터를 쓰고 읽어올 수 있다.
Gatsby.js 와 같은 Static 웹사이트를 만들어서 올릴 수 있다. 대신 이 기능을 쓰려면 월 $5 내고 Unlimited Plan을 이용해야 한다. (내부적으로 KV기능을 사용하기 때문)
WebAssembly를 실행 할 수 있다. 그래서 이미지 라이브러리(예를들어 libvips)를 넣어서 이미지 최적화용으로도 사용할수 있다.
유료 결제를 하면 Key-Value(KV) 데이터 저장 공간이 제공되는데, 다양한 용도로 사용할 수 있다.
이것 말고도 다양한 사용사례는 아래 링크에서 확인 할 수 있다.
장점 말고 단점은?
세상 모든게 그렇듯 장점만 있진 않다.
지원하는 언어는 JS 또는 JS로 컴파일 가능한 언어만 사용 가능하다. V8엔진의 Isolates를 이용하기 때문에 어쩔수 없는 제약이지만, Golang, Java와 같은 다른 언어로 작성하고 싶어도 할 수 없다. (물론 WebAssembly로 컴파일 가능한 언어라면 가능하지만, Native지원이 아니라 번거롭다.)
자유롭게 외부 라이브러리를 쓸수 없다. Node.js의 모든 API를 제공하는게 아니기 때문에 유명한 Express와 같은 서버를 사용할 수 없다. aws sdk도 그대로 쓸수 없어, workers 전용 라이브러리가 있다.
Request당 최대 50ms 의 CPU 시간이 제공되는데, 이미지 최적화와 같은 계산량이 소요되는 기능을 만들어 올릴 수 없다.(Workers Unbound로 해결될 예정)
Static 리소스(이미지, 폰트, 동영상..)는 최대 10MB까지만 된다. KV의 크기 제한이 10MB이기 때문이다.
KV에 데이터를 넣고 나서 delay가 발생한다. Key를 추가하고, Key목록을 가져오면 몇초뒤에 반영된다.
로그를 확인하기 어렵다. 에러 로그를 제대로 보려면 sentry, papertrail과 같은 외부 서비스를 붙여야 한다.
그래도 점점 좋아지는 중..
Workers가 처음 나왔을때부터 보고 있는데, 지금까지 꽤 많이 좋아졌고 계속 발전 중 이다.
Workers Unbound라는걸 오픈할거라는 블로그가 떳는데, 50ms 의 CPU시간 제약이 없어진다. 이렇게 되면 AWS Lambda와 직접적으로 경쟁하게 되는데 비용적인 측면, Latency측면 등 따져 봤을때 왠만해선 Workers를 선택하게 될것 같다.
참고로 AWS Lambda, API Gateway를 함께 사용하게 되면 생각보다 비용이 많이 나온다. Cloudflare는 트래픽 비용이 없기 때문에 엄청난 비용절감을 할 수 있을것으로 생각된다.
마무리
AWS Lambda와 같은 다른 서버리스 서비스에 비해 단점도 존재하지만, 여러가지 장점이 존재한다. 개인적으로 한번 배포로 전세계 어디서든 빠르게 실행가능한 서버를 운영할수 있다는게 매력적이라고 생각한다. 추후에 Workers Unbound가 정식 출시되면 AWS Lambda대신 옮겨탈수 있는 서버가 많을것 같아 기대 된다.