Dung (Donny) Nguyen

Senior Software Engineer

Fast global uploads to Amazon S3 — High-level Design + Practical Recipe

Short version: route clients to the nearest AWS edge, presign and push multipart uploads directly to S3 (or to a regional S3 endpoint behind a Multi-Region Access Point), and enable S3 Transfer Acceleration (or use Multi-Region Access Points + regional buckets) for global coverage. Add client-side multipart + parallelism, resumable retries, and instrumenting/monitoring. Below I give concrete architecture options (cheap → best global performance), the recommended flow, implementation tips, and trade-offs.


Key AWS building blocks (why you might use each)


Option A — Simple, low effort, global: S3 + Transfer Acceleration + presigned multipart

When you want the easiest global speed wins:

  1. Enable S3 Transfer Acceleration on the target bucket.
  2. On your backend (Lambda/EC2/API Gateway), create multipart upload and generate presigned URLs for each part (server signs PutObject/multipart parts).
  3. Client uploads parts in parallel to the accelerated endpoint (<bucket>.s3-accelerate.amazonaws.com) using the presigned URLs.
  4. Backend completes the multipart upload.

Why: minimal infra change, leverages AWS edge locations to speed long-distance uploads. Works well for mobile/web clients. (AWS Documentation)

Option B — High-scale, multi-region: Multi-Region Access Points + regional buckets + presigned multipart

When you need lowest possible latency worldwide, geo-redundancy, and fast failover:

  1. Maintain replicated buckets (e.g., Cross-Region Replication or S3 Replicate) in 2+ Regions.
  2. Create an S3 Multi-Region Access Point that covers those buckets.
  3. Use the MRAP global endpoint for uploads; MRAP will route requests to the optimal region (and can fail over). Use presigned multipart URLs that target the MRAP endpoint or per-region endpoint as appropriate. Why: better locality (requests served to nearest region), built-in routing/failover for outages. (AWS Documentation)

Option C — Custom edge ingestion: CloudFront (configured for PUT/POST) → Regional API → presigned URLs or proxy

Use when you must inspect/authorize uploads at the edge or use WAF:


Concrete client → server flow (best practice)

  1. Client wants to upload file (small or large).
  2. Client calls your backend auth endpoint (fast, lightweight) and sends metadata (size, filename, region preference if any).
  3. Backend CreateMultipartUpload (or PutObject for small files) and generate presigned URLs for each part or for a single upload. (Use server SDK to create signed URLs with appropriate TTL and permissions.) (DEV Community)
  4. Client uploads parts in parallel directly to the accelerated / MRAP endpoint using those presigned URLs (HTTP PUT). For each part capture ETag.

    • Use chunk sizes ≥5 MB (S3 multipart minimum), tune part size depending on average file size and network.
    • Use parallelism (e.g., 4–16 concurrent part uploads per client) and retry with exponential backoff for failed parts.
  5. After all parts uploaded, client notifies backend to CompleteMultipartUpload with the parts list (ETags).
  6. Backend optionally validates checksum, tags, etc., and finalizes.

Client-side tips for speed and reliability


Security & cost considerations


Observability and testing


Which option should you pick?


Quick checklist to implement now

  1. Decide single-region vs multi-region (cost vs latency).
  2. If single region, enable S3 Transfer Acceleration on the bucket. (AWS Documentation)
  3. Implement server endpoint to start multipart upload and generate presigned URLs. (DEV Community)
  4. Build client upload logic: parallel uploads, chunking, retries, resumability.
  5. Add monitoring (CloudWatch metrics, S3 logs), and run speed tests from target geos to validate.