HAPPY HACKING Oouchi's BLOG

PSE(ポンコツエンジニア)の技術ブログ

AWS CLIでS3のマルチパートアップロードを実行する

はじめに

大きいサイズのファイルをS3にアップロードする場合は「マルチパートアップロード」を使用しましょう。
スループットの向上や、アップロード失敗時のリカバリが楽(※)になります。

※失敗したときは、失敗した分割ファイルのみをやり直すだけでリカバリできる。

本題

S3バケットを作成する

アップロード用のS3バケットを作成していきます。
S3のコンソールを開きます。
f:id:ooooouchi:20200619022147p:plain

バケットを作成するをクリックします。
バケットの情報を入力します。

  • バケット名:グローバルでユニークな名前

他の設定はデフォルトで大丈夫です。

f:id:ooooouchi:20200619022152p:plain

作成をクリックします。

f:id:ooooouchi:20200619022156p:plain

作成できました。

ファイルを分割する

アップロードするファイルを用意します。

f:id:ooooouchi:20200619022201p:plain

今回は約150MBの動画ファイルです。

splitコマンドでファイルをチャンクに分割します。

split -b 40M video.mp4

f:id:ooooouchi:20200619022205p:plain

40MBのファイルに分割されました。

ファイル名はうまい具合にアルファベット順になっています。

マルチパートアップロードを作成する

マルチパートアップロードを作成します。

構文

aws s3api create-multipart-upload --bucket [バケット名] --key [元のファイル名]

実際のコマンド例

aws s3api create-multipart-upload --bucket hhob-s3multipart-final --key video.mp4

f:id:ooooouchi:20200619022210p:plain

※UploadIdは後で使用するのでメモしておきましょう!

分割したファイルをアップロードする

各チャンクをアップロードします。

本来は自動化するべきですが今回は1つずつ手動でアップロードします。

part-numberとbodyの値を適宜変更して実行して下さい。

構文

aws s3api upload-part --bucket [バケット名] --key [元のファイル名] --part-number [連番] --body [チャンクファイル名] --upload-id [id]

実際のコマンド例

aws s3api upload-part --bucket hhob-s3multipart-final --key video.mp4 --part-number 1 --body xaa --upload-id TSt.uq_2SItWDD_v0IxkxwmuhaAPOj6k5AV3PWg3UhyNkoSGSrcO0n2spy1i3LPfQH3GWfjnx6gXWAZrgVK0DwPrgCiGtfpPQdTwtna_LMePU554eKJTjx.H.FJ4ZYSFgu_tbsijTH6keU1_pu._tA--

f:id:ooooouchi:20200619022215p:plain

※part-numberとETagは後で使用するのでメモしておきましょう!

ファイルを 結合する

ファイルを結合するためのjsonファイルを作成します。

nano list.json

jsonの内容

先ほどメモしたpartnumberとETagに置き換えてください。

{
  "Parts": [
    {
      "PartNumber": 1,
      "ETag": "\"70418ed5e552ea21deb8785359e69e28\""
    },
    {
      "PartNumber": 2,
      "ETag": "\"e0c16ead703bfcd1b36b339d9ae1901d\""
    },
    {
      "PartNumber": 3,
      "ETag": "\"56734bc19b453aab5144de4454945609\""
    },
    {
      "PartNumber": 4,
      "ETag": "\"7786233d68592caf07e93521cbd0a80e\""
    }
  ]
}

f:id:ooooouchi:20200619022221p:plain

Ctrl + X、Y、Enterで書き込みを終了します。

チャンクを結合します。

構文

aws s3api complete-multipart-upload --multipart-upload [jsonファイルリンク] --bucket [バケット名] --key [オリジナルファイル名] --upload-id [id]

バケット名とUploadIdは適宜置き換えてください。

実際のコマンド例

aws s3api complete-multipart-upload --multipart-upload file://list.json --bucket hhob-s3multipart-final --key video.mp4 --upload-id TSt.uq_2SItWDD_v0IxkxwmuhaAPOj6k5AV3PWg3UhyNkoSGSrcO0n2spy1i3LPfQH3GWfjnx6gXWAZrgVK0DwPrgCiGtfpPQdTwtna_LMePU554eKJTjx.H.FJ4ZYSFgu_tbsijTH6keU1_pu._tA--

f:id:ooooouchi:20200619022225p:plain

実施結果確認

S3のコンソールに戻ります。

最初に作成したバケットのオブジェクト一覧を確認します。

f:id:ooooouchi:20200619022229p:plain

無事アップロードに成功したようです。

以上です。

おわりに

マルチパートアップロードは地味に使用する機会が多いと思います。

チャンクをアップロードする部分などを効率化して活用してみてください!