AWS CLI で S3 への大容量アップロード(マルチアップロード)をしてみた
はじめに
Amazon S3 に大容量ファイルをアップロードする際、単一の PUT 操作では 5GB の制限があります。この制限を超えるファイルや、ネットワーク状況が不安定な環境での大きなファイル転送には、マルチパートアップロード必要になります。
本記事では、AWS CLI を使用したマルチパートアップロードの実装方法と、その利点について解説します。
マルチパートアップロードとは
マルチパートアップロードは、大きなファイルを複数の小さなパートに分割してアップロードする機能です。主な利点は以下の通りです。
- 5GB を超えるファイルのアップロードが可能
- ネットワーク障害時に再開可能
- アップロード速度の向上(並列処理)
- 転送中のエラー検出と回復が容易
AWS CLI でのマルチパートアップロード実装
IAM 権限の注意点
マルチパートアップロードを行うには、以下のような IAM 権限が必要です:
- s3:PutObject
- s3:ListMultipartUploadParts
- s3:AbortMultipartUpload
- s3:CompleteMultipartUpload
1. 高レベルコマンド(自動マルチパート)
AWS CLI の s3
コマンドは、大きなファイルを自動的にマルチパートアップロードに切り替えます。
# 10GB のファイルをアップロード
aws s3 cp large-file.dat s3://your-bucket/large-file.dat
このコマンドは内部的にマルチパートアップロードを使用し、ファイルサイズに応じて適切なチャンクサイズを自動で決定します。
必要に応じて --storage-class
や --acl
オプションも指定可能です。
2. 低レベルコマンドによる手動制御
より細かい制御が必要な場合は、s3api
コマンドを使用します。
ステップ 1:マルチパートアップロードの開始
upload_id=$(aws s3api create-multipart-upload \
--bucket your-bucket \
--key large-file.dat \
--query 'UploadId' \
--output text)
ステップ 2:ファイルを分割してアップロード
# Linux の場合(100MB ごとに分割)
split -b 100MB large-file.dat part-
# macOS の場合(小文字の m を使用)
split -b 100m large-file.dat part-
# 各パートをアップロード
part_number=1
parts=()
for part in part-*; do
etag=$(aws s3api upload-part \
--bucket your-bucket \
--key large-file.dat \
--part-number $part_number \
--upload-id $upload_id \
--body $part \
--query 'ETag' \
--output text)
parts+=("{\"PartNumber\": $part_number, \"ETag\": $etag}")
part_number=$((part_number + 1))
done
# JSON 形式に整形
parts_json=$(IFS=,; echo "${parts[*]}")
ステップ 3:マルチパートアップロードの完了
aws s3api complete-multipart-upload \
--bucket your-bucket \
--key large-file.dat \
--upload-id $upload_id \
--multipart-upload "{\"Parts\": [$parts_json]}"
3. 中断と再開
アップロードが中断された場合、以下のコマンドで進行中のアップロードを確認できます。
# 進行中のアップロードを一覧表示
aws s3api list-multipart-uploads --bucket your-bucket
# 特定のアップロードの完了済みパートを確認
aws s3api list-parts \
--bucket your-bucket \
--key large-file.dat \
--upload-id YOUR_UPLOAD_ID
こうすることで、未アップロードのパートから再開することが可能になります。
注意点
1. 適切なパートサイズの選択
- 最小サイズ:5MB(最後のパートを除く)
- 推奨サイズ:100MB 以上(ネットワーク状況が良好な場合)
- 最大パート数:10,000
2. 未完了アップロードの管理
完了または中止されなかったマルチパートアップロードはストレージ料金が発生します。以下のようなライフサイクルルールを設定することで、自動的に削除できます。
{
"Rules": [
{
"ID": "AbortIncompleteMultipartUpload",
"Status": "Enabled",
"AbortIncompleteMultipartUpload": {
"DaysAfterInitiation": 7
}
}
]
}
3. チェックサムの活用(CLI v2 以降)
AWS CLI v2 では、アップロード時にチェックサムを指定することで、データの整合性を確保できます。
# チェックサムの生成(Linux/macOS)
openssl dgst -sha256 -binary part-00 | base64
# アップロード時に指定
aws s3api upload-part \
--bucket your-bucket \
--key large-file.dat \
--part-number 1 \
--upload-id $upload_id \
--body part-00 \
--checksum-algorithm SHA256 \
--checksum-sha256 <base64-encoded-checksum>
まとめ
マルチパートアップロードは、S3 への大容量ファイル転送において不可欠な機能です。AWS CLI の高レベルコマンドを使用すれば自動的に処理されますが、より細かい制御や再開機能が必要な場合は低レベル API を活用することで、柔軟なアップロード処理が実現できます。
環境や要件に応じて、最適な方法を選択してくださいね!
参考資料
Amazon S3 でのマルチパートアップロードを使用したオブジェクトのアップロードとコピー - Amazon Simple Storage Service
Amazon S3 へのマルチパートアップロードに AWS CLI を使用 | AWS re:Post
アノテーション株式会社について
アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。