SJ blog
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を使う機会は少ないが、未完了パーツのコスト管理にはライフサイクルルールの設定が必須だ。