チュートリアル: マルチパートアップロードでオブジェクトをアップロードして、データ整合性を検証する - Amazon Simple Storage Service

チュートリアル: マルチパートアップロードでオブジェクトをアップロードして、データ整合性を検証する

マルチパートアップロードを使用すると、単一のオブジェクトをパートのセットとしてアップロードすることができます。各パートは、オブジェクトのデータの連続する部分です。これらのオブジェクトパートは、任意の順序で個別にアップロードできます。いずれかのパートの送信が失敗すると、他のパートに影響を与えることなくそのパートを再送することができます。オブジェクトのすべてのパートがアップロードされたら、Amazon S3 はこれらのパートを組み立ててオブジェクトを作成します。通常、オブジェクトサイズが 100 MB 以上の場合は、単一のオペレーションでオブジェクトをアップロードする代わりに、マルチパートアップロードを使用することを考慮してください。マルチパートアップロードの詳細については、「マルチパートアップロードを使用したオブジェクトのアップロードとコピー」を参照してください。マルチパートアップロードに関する制限については、「Amazon S3 マルチパートアップロードの制限」を参照してください。

チェックサムを使用して、コピー時にアセットが変更されていないことを確認できます。チェックサムを実行するには、アルゴリズムを使用してファイル内のバイトごとに順番に反復処理を行います。Amazon S3 は、データの整合性をチェックするための複数のチェックサムオプションを提供しています。耐久性のベストプラクティスとして、このような整合性チェックを実行し、すべてのバイトが変更されずに転送されることを確認することをお勧めします。Amazon S3 は、HA-1、SHA-256、CRC32、CRC32C のアルゴリズムもサポートしています。Amazon S3 は、このようなアルゴリズムの 1 つまたは複数使用して、追加のチェックサム値を計算し、オブジェクトメタデータの一部として保存します。チェックサムの詳細については、「オブジェクトの整合性をチェックする」を参照してください。

目的

このチュートリアルでは、AWS コマンドラインインターフェイス (AWS CLI) を介してマルチパートアップロードと追加の SHA-256 チェックサムを使って、オブジェクトを Amazon S3 にアップロードする方法を説明します。アップロードしたオブジェクトの MD5 ハッシュと SHA-256 チェックサムを計算することで、オブジェクトのデータ整合性を確認する方法についても説明します。

前提条件

  • このチュートリアルを開始する前に、アップロード先の Amazon S3 バケットにアクセスできることを確認してください。詳細については、「バケットの作成」を参照してください。

  • AWS CLI がインストールされて、設定されている必要があります。AWS CLI をまだインストールしていない場合は、「AWS Command Line Interface ユーザーガイド」の「AWS CLI の最新バージョンをインストールまたは更新する」を参照してください。

  • 別の方法として、AWS CloudShell を使用してコンソールから AWS CLI コマンドを実行することもできます。AWS CloudShell は、AWS Management Consoleから直接起動できる、ブラウザベースの事前認証済みシェルです。詳細については、「AWS CloudShell ユーザーガイド」の「CloudShell とは」と「AWS CloudShell の使用開始」を参照してください。

ステップ 1: サイズが大きいファイルを作成する

アップロードするファイルが既にある場合は、このチュートリアルでそのファイルを使用できます。ない場合は、次の手順で 15 MB のファイルを作成します。マルチパートアップロードに関する制限については、「Amazon S3 マルチパートアップロードの制限」を参照してください。

サイズが大きいファイルを作成するには

使用しているオペレーティングシステムに応じて、次のいずれかのコマンドを使用してファイルを作成します。

Linux または macOS

15 MB のファイルを作成するには、ローカルターミナルを開いて、次のコマンドを実行します。

dd if=/dev/urandom of=census-data.bin bs=1M count=15

このコマンドは、ランダムなバイトが入力された、サイズが 15 MB の census-data.bin という名前のファイルを作成します。

Windows

15 MB のファイルを作成するには、ローカルターミナルを開いて、次のコマンドを実行します。

fsutil file createnew census-data.bin 15728640

このコマンドは、サイズが 15 MB (15,728,640 バイト) の任意のデータが入力された、census-data.bin という名前のファイルを作成します。

ステップ 2: ファイルを複数のファイルに分割する

マルチパートアップロードを実行するには、サイズの大きいファイルを小さいサイズのパートに分割する必要があります。その後、マルチパートアップロードプロセスを使用して、小さいサイズのパートをアップロードできます。このステップでは、ステップ 1 で作成したサイズの大きいファイルを小さいパートに分割する方法を説明します。次の例では、census-data.bin という名前の 15 MB のファイルを使用します。

サイズの大きいファイルをパートに分割するには

Linux または macOS

サイズの大きいファイルを 5 MB のパートに分割するには、split コマンドを使用します。ターミナルを開いて、次のコマンドを実行します。

split -b 5M -d census-data.bin census-part

このコマンドは、census-data.bincensus-part** という名前の 5 MB のパートに分割します。**00 から始まる数値のサフィックスです。

Windows

サイズの大きいファイルを分割するには、PowerShell を使用します。PowerShell を開いて、次のスクリプトを実行します。

$inputFile = "census-data.bin" $outputFilePrefix = "census-part" $chunkSize = 5MB $fs = [System.IO.File]::OpenRead($inputFile) $buffer = New-Object byte[] $chunkSize $fileNumber = 0 while ($fs.Position -lt $fs.Length) { $bytesRead = $fs.Read($buffer, 0, $chunkSize) $outputFile = "{0}{1:D2}" -f $outputFilePrefix, $fileNumber $fileStream = [System.IO.File]::Create($outputFile) $fileStream.Write($buffer, 0, $bytesRead) $fileStream.Close() $fileNumber++ } $fs.Close()

この PowerShell スクリプトは、サイズの大きいファイルを 5 MB のチャンクで読み取り、各チャンクを数値のサフィックス付きの新しいファイルに書き込みます。

適切なコマンドを実行後、コマンドを実行したディレクトリに複数のパートがあるのを確認できるはずです。各パートには、次の例のとおり、パート番号に対応するサフィックスが付けられています。

census-part00 census-part01 census-part02

ステップ 3: 追加のチェックサムを使用してマルチパートアップロードを作成する

マルチパートアップロードプロセスを開始するには、マルチパートアップロードリクエストを作成する必要があります。このステップでは、マルチパートアップロードを開始し、データの整合性に関する追加のチェックサムを指定します。次の例では、SHA-256 チェックサムを使用しています。アップロードするオブジェクトの説明となるメタデータを指定する場合は、マルチパートアップロードの開始リクエストの中で指定する必要があります。

注記

このチュートリアルでは、このステップと以降のステップで SHA-256 の追加アルゴリズムを使用します。このようなステップでは、必要に応じて、CRC32、CRC32C、または SHA-1 などの追加のチェックサムを使用できます。別のアルゴリズムを使用する場合は、このチュートリアルのステップ全体で、同じアルゴリズムを使用する必要があります。

マルチパートアップロードを開始するには

ターミナルで、次の create-multipart-upload コマンドを使用してバケットのマルチパートアップロードを開始します。amzn-s3-demo-bucket1 を実際のバケット名に置き換えます。census_data_file も選択したファイル名に置き換えます。このファイル名は、アップロードが完了するとオブジェクトキーになります。

aws s3api create-multipart-upload --bucket amzn-s3-demo-bucket1 --key 'census_data_file' --checksum-algorithm sha256

リクエストが正常に完了すると、次のような JSON 出力が表示されます。

{ "ServerSideEncryption": "AES256", "ChecksumAlgorithm": "SHA256", "Bucket": "amzn-s3-demo-bucket1", "Key": "census_data_file", "UploadId": "cNV6KCSNANFZapz1LUGPC5XwUVi1n6yUoIeSP138sNOKPeMhpKQRrbT9k0ePmgoOTCj9K83T4e2Gb5hQvNoNpCKqyb8m3.oyYgQNZD6FNJLBZluOIUyRE.qM5yhDTdhz" }
注記

リクエストを送信すると、アップロード ID を含むレスポンスが Amazon S3 から返されます。アップロード ID はマルチパートアップロードの一意の識別子です。パートのアップロード、パートのリスト、アップロードの完了、アップロードの停止を行うときは常に、このアップロード ID を指定する必要があります。UploadIdKeyBucket の値は、後半のステップで使用する必要があるため、必ず保存します。

追加のチェックサムがあるマルチパートアップロードを使用する場合、マルチパート番号には連続するパート番号を使用する必要があります。連続していないパート番号を使用すると、complete-multipart-upload リクエストで HTTP 500 Internal Server Error が発生する可能性があります。

ステップ 4: マルチパートアップロードのパートをアップロードする

このステップでは、マルチパートアップロードのパートを S3 バケットにアップロードします。upload-part コマンドを使用して、各パートを個別にアップロードします。このプロセスでは、アップロード ID、パート番号、パートごとにアップロードするファイルを指定する必要があります。

パートをアップロードするには
  1. パートをアップロードする際は、アップロード ID 以外にも、--part-number 引数を使用して、パート番号を指定する必要があります。1~10,000 の範囲で任意のパート番号を選択できます。パート番号によって、アップロードするオブジェクトに含まれるパートとその位置が一意に識別されます。選択するパート番号は、連続している必要があります (1、2、3 など)。以前にアップロードしたパートと同じパート番号を使って新しいパートをアップロードした場合、以前のパートは上書きされます。

  2. upload-part コマンドを使用して、マルチパートアップロードの各パートを個別にアップロードします。--upload-id は、ステップ 3create-multipart-upload コマンドを使って作成した出力と同じものです。データの最初のパートをアップロードするには、次のコマンドを使用します。

    aws s3api upload-part --bucket amzn-s3-demo-bucket1 --key 'census_data_file' --part-number 1 --body census-part00 --upload-id "cNV6KCSNANFZapz1LUGPC5XwUVi1n6yUoIeSP138sNOKPeMhpKQRrbT9k0ePmgoOTCj9K83T4e2Gb5hQvNoNpCKqyb8m3.oyYgQNZD6FNJLBZluOIUyRE.qM5yhDTdhz" --checksum-algorithm SHA256

    upload-part コマンドが完了すると、次の例のような出力が表示されるはずです。

    { "ServerSideEncryption": "AES256", "ETag": "\"e611693805e812ef37f96c9937605e69\"", "ChecksumSHA256": "QLl8R4i4+SaJlrl8ZIcutc5TbZtwt2NwB8lTXkd3GH0=" }
  3. 以降のパートについては、順番にパート番号を増分します。

    aws s3api upload-part --bucket amzn-s3-demo-bucket1 --key 'census_data_file' --part-number <part-number> --body <file-path> --upload-id "<your-upload-id>" --checksum-algorithm SHA256

    例えば、2 番目のパートをアップロードするには、次のコマンドを使用します。

    aws s3api upload-part --bucket amzn-s3-demo-bucket1 --key 'census_data_file' --part-number 2 --body census-part01 --upload-id "cNV6KCSNANFZapz1LUGPC5XwUVi1n6yUoIeSP138sNOKPeMhpKQRrbT9k0ePmgoOTCj9K83T4e2Gb5hQvNoNpCKqyb8m3.oyYgQNZD6FNJLBZluOIUyRE.qM5yhDTdhz" --checksum-algorithm SHA256

    Amazon S3 は、エンティティタグ (ETag) と、アップロードされた各パートの追加チェックサムをレスポンスのヘッダーとして返します。

  4. オブジェクトのすべてのパートのアップロードが完了するまで、upload-part コマンドを引き続き使用します。

ステップ 5: マルチパートアップロードのすべてのパートを一覧表示する

マルチパートアップロードを完了するには、特定のマルチパートアップロードでアップロードされたすべてのパートの一覧が必要です。list-parts コマンドからの出力は、バケット名、キー、アップロード ID、パート番号、eTag、追加のチェックサムなどの情報を提供します。この出力をファイルに保存して、マルチパートアップロードプロセスの完了に向けた次のステップで使用できるようにすると便利です。次の方法を使用して、parts.json という名前の JSON 出力ファイルを作成できます。

すべてのパートを一覧表示するファイルを作成するには
  1. アップロードしたすべてのパートの詳細を含む JSON ファイルを生成するには、次の list-parts コマンドを使用します。amzn-s3-demo-bucket1 は実際のバケット名、<your-upload-id> は、ステップ 3 で取得したアップロード ID に置き換えます。list-parts コマンドの詳細については、「AWS Command Line Interface ユーザーガイド」の「list-parts」を参照してください。

    aws s3api list-parts --bucket amzn-s3-demo-bucket1 --key 'census_data_file' --upload-id <your-upload-id> --query '{Parts: Parts[*].{PartNumber: PartNumber, ETag: ETag, ChecksumSHA256: ChecksumSHA256}}' --output json > parts.json

    parts.json という名前の新しいファイルが生成されます。このファイルには、アップロードしたすべてのパートの JSON 形式の情報が含まれています。parts.json ファイルには、マルチパートアップロードプロセスを完了するために必要な、パート番号や対応する ETag 値など、マルチパートアップロードの各パートについての重要な情報が含まれています。

  2. 任意のテキストエディタを使用するか、ターミナルで parts.json を開きます。以下は出力の例です。

    { "Parts": [ { "PartNumber": 1, "ETag": "\"3c3097f89e2a2fece47ac54b243c9d97\"", "ChecksumSHA256": "fTPVHfyNHdv5VkR4S3EewdyioXECv7JBxN+d4FXYYTw=" }, { "PartNumber": 2, "ETag": "\"03c71cc160261b20ab74f6d2c476b450\"", "ChecksumSHA256": "VDWTa8enjOvULBAO3W2a6C+5/7ZnNjrnLApa1QVc3FE=" }, { "PartNumber": 3, "ETag": "\"81ae0937404429a97967dffa7eb4affb\"", "ChecksumSHA256": "cVVkXehUlzcwrBrXgPIM+EKQXPUvWist8mlUTCs4bg8=" } ] }

ステップ 6: マルチアップロードを完了する

マルチパートアップロードのすべてのパートをアップロードして一覧表示した後の最後のステップは、マルチパートアップロードを完了することです。このステップでは、アップロードしたすべてのパートを S3 バケット内の単一のオブジェクトにマージします。

注記

リクエストに --checksum-sha256 を含めることで、complete-multipart-upload を呼び出す前にオブジェクトのチェックサムを計算できます。チェックサムが一致しない場合、リクエストは Amazon S3 で失敗します。詳細については、AWS Command Line Interface ユーザーガイドの complete-multipart-uploadを参照してください。

マルチパートアップロードを完了するには

マルチパートアップロードを最終化するには、complete-multipart-upload コマンドを使用します。このコマンドには、ステップ 5 で作成した parts.json ファイル、バケット名、アップロード ID が必要です。<amzn-s3-demo-bucket1> は実際のバケット名、<your-upload-id>parts.json のアップロード ID に置き換えます。

aws s3api complete-multipart-upload --multipart-upload file://parts.json --bucket amzn-s3-demo-bucket1 --key 'census_data_file' --upload-id <your-upload-id>

以下は出力の例です。

{ "ServerSideEncryption": "AES256", "Location": "https://amzn-s3-demo-bucket1.s3.us-east-2.amazonaws.com/census_data_file", "Bucket": "amzn-s3-demo-bucket1", "Key": "census_data_file", "ETag": "\"f453c6dccca969c457efdf9b1361e291-3\"", "ChecksumSHA256": "aI8EoktCdotjU8Bq46DrPCxQCGuGcPIhJ51noWs6hvk=-3" }
注記

この時点では、個別のパートファイルの削除は行いません。マージ後のオブジェクトの整合性を検証するためにチェックサムを実行するには、個別のパートが必要です。

ステップ 7: オブジェクトがバケットにアップロードされていることを確認する

マルチパートアップロードが完了したら、オブジェクトが S3 バケットに正常にアップロードされたことを確認できます。バケット内のオブジェクトを一覧表示して、新しくアップロードされたファイルが存在することを確認するには、 list-objects-v2 コマンドを使用します。

アップロードしたオブジェクトを一覧表示するには

バケット内のオブジェクトを一覧表示するには、list-objects-v2 コマンドを使用します。次の amzn-s3-demo-bucket1 は、実際のバケット名に置き換えます。

aws s3api list-objects-v2 --bucket amzn-s3-demo-bucket1

このコマンドは、バケット内のオブジェクトの一覧を返します。オブジェクトの一覧で、アップロードしたファイル (census_data_file など) を検索します。

詳細については、「AWS Command Line Interface ユーザーガイド」の「list-objects-v2 コマンドの例」セクションを参照してください。

ステップ 8: MD5 チェックサムを使用してオブジェクトの整合性を検証する

オブジェクトをアップロードする際に、Amazon S3 が使用するチェックサムのアルゴリズムを指定できます。デフォルトでは、Amazon S3 は複数のバイトの MD5 ダイジェストをオブジェクトの ETag として保存します。マルチパートアップロードの場合、ETag はオブジェクト全体のチェックサムではなく、個別のパートのチェックサムの複合体です。

MD5 チェックサムを使用してオブジェクトの整合性を検証するには
  1. アップロードしたオブジェクトの ETag を取得するには、次のとおり head-object リクエストを実行します。

    aws s3api head-object --bucket amzn-s3-demo-bucket1 --key census_data_file

    以下は出力の例です。

    { "AcceptRanges": "bytes", "LastModified": "2024-07-26T19:04:13+00:00", "ContentLength": 16106127360, "ETag": "\"f453c6dccca969c457efdf9b1361e291-3\"", "ContentType": "binary/octet-stream", "ServerSideEncryption": "AES256", "Metadata": {} }

    このタグの末尾には「-3」が追加されています。これは、このオブジェクトがマルチパートアップロードを使用して 3 つのパートでアップロードされたことを意味します。

  2. 次に、md5sum コマンドを使用して各パートの MD5 チェックサムを計算します。パートファイルへの適切なパスを指定する必要があります。

    md5sum census-part*

    以下は出力の例です。

    e611693805e812ef37f96c9937605e69 census-part00 63d2d5da159178785bfd6b6a5c635854 census-part01 95b87c7db852451bb38b3b44a4e6d310 census-part02
  3. このステップでは、MD5 ハッシュを手動で単一の文字列にまとめます。次に、以下のコマンドを実行して、文字列をバイナリに変換し、バイナリ値の MD5 チェックサムを計算します。

    echo "e611693805e812ef37f96c9937605e6963d2d5da159178785bfd6b6a5c63585495b87c7db852451bb38b3b44a4e6d310" | xxd -r -p | md5sum

    以下は出力の例です。

    f453c6dccca969c457efdf9b1361e291 -

    このハッシュ値は、census_data_file オブジェクトの整合性を検証する ステップ 1 の元の ETag 値のハッシュ値と一致する必要があります。

追加のチェックサムを使用するように Amazon S3 に指示すると、Amazon S3 は各パートのチェックサム値を計算し、その値を保存します。マルチパートアップロード処理中の個別のパートのチェックサム値を取得する場合は、list-parts を使用できます。

マルチパートアップロードオブジェクトでのチェックサムの動作の詳細については、「オブジェクトの整合性をチェックする」を参照してください。

ステップ 9: 追加のチェックサムを使用してオブジェクトの整合性を検証する

このチュートリアルでは、オブジェクトの整合性を検証するための追加のチェックサムとして、このステップで SHA-256 を使用します。別の追加のチェックサムを使用した場合は、代わりにそのチェックサム値を使用します。

SHA256 チェックサムを使用してオブジェクトの整合性を検証するには
  1. ターミナルで --checksum-mode enabled 引数を含む次のコマンドを実行して、オブジェクトの ChecksumSHA256 値を表示します。

    aws s3api head-object --bucket amzn-s3-demo-bucket1 --key census_data_file --checksum-mode enabled

    以下は出力の例です。

    { "AcceptRanges": "bytes", "LastModified": "2024-07-26T19:04:13+00:00", "ContentLength": 16106127360, "ChecksumSHA256": "aI8EoktCdotjU8Bq46DrPCxQCGuGcPIhJ51noWs6hvk=-3", "ETag": "\"f453c6dccca969c457efdf9b1361e291-3\"", "ContentType": "binary/octet-stream", "ServerSideEncryption": "AES256", "Metadata": {} }
  2. 次のコマンドを使用して、個別のパートの ChecksumSHA256 値を base64 にデコードし、outfile という名前のバイナリファイルに保存します。これらの値は parts.json ファイルにあります。base64 文字列の例を実際の ChecksumSHA256 値に置き換えます。

    echo "QLl8R4i4+SaJlrl8ZIcutc5TbZtwt2NwB8lTXkd3GH0=" | base64 --decode >> outfile echo "xCdgs1K5Bm4jWETYw/CmGYr+m6O2DcGfpckx5NVokvE=" | base64 --decode >> outfile echo "f5wsfsa5bB+yXuwzqG1Bst91uYneqGD3CCidpb54mAo=" | base64 --decode >> outfile
  3. 次のコマンドを実行して、outfile の SHA256 チェックサムを計算します。

    sha256sum outfile

    以下は出力の例です。

    688f04a24b42768b6353c06ae3a0eb3c2c50086b8670f221279d67a16b3a86f9 outfile

    次のステップでは、ハッシュ値を取得して、バイナリ値に変換します。このバイナリ値は、ステップ 1 のチェックサムの ChecksumSHA256 値と一致する必要があります。

  4. ステップ 3 の SHA256 チェックサムをバイナリに変換し、これを base64 にエンコードして、ステップ 1ChecksumSHA256 値と一致することを検証します。

    echo "688f04a24b42768b6353c06ae3a0eb3c2c50086b8670f221279d67a16b3a86f9" | xxd -r -p | base64

    以下は出力の例です。

    aI8EoktCdotjU8Bq46DrPCxQCGuGcPIhJ51noWs6hvk=

    この出力は、base64 出力が head-object コマンド出力からの ChecksumSHA256 値と一致することを確認します。この出力がチェックサム値と一致すれば、このオブジェクトは有効です。

重要
  • 追加のチェックサムを使用するように Amazon S3 に指示すると、Amazon S3 は各パートのチェックサム値を計算し、その値を保存します。

  • マルチパートアップロード処理中の個別のパートのチェックサム値を取得する場合は、list-parts コマンドを使用できます。

ステップ 10: リソースをクリーンアップする

このチュートリアルで作成したファイルをクリーンアップする場合は、次の方法を使用します。S3 バケットにアップロードしたファイルを削除する手順については、「Amazon S3 オブジェクトの削除」を参照してください。

ステップ 1 で作成したローカルファイルを削除する:

マルチパートアップロードのために作成したファイルを削除するには、作業ディレクトリから次のコマンドを実行します。

rm census-data.bin census-part* outfile parts.json