Ga naar inhoud
HexaTransfer
Terug naar blog
Technische verdiepingen

S3-compatibele opslagarchitectuur voor bestandsoverdracht

Bouw bestandsoverdrachtsystemen op S3-compatibele opslag. Architectuurpatronen, providervergelijking en technieken voor prestatieoptimalisatie.

S3-compatibele opslag is de ruggengraat van de meeste moderne bestandsoverdrachtsservices, omdat de API universeel is, de prijsstelling concurrerend en de architectuur schaalt zonder schijven te beheren. AWS S3 is de pioneer van dit model; klonen zoals Cloudflare R2, Backblaze B2, Wasabi, MinIO en DigitalOcean Spaces implementeren dezelfde REST-interface. Bouwen op S3-compatibele opslag geeft je duurzame objectopslag — 11 negens in het geval van AWS — multipart-uploads voor grote bestanden en presigned URLs voor directe browser-naar-opslag-overdrachten die je appservers omzeilen. De AVG vereist dat persoonsgegevens worden opgeslagen met passende technische maatregelen; de architecturale keuzes die je maakt in je S3-integratie bepalen of je aan die vereiste kunt voldoen. Hier lees je hoe je het correct opzet.

Waarom de S3-API gewonnen heeft

De S3-API is effectief een standaard geworden. Amazon publiceerde hem in 2006, en elke grote objectopslagprovider implementeerde hem om workloads aan te trekken. Dat betekent dat een goed geschreven overdrachtsservice die gebruikmaakt van de AWS SDK voor JavaScript (aws-sdk v3) tussen providers kan wisselen door simpelweg de endpoint-URL te wijzigen. Open-source clients zoals minio-js, MinIO's mc CLI en rclone werken ongewijzigd bij alle providers. Dit geeft architecten flexibiliteit: begin op AWS S3 voor betrouwbaarheid, schakel over naar Cloudflare R2 voor nul egress-kosten, of run MinIO zelf voor gegevenslocatie — zonder applicatiecode te herschrijven.

Providervergelijking voor overdrachtsworkloads

| Provider | Opslag | Egress | Gratis tier | Bijzonderheid | |---|---|---|---|---| | AWS S3 Standard | $0,023/GB | $0,09/GB | 5 GB, 15 GB egress/mnd | 11 negens duurzaamheid | | Cloudflare R2 | $0,015/GB | $0 | 10 GB, 1M leesbewerkingen/mnd | Nul egress-kosten | | Backblaze B2 | $0,006/GB | $0,01/GB | 10 GB gratis | Bandwidth Alliance met Cloudflare | | Wasabi | $0,0069/GB | $0 | Geen (alleen betaald) | Minimale opslag 90 dagen | | MinIO zelf gehost | Hardwarekosten | Eigen bandbreedte | Open source | AGPL v3, draait overal | | DigitalOcean Spaces | $5/mnd voor 250 GB | 1 TB inbegrepen | Geen | Vaste prijsbundel |

Voor een overdrachtsservice waarbij bestanden kort worden opgeslagen en daarna worden gedownload, domineert egress. Cloudflare R2 en Backblaze B2 (via Bandwidth Alliance) winnen op kosten. AWS S3 wint op functies zoals Intelligent-Tiering en lifecycle-beleid.

Multipart-upload voor grote bestanden

De S3 multipart-upload-API is de manier waarop overdrachtsservices bestanden boven 5 GB afhandelen. Je stuurt InitiateMultipartUpload om een UploadId te krijgen, UploadPart voor elk onderdeel (minimaal 5 MB, maximaal 5 GB per onderdeel, 10.000 onderdelen totaal) en CompleteMultipartUpload met de lijst van ETags. Onderdelen kunnen parallel worden geüpload. Mislukte onderdelen herhalen onafhankelijk. Clients gebruiken presigned URLs voor elk onderdeel, zodat uploads rechtstreeks van de browser naar S3 gaan en je appserver de bytes niet aanraakt. De maximale objectgrootte is 5 TB in S3, wat vrijwel elk overdrachtsgeval dekt.

Presigned URLs en directe uploads

Presigned URLs laten een client rechtstreeks uploaden naar of downloaden van S3 zonder dat je servers de bytes aanraken. Je backend genereert een URL ondertekend met HMAC-SHA256 en AWS-referenties, geldig voor een bepaalde tijd — doorgaans 1 tot 24 uur. De client voert PUT of GET uit tegen de URL. Dit patroon bespaart fors: je appservers hebben de bandbreedte niet nodig om bestanden van 10 GB te proxyen, en de latentie daalt omdat clients de opslagendpoint rechtstreeks bereiken. CORS-configuratie op de bucket staat browser-uploads van jouw origin toe. Gebruik SSE-C (server-side versleuteling met door de klant verstrekte sleutels) of SSE-KMS voor versleuteling in rust.

Architectuurpatronen voor overdrachtsservices

Een typische S3-gebaseerde overdrachtsarchitectuur heeft drie lagen. De frontend draait in een browser, initieert multipart-uploads en houdt chunk-voortgang bij. De API-backend — een kleine Node.js, Go of Python-service — verzorgt authenticatie, metadata-opslag in PostgreSQL of DynamoDB en het genereren van presigned URLs. De opslaglaag is de S3-compatibele bucket. Deze architectuur schaalt horizontaal omdat de applagen stateless zijn en de opslaglaag alle bandbreedte absorbeert. Een CDN zoals Cloudflare of CloudFront toevoegen voor GET-verzoeken verbetert downloadsnelheden wereldwijd en vermindert egress van S3.

Lifecycle-beleid en automatische verwijdering

Overdrachtsservices moeten bestanden automatisch laten verlopen. S3 Lifecycle-regels verplaatsen objecten tussen opslagklassen of verwijderen ze op basis van leeftijd. Een regel "verwijder objecten ouder dan 7 dagen" draait dagelijks en verwijdert verlopen overdrachten kosteloos. Cloudflare R2 ondersteunt lifecycle-regels via de Terraform-provider of R2 API. Voor fijnere controle: tag elk object met een verlooptijdstempel en run een nachtelijke Lambda die verwijdert op basis van tags. Verlaten multipart-uploads moeten hun eigen regel hebben — AbortIncompleteMultipartUpload na 1 tot 7 dagen recupereert opslag van onvolledige sessies.

Prestatieoptimalisatie

S3-doorvoer schaalt met het prefix. AWS S3 richt zich op 3.500 PUT/sec en 5.500 GET/sec per prefix in de bucket. Vermijd opeenvolgende sleutelprefixen (001, 002, 003) omdat ze naar dezelfde partitie hashen en hotspots creëren; gebruik willekeurige prefixen of hash-gebaseerde sleutels zoals de eerste 8 tekens van een UUID. Multipart-uploads verbeteren doorvoer voor individuele overdrachten; parallelle verbindingen over sleutels verbeteren de geaggregeerde doorvoer. Transfer Acceleration stuurt uploads via de dichtstbijzijnde CloudFront-edge en kan uploadtijd voor verre clients met 50 tot 500 procent verkorten, zij het met extra kosten.

Versleutelingsopties en hun afwegingen

Server-side versleuteling bestaat in drie varianten. SSE-S3 (of R2's standaardversleuteling) gebruikt AES-256 met door de provider beheerde sleutels, transparant en gratis. SSE-KMS gebruikt door AWS KMS beheerde sleutels, kost $0,03 per 10.000 verzoeken plus sleutelkosten en produceert KMS-auditlogs nuttig voor naleving. SSE-C accepteert een door de klant verstrekte sleutel per verzoek — de server versleutelt ermee en verwijdert de sleutel, zodat de klant hem bij elke lezing moet aanleveren, wat omslachtig is maar sleutels buiten de controle van de provider houdt. Voor echte E2EE: versleutel client-side vóór upload met libsodium of de AES-GCM van de Web Crypto-API, en behandel het opgeslagen object daarna als ondoorzichtige versleutelde data.

Monitoring, meetwaarden en verrassingen op de rekening

Volg bucket-meetwaarden in CloudWatch (AWS), het R2-dashboard of equivalente hulpmiddelen van de provider. Belangrijke meetwaarden: BucketSizeBytes, NumberOfObjects, AllRequests, 4xxErrors, 5xxErrors en BytesDownloaded. Onverwachte egress-pieken wijzen vaak op hotlinking — iemand embedde je presigned URL op een populaire site — of een bot die in een lus downloadt. Stel factuurwaarschuwingen in op 50, 80 en 100 procent van het budget. Cloudflare R2 factureert anders: Klasse A-bewerkingen (schrijven) voor $4,50 per miljoen, Klasse B (lezen) voor $0,36 per miljoen, plus opslag.

Integratievoorbeeld en de aanpak van HexaTransfer

Een minimale overdrachtsflow: de client vraagt een uploadtoken aan, de backend genereert een presigned URL voor het initiëren van een multipart-upload, de client uploadt chunks rechtstreeks naar S3, de backend slaat metadata op en geeft een deelbare link terug, de ontvanger klikt op de link, de backend genereert een presigned download-URL en de browser haalt op en ontsleutelt. HexaTransfer gebruikt dit patroon met client-side AES-256-GCM-versleuteling, zodat de S3-compatibele backend uitsluitend versleutelde data opslaat en de versleutelingssleutel de browser nooit verlaat.

Probeer het op https://hexatransfer.com — gratis, geen account, maximaal 10 GB.

Verstuur grote bestanden veilig met end-to-end-versleuteling

Draag bestanden tot 10 GB gratis over met end-to-end-versleuteling. Geen account nodig. Uw bestanden worden in uw browser versleuteld voordat ze worden geüpload — niemand anders kan ze lezen.

Een bestand verzenden