effidevFlutter · Cloudflare-Edge · Cloud-Kostenoptimierung
Deutsch

AWS S3 zu Cloudflare R2 Migration: 99% Egress-Kosten sparen

AWS S3 zu Cloudflare R2 Migration zur Reduzierung von Egress-Kosten

Für Unternehmen, die große Mediendateien, Videostreams und umfangreiche KI-Datensätze in der Cloud speichern und bereitstellen, ist die AWS S3-Rechnung jeden Monat ein Schreckensgespenst. Das liegt daran, dass nicht die reinen Speichergebühren, sondern die beim Herunterladen von Dateien oder Übertragen von Daten an CDNs oder externe Server entstehenden Egress-Kosten (Data Transfer Out, 0,09 $ pro GB) 70 bis 90 % der gesamten Cloud-Kosten ausmachen.

Der Objekt-Speicher Cloudflare R2 von Cloudflare hat die Spielregeln im Markt komplett verändert. R2 bietet 100 % kostenlose Egress-Gebühren (Bandbreitenübertragung) (0 $/GB), und auch die Speichergebühren sind im Vergleich zu S3 Standard etwa 35 % günstiger (0,015 $/GB-Monat).

Darüber hinaus ist R2 zu 100 % mit der bestehenden S3-API kompatibel, sodass ein Austausch ohne Code-Änderungen allein durch die Anpassung der Endpoint-URL sofort möglich ist. Zudem ist eine Lazy Migration (Super Slurp)-Pipeline integriert, mit der Daten im Terabyte (TB)-Bereich ohne Unterbrechung des Dienstes migriert werden können.

Dieser Artikel behandelt einen detaillierten Kostenvergleich zwischen S3 und R2, die Umstellung auf R2-Endpoints in AWS SDK-Umgebungen, eine unterbrechungsfreie Lazy-Migration-Architektur sowie eine globale Edge-Bild- und Medienoptimierungspipeline mit Cloudflare Workers + R2 anhand von praxisnahem Konfigurationscode.

Wichtigste Erkenntnisse

  • Egress-Kosten 0 $/GB: Egal wie viele Daten Sie in das Internet oder in externe Clouds übertragen, die Bandbreitengebühr beträgt 0 $. Dies ist die beste Wahl für Medien-Delivery und das Teilen von KI-Datensätzen.
  • 35 % geringere Speichergebühren: Im Vergleich zu S3 Standard mit 0,023 $/GB ist R2 mit 0,015 $/GB bereits bei den Basis-Speicherkosten günstiger.
  • 100 % S3-API-Kompatibilität: Verwenden Sie das AWS SDK (@aws-sdk/client-s3) unverändert weiter; nach Anpassung der endpoint-Einstellung auf die R2-Adresse funktioniert alles sofort.
  • Lazy Migration (Unterbrechungsfreie Migration): Ohne Ausfallzeiten können Sie Objekte automatisch beim Benutzeraufruf von S3 zu R2 synchronisieren und so die Migration in wenigen Sekunden starten.
  • Workers + R2 Edge-Binding: Die native Anbindung an Cloudflare Workers ermöglicht das sofortige Rendern und Transformieren von Speicherdaten am Edge mit 0 ms Netzwerk-Hop-Overhead.

1. AWS S3 vs. Cloudflare R2 Kostenvergleich: Reale Abrechnungssimulation

Dies ist das monatliche Simulationsergebnis für einen Medien-/KI-Dienst mit 100 TB Speichervolumen und 500 TB monatlichem Egress (Datenübertragung) Stand August 2026. Die Berechnung basiert auf der AWS S3 Preistabelle und der offiziellen Cloudflare R2 Dokumentation.

Kategorie AWS S3 Standard Cloudflare R2 Kostenunterschied
Speichergebühr (100TB) $2,300 ($0.023/GB) $1,500 ($0.015/GB) $800 Ersparnis (35%)
Egress-Übertragung (500TB) $44,910 ($0.089/GB) $0 ($0/GB) $44,910 Ersparnis (100%)
Klasse-A-Operationen (10 Mio. Schreibzugriffe) $50 ($5.00/1 Mio.) $45 ($4.50/1 Mio.) $5 Ersparnis
Klasse-B-Operationen (100 Mio. Lesezugriffe) $40 ($0.40/1 Mio.) $36 ($0.36/1 Mio.) $4 Ersparnis
Gesamte monatliche Cloud-Rechnung $47,300 $1,581 Monatlich $45,719 Ersparnis (96.6% Ersparnis!)

Je höher der Egress-Anteil eines Dienstes ist, desto näher liegt die Kostenersparnis bei 95%~99%. Dies ist der stärkste Grund für Unternehmen, die aufgrund von Egress-Kosten von einem AWS Vendor-Lock-in betroffen waren, zu R2 zu migrieren.

2. Null Code-Änderungen: R2-Endpoint im AWS SDK verbinden

Da R2 S3-kompatible APIs unterstützt, können Sie den bestehenden AWS SDK-Code für Node.js, Python oder Go einfach wiederverwenden.

// Vorher (AWS S3)
import { S3Client, GetObjectCommand } from '@aws-sdk/client-s3';

const s3Client = new S3Client({
  region: 'us-east-1',
  credentials: {
    accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
    secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
  },
});

// Nachher (Cloudflare R2) — Nur den Endpoint ersetzen, funktioniert zu 100%!
const r2Client = new S3Client({
  region: 'auto', // R2 ist eine globale Region, daher 'auto' angeben
  endpoint: `https://${process.env.CF_ACCOUNT_ID}.r2.cloudflarestorage.com`,
  credentials: {
    accessKeyId: process.env.R2_ACCESS_KEY_ID!,
    secretAccessKey: process.env.R2_SECRET_ACCESS_KEY!,
  },
});

Wichtiger Hinweis: R2 besitzt keine Einschränkungen auf spezifische AWS S3-Regionen (wie us-east-1). Stattdessen bietet es ein automatisches globales Routing zum nächstgelegenen Standort an über 300 Edge-Knoten von Cloudflare.

3. Unterbrechungsfreies “Lazy Migration”-Muster

Eine “Big Bang”-Migration, bei der Terabytes an S3-Daten auf einmal zu R2 verschoben werden, dauert lange und birgt das Risiko von Ausfallzeiten. Mit dem Lazy Migration-Muster befüllen Sie R2 in Echtzeit bei eingehenden Anfragen, ganz ohne Dienstunterbrechungen.

[Client-Anfrage] ──► [Cloudflare Workers]

                           ├─► 1. R2-Objekt abfragen (Cache Hit) ──► Datei sofort zurückgeben

                           └─► 2. Bei Fehlschlag (Cache Miss) 

                                     ├─► Datei von S3-Origin herunterladen
                                     ├─► In R2-Bucket speichern (asynchrone Synchronisation)
                                     └─► Datei an Client zurückgeben

Lazy Migration Workers Praxis-Code

export interface Env {
  MY_R2_BUCKET: R2Bucket;
  S3_ORIGIN_URL: string;
}

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const url = new URL(request.url);
    const key = url.pathname.slice(1);

    // 1. Datei im R2-Bucket abfragen
    let object = await env.MY_R2_BUCKET.get(key);

    if (object === null) {
      // 2. Wenn Datei nicht in R2 vorhanden ist, vom S3-Origin abrufen (Lazy Fetch)
      const s3Response = await fetch(`${env.S3_ORIGIN_URL}/${key}`);
      if (!s3Response.ok) {
        return new Response('File Not Found', { status: 404 });
      }

      const bodyBuffer = await s3Response.arrayBuffer();

      // 3. Von S3 abgerufene Datei asynchron im Hintergrund im R2-Bucket speichern
      env.MY_R2_BUCKET.put(key, bodyBuffer, {
        httpMetadata: s3Response.headers,
      });

      // 4. Antwort sofort an den Client zurückgeben
      return new Response(bodyBuffer, {
        headers: s3Response.headers,
      });
    }

    // Bei R2-Hit sofort antworten (0 $ Egress-Gebühren)
    const headers = new Headers();
    object.writeHttpMetadata(headers);
    headers.set('etag', object.httpEtag);

    return new Response(object.body, { headers });
  },
};

Durch die Anwendung dieses Musters werden zuerst die aktiven Daten migriert, auf die Benutzer tatsächlich zugreifen. So sinken die S3-Egress-Kosten ab dem ersten Tag der Migration drastisch.

4. R2 + Cloudflare Image Resizing Dynamische Bild-Pipeline

Kombinieren Sie in R2 gespeicherte hochauflösende Originalbilder mit Cloudflare Workers, können Sie teure externe Dienste wie Next.js Image Optimization oder Cloudinary ersetzen. Dies ist eine praktische Anwendung, die im Cloudflare Images Kostenvergleichsleitfaden behandelt wurde.

// Echtzeit-WebP-Konvertierung und Resizing von R2-Bildern in Workers
export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const url = new URL(request.url);
    const width = parseInt(url.searchParams.get('w') || '800');
    const quality = parseInt(url.searchParams.get('q') || '80');
    const key = url.pathname.slice(1);

    // Cloudflare Image Resizing-Optionen mit R2-Objekt verbinden
    const options = {
      cf: {
        image: {
          width,
          quality,
          format: 'webp',
        },
      },
    };

    const imageObject = await env.MY_R2_BUCKET.get(key);
    if (!imageObject) return new Response('Not Found', { status: 404 });

    return new Response(imageObject.body, {
      headers: {
        'content-type': 'image/webp',
        'cache-control': 'public, max-age=31536000, immutable',
      },
    });
  },
};

In Kombination mit dem Leitfaden zur Egress-Kostenreduzierung bei der Migration von AWS Lambda zu Cloudflare Workers können Sie die Cloud-Kosten sowohl im Bereich Compute als auch Storage minimieren.

5. Hinweise und Best Practices bei der Verwendung von R2

Checkliste Beschreibung & Best Practices
Benutzerdefinierte Domain verbinden Das Verbinden einer benutzerdefinierten Domain mit dem R2-Bucket aktiviert automatisch Cloudflare CDN Caching, wodurch auch die Kosten für Klasse-B-Leseoperationen reduziert werden.
Vorsicht bei öffentlicher Bucket-Freigabe Öffentlicher Bucket-Zugriff kann zu unbefugten Downloads führen. Steuern Sie Berechtigungen daher über Workers-Bindings oder Signed URLs (signierte URLs).
Klasse-A- / Klasse-B-Operationen optimieren Obwohl der Egress bei R2 kostenlos ist, fallen geringe Gebühren für Lese-/Schreibzugriffe an. Setzen Sie CDN-Cache-Header (max-age=31536000), um Lesezugriffe zu minimieren.
Ersatz für S3 Object Lock Wenn Sie spezielle Compliance-Funktionen von S3 (wie Object Lock) benötigen, sollten Sie die rechtlichen und technischen Anforderungen im Voraus prüfen.

Häufig gestellte Fragen (FAQ)

Sind die Egress-Kosten bei R2 wirklich absolut kostenlos?

Ja, zu 100 % kostenlos. Selbst wenn Sie Daten im Terabyte- oder Petabyte-Bereich in das öffentliche Internet übertragen, berechnet Cloudflare keinerlei Bandbreitengebühren.

Gibt es ein Tool für die einmalige Massenmigration bestehender S3-Bucket-Daten?

Mit dem Tool R2 Super Slurp im Cloudflare-Dashboard können Sie nach Eingabe Ihrer S3-Zugangsdaten alle S3-Bucket-Objekte automatisch im Hintergrund nach R2 kopieren.

Ist die Rendering-Latenz bei R2 schneller als bei AWS S3?

Je nach Standort des Benutzers ist sie schneller. Während Daten bei AWS S3 fest in einer einzelnen Region (z. B. us-east-1) verankert sind und dadurch für internationale Benutzer höhere Latenzen entstehen, ist R2 mit dem globalen Edge-Netzwerk von Cloudflare an über 300 Standorten verbunden. Die Speicherung und das Rendering erfolgen dadurch am nächstgelegenen Edge-Knoten.

Kann R2 in Next.js / React-Projekten verwendet werden?

Ja, in allen Frameworks, die den AWS SDK S3 Connector nutzen können (Next.js, React, Remix, Astro, Express usw.), lässt sich R2 allein durch Ersetzen des endpoint sofort einsetzen.