Zusammenfassung der Datei-Upload-Limits für AWS S3 und CloudFront | Multipart und signierte URL
Beim Aufbau von Datei-Upload-Funktionen mit AWS ist es äußerst wichtig zu verstehen, dass S3, CloudFront, API Gateway und Lambda unterschiedliche Größenbeschränkungen haben und welche Schicht zum Engpass wird. Dieser Artikel organisiert die Limits jedes Services, erläutert die Verwendung von Multipart-Uploads und signierten URLs für große Dateien und bietet Implementierungsbeispiele in PHP.
Upload-Limit für Amazon S3
Beim Hochladen von Objekten zu S3 gibt es je nach Methode unterschiedliche Größenlimits.
| Upload-Methode | Maximale Größe | Anmerkungen |
|---|---|---|
| <code>PUT Object</code> (einzeln) | 5 GB | Upload-Limit pro 1 Anfrage |
| Multipart Upload | 5 TB | Maximale Größe von 1 Objekt |
| Pro 1 Teil | Mindestens 5 MB bis maximal 5 GB | Nur der letzte Teil darf kleiner als 5 MB sein |
| Anzahl der Teile | Maximal 10.000 Teile | Grenzwert bei Multipart |
AWS empfiehlt Multipart-Uploads für Dateien ab 100 MB und sollte aktiv für große Dateien verwendet werden, sowohl aus Gründen der Retransmissionseffizienz bei Netzwerkfehlern als auch der Durchsatzverbesserung durch parallele Übertragung.
Fälle, in denen Multipart-Upload erforderlich ist
Multipart-Upload ist eine Methode, die ein Objekt in mehrere Teile aufteilt, jeden in unabhängigen Anfragen sendet und sie am Ende kombiniert. Es ist in den folgenden Fällen wirksam.
- <strong>Dateien über 100 MB</strong>: Dies ist die von AWS empfohlene Umschaltlinie für Multipart.
- <strong>instabile Netzwerkumgebung</strong>:auch bei Fehlern können Sie nur fehlgeschlagene Teile erneut übertragen.
- <strong>Durchsatz maximieren</strong>:paralleles Hochladen mehrerer Teile verbessert die Transfergeschwindigkeit.
- <strong>Upload pausieren und fortsetzen</strong>:durch Speicherung der Upload ID können Sie sitzungsübergreifend fortsetzen.
Der Ablauf des Multipart-Uploads hat grundsätzlich 3 Schritte.
- <strong>Start</strong> (CreateMultipartUpload): Upload-ID abrufen
- <strong>Teil-Upload</strong> (UploadPart): Laden Sie jeden Teil hoch und zeichnen Sie das ETag auf
- <strong>Abgeschlossen</strong> (CompleteMultipartUpload): Eine Liste von Teilnummern und ETags senden, um das Objekt zu bestätigen
Wenn Sie abbrechen, ohne <code>AbortMultipartUpload</code> aufzurufen, werden unvollständige Teile weiterhin als Speichergebühr berechnet. Es wird dringend empfohlen, eine Lifecycle-Richtlinie für den S3-Bucket so zu konfigurieren, dass 「未完了のマルチパートアップロードを N 日後に削除」 wird.
Ablaufzeit und Größe der vorzeichneten URL
Mit vordefinierten URLs (Presigned URLs) können Clients ohne S3-Zugriffsberechtigung (wie Browser und mobile Apps) Dateien direkt zu S3 hochladen. Da kein Server als Vermittler fungiert, ist es auch bei großen Dateien effizient.
| Element | Einschränkungen und Spezifikationen |
|---|---|
| Maximale Gültigkeit (von IAM-Benutzer ausgestellt) | 7 Tage (604.800 Sekunden) |
| Maximale Gültigkeit (von IAM-Rolle ausgestellt) | Innerhalb der Sitzungsdauer der Rolle(maximal 12 Stunden) |
| Uploadfähige Dateigröße | Bei einzelnem PUT maximal 5 GB |
| Unterstützung für Multipart | Ausstellen einer einzelnen Presigned URL für jeden Teil |
Die vorzeichnete URL wird im Backend generiert und an den Client zurückgegeben. Der Client sendet dann eine PUT-Anfrage direkt an diese URL. Da die URL eine Signatur enthält, ist sie nur erfolgreich, wenn die richtige Datei innerhalb der Gültigkeitsfrist hochgeladen wird.
CloudFront Body-Größenlimit
Beim Weiterleiten von Anfragen über CloudFront zu einem Origin (wie S3 oder EC2) gibt es eine Grenze für die Größe des Anfragebody.
| Einstellung | Standardwert | Maximalwert |
|---|---|---|
| Request-Body-Größe (Standard) | 1 MB | Kann in der Verteilungskonfiguration geändert werden |
| Bei Verwendung von Lambda@Edge | 1 MB | 1 MB (nicht änderbar) |
| Im Fall von CloudFront Functions | — | Zugriff auf Request-Body nicht verfügbar |
In den CloudFront-Verteilungseinstellungen können Sie 「Allow requests with body」 aktivieren und das Limit erhöhen. Beachten Sie jedoch, dass das 1-MB-Limit in Lambda@Edge nicht geändert werden kann. Für das Hochladen großer Dateien empfehlen wir, eine Architektur zu verwenden, die direkte Uploads von S3 vom Client unter Verwendung einer Presigned URL ermöglicht, ohne CloudFront zu durchlaufen.
API Gateway Payload-Limit
Das API Gateway (sowohl REST API als auch HTTP API) hat eine maximale Nutzlastgröße.
| API-Typ | Maximale Payload-Größe | Anmerkungen |
|---|---|---|
| REST API | 10 MB | Gleiches gilt, wenn Binärunterstützung aktiviert ist |
| HTTP API | 10 MB | — |
| WebSocket API | 128 KB (Nachricht) / 32 KB (Frame) | — |
Das 10-MB-Limit des API Gateway ist als AWS-Servicekontingent klassifiziert und kann nicht erhöht werden. Das Hochladen von Dateien über 10 MB über API Gateway sollte als Designfehler betrachtet werden. Erwägen Sie stattdessen die Migration zum Presigned-URL-Muster.
Dateibeschränkungen über Lambda
Beim Empfang von Dateien in einer Lambda-Funktion gibt es einen Grenzwert für die vom API Gateway übergebene Event-Payload. Darüber hinaus hat Lambda selbst die folgenden Einschränkungen.
| Begrenzungselemente | Wert |
|---|---|
| Synchroner Aufruf (Request) Payload | 6 MB |
| Synchroner Aufruf (Response) Payload | 6 MB |
| Asynchrone Aufrufsnutzlast | 256 KB |
| Kapazität des Verzeichnisses <code>/tmp</code> | Standard 512 MB (Maximum 10 GB) |
| Maximale Ausführungszeit | 15 Minuten |
Bei der Verarbeitung von Dateien in Lambda werden temporäre Dateien in <code>/tmp</code> geschrieben. Der Standard beträgt 512 MB, aber Sie können den Ephemeral Storage in den Lambda-Einstellungen auf maximal 10 GB erweitern (mit zusätzlichen Kosten).
Codebeispiel für mehrteiliges S3-Upload in PHP
Dies ist ein Implementierungsbeispiel für Multipart-Uploads mit AWS SDK for PHP (v3). Wenn Sie die Klasse <code>MultipartUploader</code> des SDK verwenden, werden Chunk-Aufteilung, Wiederholungen und Abschlussverarbeitung automatisch verarbeitet.
use Aws\S3\S3Client;
use Aws\S3\MultipartUploader;
use Aws\Exception\MultipartUploadException;
$s3 = new S3Client([
'region' => 'ap-northeast-1',
'version' => 'latest',
]);
$uploader = new MultipartUploader($s3, '/path/to/large-file.mp4', [
'bucket' => 'your-bucket-name',
'key' => 'uploads/' . basename('/path/to/large-file.mp4'),
'before_initiate' => function (\Aws\Command $command) {
// アップロード開始前のフック
},
'before_upload' => function (\Aws\Command $command) {
// 各パートアップロード前のフック(プログレス表示など)
},
'concurrency' => 5, // 並列アップロード数
'part_size' => 10 * 1024 * 1024, // 1パート = 10 MiB
]);
try {
$result = $uploader->upload();
echo 'アップロード完了: ' . $result['ObjectURL'];
} catch (MultipartUploadException $e) {
// 失敗したパートから再開する例
$uploader = new MultipartUploader($s3, '/path/to/large-file.mp4', [
'state' => $e->getState(),
]);
$result = $uploader->upload();
}
Dies ist die Methode zum Ausstellen einer vorzeichneten URL und zum direkten Upload vom Client zu S3.
use Aws\S3\S3Client;
$s3 = new S3Client([
'region' => 'ap-northeast-1',
'version' => 'latest',
]);
// 署名付きURLを生成(有効期限: 15分)
$cmd = $s3->getCommand('PutObject', [
'Bucket' => 'your-bucket-name',
'Key' => 'uploads/' . uniqid('', true) . '.jpg',
'ContentType' => 'image/jpeg',
]);
$request = $s3->createPresignedRequest($cmd, '+15 minutes');
$presignedUrl = (string) $request->getUri();
// このURLをクライアントに返す
// クライアントはこのURLに PUT リクエストでファイルを直接送信する
echo json_encode(['upload_url' => $presignedUrl]);
Richtlinien zur Architekturauswahl
- <strong>~10 MB</strong>:einfache Implementierung mit API Gateway → Lambda → S3
- <strong>10 MB bis 100 MB</strong>: Direkter Upload vom Client zu S3 mit Presigned URL empfohlen
- <strong>100 MB bis 5 GB</strong>: Presigned URL + Multipart-Upload für stabilen Transfer
- <strong>Über 5 GB</strong>: Multipart-Upload erforderlich (PUT allein funktioniert nicht)
Testverfahren mit Grenzwertdateien von DevLab
Um die S3-Upload-Einstellungen praktisch zu validieren, benötigen Sie eine Testdatei mit exakter Größe. Mit den Grenzwert-Testdateien von DevLab können Sie das Verhalten um bestimmte Größen effizient überprüfen.
- Laden Sie die gewünschte Dateigröße zum Testen aus der <a href="/ja/files/threshold/">Liste der Grenzwert-Testdateien</a> von DevLab herunter.
- Beim Validieren der Multipart-Umschaltlinie können Sie auch die großformatige Version des <a href="/ja/files/images/png/">PNG-Testbilds</a> verwenden.
- Laden Sie die heruntergeladene Datei mit dem Befehl <code>aws s3 cp</code> oder den SDK-APIs <code>PutObject</code> / <code>MultipartUploader</code> hoch und überprüfen Sie Erfolg/Fehler bei Dateien nahe der Grenze.
Testdatei zur Verwendung in diesem Artikel
- <a href="/ja/files/threshold/" class="text-primary-600 dark:text-primary-400 hover:underline">Grenzwert-Testdateiliste</a> — Zur Überprüfung der Grenzen von S3, API Gateway und Lambda
- <a href="/ja/files/threshold/10mb/" class="text-primary-600 dark:text-primary-400 hover:underline">10 MB Grenzwert-Testsatz</a> — Überprüfung vor und nach dem 10 MB API Gateway Limit
- <a href="/ja/files/threshold/25mb/" class="text-primary-600 dark:text-primary-400 hover:underline">25 MB Grenzwert-Testsatz</a> — Zur Verhaltensüberprüfung vor und nach der empfohlenen Multipart-Linie
- <a href="/ja/files/images/png/" class="text-primary-600 dark:text-primary-400 hover:underline">PNG-Testbilderliste</a> — Zur Überprüfung der Funktionalität der Bild-Upload-Pipeline
Verwandte Artikel
- <a href="/ja/blog/how-to-test-upload-limit/" class="text-primary-600 dark:text-primary-400 hover:underline">So testen Sie die Datei-Upload-Grenze korrekt</a>
- <a href="/ja/blog/php-file-upload/" class="text-primary-600 dark:text-primary-400 hover:underline">So implementieren Sie Datei-Uploads in PHP | Vollständiger Leitfaden zu Validierung, Speicherung und Sicherheit</a>
- <a href="/ja/blog/multipart-form-data-overhead/" class="text-primary-600 dark:text-primary-400 hover:underline">Den Overhead von multipart/form-data genau berechnen</a>
- <a href="/ja/blog/mb-vs-mib-file-size/" class="text-primary-600 dark:text-primary-400 hover:underline">MB und MiB sind unterschiedlich! Fallstricke bei Dateigröße-Einheiten</a>