Mielőtt egyetlen szolgáltatást is megnéznénk részletesen, átállítjuk a gondolkodást: mi változik, amikor a régió-alapú AWS-világból az edge-first Cloudflare-világba lépsz át.
Az AWS-en az alkalmazásod egy helyen él: kiválasztasz egy régiót (mondjuk eu-central-1), ott futnak az EC2-instance-ok a Beanstalk mögött, ott van az Aurora, és a világ többi részét a CloudFront CDN-nel „hozod közelebb". A skálázás azt jelenti, hogy több és nagyobb gépet kérsz ugyanoda.
A Cloudflare-en ez a kérdés fel sem merül. A kódod egyszerre fut a hálózat több száz városának mindegyikében — deploykor nem választasz régiót, mert nincs mit választani. A felhasználó kérése a hozzá legközelebbi adatközpontba (PoP — point of presence) érkezik, és jellemzően ott is szolgálják ki. A CDN nem egy külön termék az alkalmazásod előtt, hanem maga a platform, amiben az alkalmazásod fut.
A Cloudflare compute-egysége a Worker: egy JavaScript/TypeScript (vagy Python, Rust) modul, ami HTTP-kérésekre, üzenetekre, cron-eseményekre reagál. A döntő különbség a futtatási modellben van: a Worker nem konténerben és nem Node-processzben fut, hanem V8 isolate-ben — ugyanabban a könnyűsúlyú homokozóban, amit a Chrome egy-egy böngészőfülhöz használ.
Egy gépen több ezer isolate él egymás mellett egyetlen processzben. Egy új isolate elindítása ezredmásodpercek kérdése — ezért nincs a Lambdánál megszokott cold start probléma, és ezért lehet a kódod egyszerre „mindenhol". Az ára ennek az, hogy a runtime nem Node.js: a webes standard API-kat kapod (fetch, Request/Response, URL, Web Crypto, streams), plusz egy egyre teljesebb Node-kompatibilitási réteget (nodejs_compat).
| Node app Beanstalkon | Cloudflare Worker | |
|---|---|---|
| Futtatási egység | hosszú életű Node-processz EC2-n | V8 isolate, kérésenként példányosulhat |
| Indulási idő | másodpercek (deploy percek) | ~5 ms alatt |
| Hol fut | a választott régióban | minden PoP-ban, a felhasználóhoz közel |
| Skálázás | autoscaling group, kapacitástervezés | automatikus, láthatatlan, nincs beállítás |
| Állapot a memóriában | megszokott (cache, session, singleton) | nem megbízható — az isolate bármikor eldobható |
| Számlázás | instance-óra (akkor is, ha nincs forgalom) | kérésszám + ténylegesen használt CPU-ms |
| Fájlrendszer | van (lokális diszk) | nincs — állapot a kapcsolt szolgáltatásokban |
AWS-en egy szolgáltatás használata így néz ki: IAM role/policy → SDK-kliens példányosítása → régió és credentialök → hálózati hívás. A Cloudflare-en ehelyett binding-okat deklarálsz a konfigurációban: a Worker env objektumán egyszerűen megjelenik a kapcsolt erőforrás, natív JavaScript API-val, hitelesítés és endpoint-konfiguráció nélkül.
// IAM policy + credentials szükséges
import { S3Client, PutObjectCommand }
from "@aws-sdk/client-s3";
const s3 = new S3Client({ region: "eu-central-1" });
await s3.send(new PutObjectCommand({
Bucket: "my-bucket",
Key: "avatar.png",
Body: data,
}));
// nincs SDK, nincs credential, nincs régió —
// a binding a konfigban van deklarálva
export default {
async fetch(request, env) {
await env.MY_BUCKET.put("avatar.png",
request.body);
return new Response("OK");
},
};
A jogosultság magából a bindingból következik: ha a Worker konfigjában ott a bucket, használhatja; ha nincs, nem is látja. Ez az IAM-nél durvább szemcséjű, de radikálisan egyszerűbb modell — a 9. modulban nézzük meg, mit jelent ez biztonsági szemmel.
| Cloudflare | Mi ez? | AWS-megfelelő |
|---|---|---|
| Workers | szerver nélküli compute az edge-en; ez az app „szervere" | Lambda + részben EC2/Beanstalk |
| Static Assets | statikus fájlok a Workerrel egy deploy-egységben, beépített CDN-nel | S3 + CloudFront |
| Hyperdrive | connection pooling + cache a meglévő Postgres/MySQL elé | RDS Proxy |
| D1 | SQLite-alapú, natív SQL-adatbázis | Aurora/RDS (kis-közepes méretig) |
| R2 | objektumtár S3-kompatibilis API-val, nulla egress díjjal | S3 |
| KV | globálisan replikált, eventually consistent kulcs-érték tár | ElastiCache / DynamoDB (részben) |
| Queues | üzenetsor batching-gel, retry-jal, DLQ-val | SQS |
| Workflows | tartós, több lépéses, újraindítható folyamatok kódban | Step Functions |
| Durable Objects | erősen konzisztens, címezhető állapot + WebSocket-koordináció | nincs igazi párja (≈ DynamoDB + Lambda + ELB kombó) |
| Cron Triggers | ütemezett Worker-futtatás | EventBridge Scheduler |
| Workers Builds | Git-integrált CI/CD, PR-enkénti preview URL-ekkel | CodePipeline / CodeBuild |
| Containers | igazi konténerek Worker-vezérléssel — ha tényleg Node/bináris kell | Fargate |
| Workers AI / Vectorize | modell-inference és vektor-adatbázis az edge-en | Bedrock / OpenSearch |
A platform CLI-je a Wrangler (a terraform + eb + sam szerepét tölti be egyszerre, de egyetlen eszközként). Projektet a create-cloudflare generátorral érdemes indítani:
# új projekt interaktív varázslóval
npm create cloudflare@latest -- my-first-worker
# lokális fejlesztői szerver (http://localhost:8787)
npx wrangler dev
# deploy a Cloudflare hálózatra — ennyi, nincs több lépés
npx wrangler deploy
A projekt szíve két fájl. A konfiguráció (wrangler.jsonc) — ez tölti be azt a szerepet, amit AWS-en a Beanstalk-konfig, a CloudFormation-sablon és az IAM-policyk együtt:
{
"name": "my-first-worker",
"main": "src/index.ts",
"compatibility_date": "2026-08-02", // a runtime viselkedésének „verziója"
"compatibility_flags": ["nodejs_compat"], // Node API-k engedélyezése
// bindings — így „kapja meg" a Worker a szolgáltatásokat:
"r2_buckets": [{ "binding": "MY_BUCKET", "bucket_name": "uploads" }],
"vars": { "APP_ENV": "production" }
}
És maga a Worker — egy modul, ami exportál egy fetch handlert (gondolj rá úgy, mint az Express app helyére, csak webstandard Request/Response objektumokkal):
export default {
async fetch(request, env, ctx): Promise<Response> {
const url = new URL(request.url);
if (url.pathname === "/api/hello") {
return Response.json({
message: "Hello from the edge!",
servedFrom: request.cf?.colo, // pl. "BUD" — a budapesti PoP
env: env.APP_ENV,
});
}
return new Response("Not found", { status: 404 });
},
};
A wrangler deploy után a Worker azonnal él egy *.workers.dev címen (később saját domaint kötsz rá). Nincs AMI, nincs instance-típus, nincs security group, nincs ALB target group — és nincs várakozás: a deploy másodpercek alatt globális.
Cserébe új kérdéseket kell megtanulnod feltenni: belefér-e a CPU-limitbe? edge-kompatibilis-e ez az npm-csomag? hova kerül az állapot, ha nincs processz-memória? — pontosan ezekről szól a következő modul.
A kód minden PoP-ban ott van, a kérés a legközelebbiben fut le — a CDN és a compute egy réteg. Nem kell külön CDN-t konfigurálni az egy régióban futó app elé, és a latencia a világ minden pontján alacsony, nem csak a régió közelében.
A Node-processz hosszú életű, a memóriájában tartott állapot (cache, poolok) megbízhatóan megmarad. Az isolate bármikor eldobható és sok példányban fut párhuzamosan világszerte — memóriában tartott állapotra nem lehet építeni; az állapot KV/D1/R2/Durable Objects-be való.
Az IAM policy + SDK-kliens + credential/endpoint konfiguráció hármasát: a konfigban deklarált erőforrás natív API-ként jelenik meg az env-en, és a jogosultság magából a binding létéből következik.
Workers + Static Assets — a Pages funkcionálisan befagyott, az új képességek (bindings teljes köre, gradual deployments, observability) a Workers-be érkeznek, és a hivatalos ajánlás is ez.
Kérésszám + ténylegesen elhasznált CPU-idő (ms). Az EC2-nél lefoglalt kapacitásért fizetsz az idő múlása szerint, forgalomtól függetlenül; itt csak a tényleges munkáért.