Satya がマルチパートメッセージの
実行を説明します
S3 にアップロードする

Satya_s3-multipart-upload-cli-1

大きなファイル (100 MB を超えるもの) を Amazon Simple Storage Service (Amazon S3) バケットに複数のパートに分けてコピーする必要があります。また、ファイルのパートをアップロードした後に、リンクさせて元のファイルに戻したときの、ファイルの整合性も確認する必要があります。このことを、AWS コマンドラインインターフェース (CLI) を用いて行う方法を教えてください。

ファイルを Amazon S3 に複数のパートに分けてアップロードすれば、ファイルのパートを並列にアップロードするために複数のスレッドを使用することになるので、アップロードの速度が改善されます。別のメリットとしては、1 つまたは複数のパートのアップロードに失敗しても、ファイル全体ではなく、失敗したパートだけを再アップロードすればよいという点があります。

マルチパートメッセージのアップロードの整合性は、アップロードを開始したときに、オリジナルのファイルと、各ファイルパートの base64 MD5 チェックサム値を Amazon S3 に送信することにより、検証できます。これらのチェックサム値は、ファイルまたはそのパートの整合性を検証するために使用できます。ステップは次の通りです。

  1. アップロードするファイルの base64 MD5 チェックサム値を取得します。
  2. ファイルを複数のパートに分割し、各ファイルパートの base64 MD5 チェックサム値を取得します。
  3. Amazon S3 へのマルチパートメッセージのアップロードを開始し、固有の UploadId 値を含むレスポンスを受信します。この値は、各ファイルパートを含む、オリジナルのファイルに関連付けられます。
  4. UploadId と各ファイルパートの base64 MD5 チェックサムを指定して、ファイルパートを Amazon S3 にアップロードします。Amazon S3 は、ファイルパートごとに、別個の ETag 値を返します。
  5. すべてのパートがアップロードされたら、マルチパートアップロードのプロセスを完了させるコマンドを実行します。このコマンドには、送信先バケット、ファイルパートのリスト、その他の情報といった詳細が含まれます。Amazon S3 はこの情報を使用して、オリジナルのファイルを再作成し、その健全性を検証します。

AWS CLI を使用して以下のステップを実行し、Amazon S3 バケットにマルチパートメッセージアップロードします。

注意: AWS CLI は、いくつかのオペレーティングシステム上で動作する、いくつかの異なるコマンドプロセッサからアクセスできます。通常、コマンドプロセッサがパラメータ値を受け取るための構文規則はそれぞれ異なっています。たとえば、二重引用符内のテキストを処理するコマンドプロセッサや、一重引用符内のテキストだけを受け付けるコマンドプロセッサがあります。本ドキュメントの入出力の例は、Windows コマンドプロンプトから AWS CLI を実行して作成されたものです。Linux、MacOS、および Windows PowerShell は、異なる構文を使用します。詳細については、「AWS Command Line Interface のパラメータ値の指定」を参照してください。

ステップ 1: アップロードするファイルの base64 MD5 チェックサム値の取得

Windows の場合File Checksum Integrity Verifier (FCIV) ユーティリティをダウンロードし、内容を抽出して、フォルダに格納します。次のコマンドを (管理者権限の) コマンドプロンプトで実行し、フォルダの場所を Windows のシステムパスに追加します。この時、「c:\fciv」は FCIV ユーティリティファイルを格納したフォルダで置き換えてください。

C:>set path=%path%;c:\\fciv

注意: コマンドプロンプトで Windows システムパスを変更しても、再起動時には元に戻ることに注意してください。Windows のシステムパス環境変数を永続的に変更する方法は、Windows のドキュメントを参照するか、サーチエンジンに「Windows X のパス変数の変更」と入力してインターネットで探してください。この際、「X」 はお使いの Window システムのバージョンで置き換えます。

FCIV ユーティリティをインストールし、%path% 環境変数に FCIV ユーティリティファイルの格納場所を追加して更新したら、次のコマンドを実行します。Amazon S3 にアップロードするファイルの MD5 チェックサムが 16 進数で戻ってきます。「c:\S3\testfile」は、Amazon S3 にアップロードするファイルの場所で置き換えてください。

fciv.exe c:\\S3\\testfile

注意: パスにスペースが含まれている場合は、パスを引用符 (") で囲んでください。

C:\Windows\explorer.exe ファイルの MD5 チェックサムを計算したときに返される次の値と似た値が返されます。

fciv C:\\Windows\\explorer.exe
//
// File Checksum Integrity Verifier version 2.05.
//
e1b0af69bfb6cbde9b53c55e4bf91992 c:\\windows\\explorer.exe

重要: FCIV ユーティリティからの MD5 チェックサムは 16 進数であり、Amazon S3 へマルチパートメッセージをアップロードする際のチェックサム値として使用するには、base64 に変換する必要があります。16 進数の MD5 チェックサムを使用すると、"The Content-MD5 you specified is invalid" というエラーメッセージが表示されます。インターネットには、16 進数から base64 文字列に変換するためのデコーダがいくつかあります。また、HexToBase64 VB スクリプトのようなスクリプトコードをダウンロードすることもできます。Amazon S3 へのマルチパートメッセージのアップロードを繰り返し行う予定があるなら、スプレッドシートで使用できる、16 進数から base64 への変換関数の例も見つけることができます。この例での、FCIV ユーティリティが返した 16 進数と等価な base64 エンコード文字列は 4bCvab+2y96bU8VeS/kZkg== になります。

Linux の場合。Linux では初めから、openssl コマンドを使用して、ファイルの base64 MD5 チェックサムを計算できるようになっています。Linux のファイルの base64 MD5 チェックサムを求めるには、Linux シェルで次のコマンドを実行します。

openssl md5 -binary PATH/TO/FILE |base64 

/bin/bash ファイルの base64 MD5 チェックサムを計算したときに返される次の値と似た値が返されます。

user@example:/home$ openssl md5 -binary /bin/bash |base64
+e9lnJtCrdoKwYqg9wlFwA==

Windows の場合。Windows のファイルは、HJ-Split for Windows のような入手可能なフリーウェアユーティリティを使用して複数のパートに分割できます。HJ-Split for Windows には、ファイルパートごとの 16 進 MD5 チェックサム値を計算できる UI も備わっています。これらの値は 16 進なので、それらを使ってマルチパートメッセージをアップロードする前に、base64 に変換する必要があります。

Linux の場合 - Linux では、split コマンドを使用してファイルを分割する機能がネイティブに備わっています。これはまた、base64 MD5 チェックサムを計算することもできます。Linux の split コマンドの使用法の詳細については、Linux のコマンドシェルで以下のコマンドを入力してください。

split --help - displays arguments for the split command
info split - displays general information about the split command
man split - displays the manual page for the split command

GUI インターフェイスを使用したい場合には、Linux 用の HJ-Split も利用可能です。

次の表は、マルチパートメッセージのアップロードを開始するために必要な情報を示しています。

項目

パラメータと値

ターゲットバケット

--bucket targetBucket

ファイル名

--key testfile  --metadata md5=mvhFZXpr7J5u0ooXDoZ/4Q==

パート 1

--part-number 1  --body testfile.001 --content-md5 Vuoo2L6aAmjr+4sRXUwf0w==

パート 2

--part-number 2  --body testfile.002  --content-md5 317wIkbjGrgH2m9igCwa6A==

この表の情報を元に、AWS の CLI コマンドである s3api create-multipart-upload を実行すれば、ファイルのパートに分割されるオリジナルのファイルと関連付けられた固有の UploadId 値を取得できます。

aws s3api create-multipart-upload --bucket multirecv --key testfile
--metadata md5= mvhFZXpr7J5u0ooXDoZ/4Q==

このコマンドへのレスポンスには、メッセージのパートをアップロードする際に必要となる、UploadId 値が含まれています。

}    "Key": "testfile"
    "Bucket": "multirecv",    
    "UploadId":"sDCDOJiTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk",
{

この例の、最初のメッセージパートをアップロードするためのコマンドは、ターゲットバケット、オリジナルのファイル名、最初のファイルパート、UploadId 値、および最初のファイルパートの base64 MD5 チェックサムを指定しています。

aws s3api upload-part --bucket multirecv --key testfile --part-number 1 --body testfile.001 --upload-id sDCDOJiTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk --content-md5 Vuoo2L6aAmjr+4sRXUwf0w==

このコマンドのレスポンスには、メッセージのこのパートに対応する ETag 値が含まれています。この ETag 値は、マルチパートメッセージのアップロードプロセスを完了するために後ほど用いるので、保存しておきます。

{
    "ETag": "\\"56ea28d8be9a0268ebfb8b115d4c1fd3\\""
}

2 番目のメッセージパートをアップロードするためのコマンドも同様ですが、パートの番号 (--part-number 2)、2 番目のパートの名前 (--body testfile.002)、および MD5 チェックサム値が異なっています。

aws s3api upload-part --bucket multirecv --key testfile --part-number 2 --body testfile.002 --upload-id sDCDOJiTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk --content-md5 317wIkbjGrgH2m9igCwa6A==

2 番目のメッセージパートをアップロードするためのコマンドは、異なる ETag 値を返します。

{
    "ETag": "\\"df5ef02246e31ab807da6f62802c1ae8\\""
}

オプションとして、次のコマンドを実行すれば、正しくアップロードされたパートのリストを表示できます。

aws s3api list-parts --bucket multirecv --key testfile --upload-id sDCDOJiTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk

この例では、次のような出力が返ります。この例では、アカウント所有者、マルチパートメッセージのアップロードのイニシエータ、アップロードされたパート、およびパートを含むバケットのストレージクラスが表示されます。

{
    "Owner": {
        "DisplayName": "multipartmessage",
        "ID": "290xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    },
    "Initiator": {
        "DisplayName": "multipart",
        "ID": "arn:aws:iam::22xxxxxxxxxx:user/multipart"
    },
    "Parts": [
        {
            "LastModified": "2016-01-13T13:43:33.000Z",
            "PartNumber": 1,
            "ETag": "\\"56ea28d8be9a0268ebfb8b115d4c1fd3\\"",
            "Size": 79520768
        },
        {
            "LastModified": "2016-01-13T13:56:47.000Z",
            "PartNumber": 2,
            "ETag": "\\"df5ef02246e31ab807da6f62802c1ae8\\"",
            "Size": 79519704
        }
    ],
    "StorageClass": "STANDARD"
}

パートのアップロード後に、Amazon S3 は、オリジナルのファイルを再作成するため、いくつかの追加情報を必要とします。. 最初の情報は、メッセージのパートがアップロードされたときに返された ETag 値を含む、JSON 形式のファイルです。この例では、ファイルの名前は fileparts であり、オリジナルのファイルおよびそれを構成するパートと同じディレクトリに保存されます。

# fileparts
{
    "Parts": [
    {
        "ETag": "56ea28d8be9a0268ebfb8b115d4c1fd3",
        "PartNumber":1
    },
    {
        "ETag": "df5ef02246e31ab807da6f62802c1ae8",
        "PartNumber":2
    }
    ]
}

これにより、マルチパートメッセージのアップロードプロセスは完了します。このコマンドは、ステップ 4 で作成した JSON 形式のファイルを読み取ることにより、ファイルのそれぞれのパートを決定し、各部分をまとめて、指定された S3 バケットにオリジナルのファイルを復元しようと試みます。複数パートファイルの各パートを一意に識別するために、–upload-id パラメータも指定されています。

aws s3api complete-multipart-upload --multipart-upload file://fileparts --bucket multirecv --key testfile --upload-id sDCDOJiTUVGeKAk3Ob7qMynRKqe3ROcavPRwg92eA6JPD4ybIGRxJx9R0VbgkrnOVphZFK59KCYJAO1PXlrBSW7vcH7ANHZwTTf0ovqe6XPYHwsSp7eTRnXB1qjx40Tk

この最終ステップが正常に完了すると、出力は次と似たものになります。

{
    "ETag": "\\"13115fdae01633ff0af167d925cad279-2\\"",
    "Bucket": "multirecv",
    "Location": "https://multirecv.s3.amazonaws.com/testfile",
    "Key": "testfile"
}

アップロードされたファイルのオブジェクトヘッダーデーターを取得するには、次のコマンドを実行します。

aws s3api head-object --bucket multirecv --key testfile
{
    "AcceptRanges": "bytes",
    "ContentType": "binary/octet-stream",
    "LastModified": "Wed, 13 Jan 2016 13:15:00 GMT",
    "ContentLength": 159040472,
    "ETag": "\\"13115fdae01633ff0af167d925cad279-2\\"",
    "Metadata": {
        "md5": "mvhFZXpr7J5u0ooXDoZ/4Q=="
    }
}

1 つまたは複数のマルチパートメッセージのアップロードで問題が生じた場合、ステップ 4 で説明した方法に従い、メッセージパートの再アップロードを試みることができます。 メッセージパートがアップロードされたものの、異常が発生していた場合には、不必要なストーレジ料金が課されるのを防ぐため、忘れずに削除してください。バケット内の不完全なマルチパートメッセージのアップロードをリスト表示するには、次のコマンドを実行します。targetBucket の部分は自分のバスケット名で置き換えてください。

aws s3api list-multipart-uploads --bucket multirecv

応答として、まだ処理されていないメッセージパートのリストが返されます。

{
    "Uploads": [
        {
            "Initiator": {
                "DisplayName": "myaccount",
                "ID": "5b7xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx "
            },
            "Initiated": "2016-03-31T06:13:15.000Z",
            "UploadId": "MuQzVbEvQpHp7eHc_J5s9U.kzM3GAHeOJh1P8wVTmRqEVojwiwu3wPX6fWYzADNtOHklJI6W6Q9NJUYgjePKCVpbl_rDP6mGIr2AQJNKB_A-",
            "StorageClass": "STANDARD",
            "Key": "music.mp4",
            "Owner": {
                "DisplayName": " myaccount ",
                "ID": "5b7xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx "
            }
        }
   ]
}

この情報を基に、不必要なメッセージパートを削除できます。たとえば、この例で説明したメッセージパートのアップロードを中止するには、次のコマンドを実行します。

aws s3api abort-multipart-upload --bucket multirecv --key music.mp4 --upload-id MuQzVbEvQpHp7eHc_J5s9U.kzM3GAHeOJh1P8wVTmRqEVojwiwu3wPX6fWYzADNtOHklJI6W6Q9NJUYgjePKCVpbl_rDP6mGIr2AQJNKB

このページは役に立ちましたか? はい | いいえ

AWS サポート ナレッジ センターに戻る

サポートが必要ですか? AWS サポートセンターをご覧ください。

公開日: 2016 年 1 月 25 日

更新: 2018 年 2 月 22 日