backend
A
信頼度ランク
| S | 公式ソース確認済み |
| A | 成功実績多数・失敗例少数 |
| B | 賛否両論 |
| C | 動作未確認・セキュリティリスク高 |
| Z | 個人所感 |
S3マルチパートアップロード — 必須条件・並列処理・中断時の対処
S3マルチパートアップロードの仕組み、5MB/5GB/5TBの各制限、並列アップロードによる高速化、Transfer Accelerationとの組み合わせ、中断した場合のコスト管理まで解説。
一言結論
5GBを超えるファイルはマルチパートアップロードが必須で、実装はSDKが自動処理するため直接APIを使う必要はほぼないが、中断した場合のパーツが無期限に課金されるのでライフサイクルルールでの自動削除設定だけは必須だ。
マルチパートアップロードとは
大容量ファイルをパーツに分割して並列アップロードする機能だ。最終的にS3がパーツを結合して一つのオブジェクトとして保存する。
通常のアップロード(PUT): 最大5GB
マルチパートアップロード: 最大5TB(1パーツあたり最大5GB、最小5MB)
必須条件: 5GB超のファイルはマルチパートアップロードしか使えない
推奨条件: 100MB以上のファイルはマルチパートを推奨(速度向上)
パーツのサイズ制限
最小パーツサイズ: 5MB(最後のパーツのみ例外で5MB未満可)
最大パーツサイズ: 5GB
最大パーツ数: 10,000パーツ
→ 50GBのファイル: 5MBx10,000 = 50GB(ぴったり上限)
→ 50TBは不可(5GB×10,000 = 50TB だが最大5TBの制限)
マルチパートアップロードの流れ
1. CreateMultipartUpload → UploadIdを取得
2. UploadPart → 各パーツをアップロード(並列実行可能)
3. CompleteMultipartUpload → 全パーツを結合して完成
(またはAbortMultipartUpload → 中断してパーツを削除)
import boto3
import os
import threading
s3 = boto3.client('s3')
BUCKET = 'my-bucket'
KEY = 'large-file.bin'
FILE_PATH = '/data/large-file.bin'
PART_SIZE = 100 * 1024 * 1024 # 100MB
def upload_large_file(bucket, key, file_path):
# ステップ1: マルチパートアップロード開始
response = s3.create_multipart_upload(
Bucket=bucket,
Key=key,
ServerSideEncryption='aws:kms'
)
upload_id = response['UploadId']
parts = []
file_size = os.path.getsize(file_path)
try:
with open(file_path, 'rb') as f:
part_number = 1
while True:
data = f.read(PART_SIZE)
if not data:
break
# ステップ2: パーツアップロード
response = s3.upload_part(
Bucket=bucket,
Key=key,
PartNumber=part_number,
UploadId=upload_id,
Body=data
)
parts.append({
'PartNumber': part_number,
'ETag': response['ETag']
})
part_number += 1
# ステップ3: アップロード完了・結合
s3.complete_multipart_upload(
Bucket=bucket,
Key=key,
UploadId=upload_id,
MultipartUpload={'Parts': parts}
)
except Exception as e:
# 失敗時は中断(パーツデータを削除)
s3.abort_multipart_upload(
Bucket=bucket,
Key=key,
UploadId=upload_id
)
raise e
Python SDKの高レベルAPI(推奨)
直接マルチパートAPIを使う必要はほとんどない。SDKのTransfer Managerが自動で並列マルチパートアップロードを処理する。
import boto3
from boto3.s3.transfer import TransferConfig
s3 = boto3.client('s3')
# TransferConfigで並列数・パーツサイズを設定
config = TransferConfig(
multipart_threshold=1024 * 25, # 25MB以上でマルチパート使用
max_concurrency=10, # 並列スレッド数
multipart_chunksize=1024 * 25, # パーツサイズ
use_threads=True
)
s3.upload_file(
'large-file.bin',
'my-bucket',
'large-file.bin',
Config=config
)
S3 Transfer Accelerationとの組み合わせ
Transfer AccelerationはCloudFrontのエッジロケーション経由でS3にアップロードを高速化する機能だ。地理的に離れた場所からの大容量アップロードに有効。
# Transfer Accelerationを有効化
aws s3api put-bucket-accelerate-configuration \
--bucket my-bucket \
--accelerate-configuration Status=Enabled
# 専用エンドポイントを使ってアップロード
aws s3 cp large-file.bin \
s3://my-bucket/large-file.bin \
--endpoint-url https://my-bucket.s3-accelerate.amazonaws.com
注意: Transfer Accelerationは追加料金が発生する。近距離からのアップロードでは逆に遅くなることもある。
中断したマルチパートのコスト管理
# 未完了のマルチパートアップロードを確認
aws s3api list-multipart-uploads \
--bucket my-bucket
# 特定の未完了アップロードを手動削除
aws s3api abort-multipart-upload \
--bucket my-bucket \
--key large-file.bin \
--upload-id UPLOAD_ID
未完了パーツはストレージ料金が発生し続ける。ライフサイクルルールで自動削除が推奨だ。
{
"Rules": [{
"ID": "cleanup-incomplete-multipart",
"Status": "Enabled",
"Filter": {},
"AbortIncompleteMultipartUpload": {
"DaysAfterInitiation": 7
}
}]
}
試験頻出ポイント
| シナリオ | 回答 |
|---|---|
| 5GBを超えるオブジェクトをアップロード | マルチパートアップロード必須 |
| アップロード速度を最大化 | マルチパート+並列処理 |
| 地理的に遠い場所からの高速化 | Transfer Acceleration |
| 未完了パーツのコスト削減 | ライフサイクルルールで自動削除 |
| パーツの最小サイズ | 5MB(最終パーツのみ例外) |
まとめ
5GBを超えるファイルはマルチパートアップロード必須だが、100MB以上のファイルでも速度向上のために使うべきだ。SDK(boto3等)は自動でマルチパートを処理するので直接APIを使う機会は少ないが、未完了パーツのコスト管理にはライフサイクルルールの設定が必須だ。