Amazon Web Services ブログ

Amazon S3 における、新しいオブジェクトのためのデフォルトのデータ整合性保護のご紹介

Amazon Web Services (AWS) では、新機能の大部分がお客様からの直接のフィードバックを踏まえて実現されています。2 年前、Jeff は追加のチェックサムアルゴリズムと、オプションのクライアント側でのチェックサム計算を発表しました。これにより、Amazon S3 に保存されているオブジェクトが、送信したオブジェクトとまったく同じであることについて、確実を期すことができます。この追加の検証により、保存されているオブジェクトが、送信したオブジェクトであると確信できるため、この追加の検証機能を愛用しているという声をお寄せいただきました。また、この追加の検証が自動的に有効になり、追加のコードを開発する必要をなくしてもらいたいという声もいただきました。

12 月 1 日より、オブジェクトをアップロードする際の Amazon Simple Storage Service (Amazon S3) のデフォルト動作を更新します。高い耐久性を実現するための既存の体勢をさらに強化するため、Amazon S3 は、データがアプリケーションから S3 バケットにネットワーク経由で正しく送信されていることを自動的に検証するようになりました。

Amazon S3 は、99.999999999% のデータ耐久性 (イレブンナイン) を実現するように設計されています。Amazon S3 は、オブジェクトが複数のストレージデバイスに書き込まれる前に、サーバーに到達したときにチェックサムを計算することによって、オブジェクトアップロードの整合性を常に検証してきました。データが Amazon S3 に保存されると、保管中のデータの整合性チェックが定期的に実行され、時間が経過する中でデータの耐久性が継続的にモニタリングされます。また、Amazon S3 は、オブジェクトが複数のストレージデバイスの同時障害に耐えられることを検証するのに役立つよう、データの冗長性をアクティブにモニタリングします。

ただし、データはパブリックインターネットを通過してからサーバーに到達するため、整合性のリスクに直面する可能性があります。当社が管理していないネットワーク上のハードウェアの障害や、クライアントソフトウェアのバグなどの問題により、Amazon S3 が検証する前にデータが破損またはドロップされる可能性があります。以前は、PutObject または UploadPart リクエストで独自の事前計算済みチェックサムを提供することで、整合性保護を拡張できました。ただし、これにはチェックサムを生成して追跡するためのツールとアプリケーションの設定が必要であり、Amazon S3 にオブジェクトをアップロードするすべてのクライアントアプリケーションで一貫して実装するのは複雑になる可能性があります。

新しいデフォルト動作は、アプリケーションを変更することなく、既存のデータ整合性保護を強化します。さらに、新しいチェックサムはオブジェクトのメタデータに保存されるため、いつでも整合性検証のためにアクセスできます。

クライアント側の自動整合性保護
Amazon S3 は、デフォルトでデータ整合性保護をクライアント側のアプリケーションまで拡張するようになりました。最新バージョンの AWS SDK は、アップロードごとに巡回冗長検査 (CRC) ベースのチェックサムを自動的に計算し、Amazon S3 に送信します。Amazon S3 は、サーバー側でチェックサムを独自に計算し、指定された値に照らして検証してから、高い耐久性をもって、オブジェクトとそのチェックサムをオブジェクトのメタデータに保存します。

クライアントアプリケーションが CRC チェックサムを送信しない場合 (古いバージョンの SDK を使用しているか、アプリケーションのカスタムコードがまだ更新されていないことが原因である可能性があります)、Amazon S3 は CRC ベースのチェックサムを計算し、将来の参照用にオブジェクトのメタデータに保存します。後で、保存された CRC と、ユーザー側で計算された CRC を比較して、ネットワーク送信が正しかったことを検証できます。

この新しい機能により、最新バージョンの AWS SDK、AWS コマンドラインインターフェイス (AWS CLI)、および AWS マネジメントコンソールからの新しいアップロードについてのチェックサムの自動計算と検証が提供されます。また、オブジェクトのメタデータに保存されているチェックサムをいつでも検証できます。新しいデフォルトのデータ整合性保護は、既存の CRC32 および CRC32C アルゴリズム、または新しい CRC64NVME アルゴリズムを使用します。また、Amazon S3 は、シングルパートアップロードとマルチパートアップロードで一貫したフルオブジェクトチェックサムをデベロッパーに提供します。

マルチパートでファイルをアップロードする場合、SDK は各パートについてチェックサムを計算します。Amazon S3 はこれらのチェックサムを使用して、UploadPart API を通じて各パートの整合性を検証します。さらに、CompleteMultipartUpload API を呼び出すと、S3 はファイル全体のサイズとチェックサムを検証します。

CreateMultiPartUpload API では、使用するチェックサムのタイプを指定できるようにする、新しい HTTP ヘッダー x-amz-checksum-type が導入されています。完全なオブジェクトチェックサム (すべての個々のパーツのチェックサムを組み合わせて計算されます) または複合チェックサムのいずれかを選択できます。

完全なオブジェクトチェックサムは、将来の参照用にオブジェクトメタデータとともに保存されます。この新しい保護は、サーバー側の暗号化とシームレスに連携します。アップロード、マルチパートアップロード、ダウンロード、暗号化モード全体での一貫性のある動作により、クライアント側の整合性チェックが簡素化されます。完全なオブジェクトチェックサムを使用して整合性を検証し、後で使用するために保存する機能は、アプリケーションの効率化に役立ちます。

実際の動作
この追加の整合性保護の使用を開始するには、最新バージョンの AWS SDK または AWS CLI に更新します。新しい整合性保護を有効にするためにコードを変更する必要はありません。

ケース 1: チェックサムなしでオブジェクトがアップロードされた場合、Amazon S3 はサーバー側でオブジェクトにチェックサムをアタッチするようになりました

S3 バケットとの間でコンテンツをアップロードおよびダウンロードするためのシンプルな Python スクリプトを記述しました。Amazon S3 との間で送受信される実際の HTTP ヘッダーを確認するために、ログ記録の詳細度を最大にしました。

import boto3
import logging

BUCKET_NAME="aws-news-blog-20241111"
CONTENT='Hello World!'
OBJECT_NAME='test.txt'

# boto3 および botocore のデバッグログ記録を有効にして stdout に設定します (これは冗長です !!!)
logging.basicConfig(level=logging.DEBUG)

# S3 クライアントを作成します
client = boto3.client('s3')

# オブジェクトを配置します
client.put_object(Bucket=BUCKET_NAME, Key=OBJECT_NAME, Body=CONTENT)

# オブジェクトを取得します 
response = client.get_object(Bucket=BUCKET_NAME, Key=OBJECT_NAME)
print(response['Body'].read().decode('utf-8'))

このデモの最初のステップでは、クライアント側で CRC チェックサムを計算しない古い AWS SDK for Python を使用します。それにもかかわらず、ここでは Amazon S3 はオブジェクトの受信時に計算したチェックサムで応答するようになったことがわかります。

S3 RESPONSE:
{
    ...
    "x-amz-checksum-crc64nvme": "AuUcyF784aU=",
    "x-amz-checksum-type": "FULL_OBJECT",
    ...
}

ケース 2: 手動で事前計算された CRC64NVME チェックサム (新しいチェックサムタイプ) を使用してアップロードします

最新バージョンの AWS SDK を使用するオプションがない場合、または独自のコードを使用してオブジェクトを S3 バケットにアップロードする場合は、チェックサムを計算して、PutObject API リクエストで送信できます。Amazon S3 に送信する前にコンテンツのチェックサムを計算する方法を次に示します。このコードが短くなるよう、新しい AWS SDK for Python で使用できる checksums パッケージを使用します。

from awscrt import checksums
import base64

checksum = checksums.crc64nvme("Hello World!")
checksum_bytes = checksum.to_bytes(8, byteorder='big')  # CRC64 is 8 bytes
checksum_base64 = base64.b64encode(checksum_bytes)
print(checksum_base64)

これを実行すると、CRC64NVME チェックサムが、前のステップで Amazon S3 によって返されたものと同じであることがわかります。

$ python crc.py
b'AuUcyF784aU='

このチェックサムは、PutObject API コールの一部として提供できます。

response = s3.put_object(
    Bucket=BUCKET_NAME,
    Key=OBJECT_NAME,
    Body=b'Hello World!',
    ChecksumAlgorithm='CRC64NVME',
    ChecksumCRC64NVME=checksum_base64
)

ケース 3: 新しい SDK がクライアント側でのチェックサムを計算します

ここで、アップロードおよびダウンロードスクリプトを再度実行します。今回は、最新バージョンの AWS SDK for Python を使用します。SDK がリクエストで CRC ヘッダーを送信するようになったことがわかります。レスポンスにもチェックサムが含まれています。リクエストとレスポンスのバージョンを簡単に比較して、受信したオブジェクトが、送信したオブジェクトであることを確認できます。

REQUEST:
{
    ...
    "x-amz-checksum-crc64nvme": "AuUcyF784aU=",
    "x-amz-checksum-type": "FULL_OBJECT",
    ...
}

いつでも、HeadObject または GetObject API を使用して、ローカルコピーの整合性を検証するためにオブジェクトチェックサムをリクエストできます。

 get_response = s3.get_object(
        Bucket=BUCKET_NAME,
        Key=OBJECT_NAME,
        ChecksumMode='ENABLED'
    )

レスポンスオブジェクトには、HTTPHeaders フィールドにチェックサムが含まれています。

{
...
    "x-amz-checksum-crc64nvme": "AuUcyF784aU=",
    "x-amz-checksum-type": "FULL_OBJECT",
...
}

ケース 4: 新しい CRC ベースのオブジェクト全体のチェックサムを使用したマルチパートアップロード

CreateMultipartUploadUploadPart、および CompleteMultipartUpload API を使用して大きなオブジェクトをアップロードする場合、最新バージョンの SDK はチェックサムを自動的に計算します。

既知のコンテンツチェックサムを使用することによってデータの整合性を検証する場合は、マルチパートアップロードの CRC ベースのオブジェクト全体のチェックサムを事前に計算して、クライアント側のツールを簡素化できます。マルチパートアップロードのために完全なオブジェクトチェックサムを使用すると、オブジェクトをアップロードするときにパートレベルのチェックサムを追跡する必要がなくなります。


# フルオブジェクトについての事前計算済み CRC64NVME チェックサム
full_object_crc64_nvme_checksum = 'Naz0uXkYBPM='

# マルチパートアップロードを開始します
create_response = s3.create_multipart_upload(
            Bucket=BUCKET_NAME,
            Key=OBJECT_NAME,
            ChecksumAlgorithm='CRC64NVME',
            ChecksumType='FULL_OBJECT'
        )
upload_id = create_response['UploadId']

# パートをアップロードします
uploaded_parts = []

# パート 1
data_part_1 = b'0' * (5 * 1024 * 1024) # 最小パートサイズ
upload_part_response_1 = s3.upload_part(
    Body=data_part_1,
    Bucket=BUCKET_NAME,
    Key=OBJECT_NAME,
    PartNumber=1,
    UploadId=upload_id,
    ChecksumAlgorithm='CRC64NVME'
)
uploaded_parts.append({'PartNumber': 1, 'ETag': upload_part_response_1['ETag']})

# パート 2
data_part_2 = b'0' * (5 * 1024 * 1024)
upload_part_response_2 = s3.upload_part(
    Body=data_part_2,
    Bucket=BUCKET_NAME,
    Key=OBJECT_NAME,
    PartNumber=2,
    UploadId=upload_id,
    ChecksumAlgorithm='CRC64NVME'
)
uploaded_parts.append({'PartNumber': 2, 'ETag': upload_part_response_2['ETag']})

# FULL_OBJECT CRC64NVME チェックサムを使用してマルチパートアップロードを完了し、オブジェクト全体の整合性を検証します。
complete_response = s3.complete_multipart_upload(
            Bucket=BUCKET_NAME,
            Key=OBJECT_NAME,
            UploadId=upload_id,
            ChecksumCRC64NVME=full_object_crc64_nvme_checksum,
            ChecksumType='FULL_OBJECT',
            MultipartUpload={'Parts': uploaded_parts}
        )
print(complete_response)

知っておくべきこと
既存のオブジェクトの場合、コピー時にチェックサムが追加されます。CopyObject API を更新したので、宛先オブジェクトのために必要なチェックサムアルゴリズムを選択できます。

この新しいクライアント側のチェックサム計算は、最新バージョンの AWS SDK に実装されています。チェックサムを事前に計算しない古い SDK またはカスタムコードを使用する場合、Amazon S3 は受信したすべての新しいオブジェクトのチェックサムを計算し、マルチパートアップロードでもオブジェクトのメタデータに保存します。

料金と利用可能なリージョン
この拡張チェックサム計算とストレージは、すべての AWS リージョンで追加コストなしでご利用いただけます。

今すぐ AWS SDK と AWS CLI を更新して、転送中のデータのために、この追加の整合性保護の恩恵を自動的に享受しましょう。

Amazon S3 のデータ整合性保護の詳細については、「Amazon S3 ユーザーガイド」の「オブジェクトの整合性をチェックする」にアクセスしてください。

— seb

原文はこちらです。