Amazon S3 のトラブルシューティング - Amazon Simple Storage Service

このガイドは更新されていません。最新の情報と手順については、新しい Amazon S3 ユーザーガイドを参照してください。

Amazon S3 のトラブルシューティング

このセクションでは、Amazon S3 をトラブルシューティングする方法と、AWS サポートに連絡する際に必要なリクエスト ID を取得する方法について説明します。

症状別 Amazon S3 のトラブルシューティング

以下のトピックでは、Amazon S3 を使用する際に発生する可能性がある問題のトラブルシューティングに役立つ症状を示します。

バージョニングな有効なバケットへの Amazon S3 リクエストに対する HTTP 503 レスポンスが著しく増加する

HTTP 503 の数が著しく増加し、バージョニングを有効にしたバケットへの Amazon S3 PUT または DELETE オブジェクトリクエストに対して受信されるレスポンスが低下する場合は、数百万のバージョンがあるバケットに 1 つ以上のオブジェクトがある可能性があります。数百万のバージョンを持つオブジェクトがある場合、Amazon S3 は、過剰なリクエストトラフィックからお客様を保護するため (同じバケットに対して行われた他のリクエストを妨害する可能性があります)、バケットへのリクエストを自動的に調整します。

数百万のバージョンがある S3 オブジェクトを確認するには、Amazon S3 インベントリツールを使用します。インベントリツールは、バケット内のオブジェクトのフラットファイルリストを提供するレポートを生成します。詳細については、「 Amazon S3 インベントリ」を参照してください。

Amazon S3 チームでは、同じ S3 オブジェクトを繰り返し上書きし、そのオブジェクトに対して数百万のバージョンを作成する可能性のあるアプリケーションを調査して、アプリケーションが意図どおり動作しているかどうか調査することをお客様にお勧めしています。1 つ以上の S3 オブジェクトに対して数百万のバージョンを必要とするユースケースについては、AWS サポートの AWS サポートチームにご相談ください。当該ユースケースのシナリオに応じた最適なソリューションを判断できるよう当社がお手伝いをします。

この問題を回避するには、次のベストプラクティスを検討してください。

  • ライフサイクル管理の「NonCurrentVersion」有効期限ポリシーと「ExpiredObjectDeleteMarker」ポリシーを有効にして、以前のバージョンのオブジェクトを期限切れにし、バケット内に関連するデータオブジェクトが存在しないマーカーを削除します。

  • ディレクトリ構造をできるだけフラットにして、各ディレクトリ名を一意にします。

CORS によりバケットセットにアクセスするときの予期しない動作

Cross-Origin Resource Sharing (CORS) によるバケットへのアクセスの際に予期しない動作が発生する場合は、「CORS の問題のトラブルシューティング」を参照してください。

AWS サポートの Amazon S3 リクエスト ID の取得

Amazon S3 でエラーまたは予期しない動作が発生したために、AWS サポートに連絡する必要があるときは、失敗したアクションに関連するリクエスト ID を取得する必要があります。このリクエスト ID を取得することにより、AWS サポートは発生している問題を解決しやすくなります。リクエスト ID はペアになっていて、Amazon S3 が処理するすべての応答で返され (エラーの応答を含む)、詳細なログを通じてアクセスできます。リクエスト ID を取得するための一般的な方法がいくつかあります。たとえば、S3 アクセスログや CloudTrail イベント/データイベントなどがあります。

これらのログを回復したら、2 つの値をコピーして記録しておきます。この値は、AWS サポートに連絡するとき必要になります。AWS サポートへのお問い合わせの詳細については、「サポートへのお問い合わせ」を参照してください。

HTTP を使用したリクエスト ID の取得

ターゲットアプリケーションに到達する前に HTTP リクエストのビットを記録することで、リクエスト ID、x-amz-request-id、および x-amz-id-2 を取得することができます。HTTP リクエストの詳細なログを復元するために使用できる、さまざまなサードパーティー製ツールがあります。別の Amazon S3 HTTP リクエストを送信するにあたって、信頼しているツールを選択して実行し、Amazon S3 トラフィックが流れるポートをリッスンします。

HTTP リクエストの場合、リクエスト ID のペアは次の例のようになります。

x-amz-request-id: 79104EXAMPLEB723 x-amz-id-2: IOWQ4fDEXAMPLEQM+ey7N9WgVhSnQ6JEXAMPLEZb7hSQDASK+Jd1vEXAMPLEa3Km
注記

HTTPS リクエストで暗号化され、ほとんどのパケットキャプチャで非表示になります。

ウェブブラウザを使用したオブジェクトリクエスト ID の取得

ほとんどのウェブブラウザには、リクエストヘッダーを確認できるようにする開発者ツールがあります。

ウェブブラウザに基づくリクエストでエラーが返される場合、リクエスト ID のペアは次の例のようになります。

<Error><Code>AccessDenied</Code><Message>Access Denied</Message> <RequestId>79104EXAMPLEB723</RequestId><HostId>IOWQ4fDEXAMPLEQM+ey7N9WgVhSnQ6JEXAMPLEZb7hSQDASK+Jd1vEXAMPLEa3Km</HostId></Error>

成功したリクエストからリクエスト ID のペアを取得するには、開発者ツールを使用して、HTTP レスポンスヘッダーを表示する必要があります。特定のブラウザ用の開発者ツールの詳細については、AWS 開発者フォーラムの「Amazon S3 のトラブルシューティング - S3 リクエスト ID の復旧方法」を参照してください。

AWS SDK を使用したリクエスト ID の取得

以下のセクションでは、AWS SDK を使用したログ記録の設定に関する情報を示します。すべてのリクエストと応答で詳細ログを有効にすることができますが、大きなリクエスト/応答はアプリケーションで大幅な遅延を発生させる可能性があるため、本稼働システムではログ記録を有効にしないでください。

AWS SDK リクエストの場合、リクエスト ID のペアは次の例のようになります。

Status Code: 403, AWS Service: Amazon S3, AWS Request ID: 79104EXAMPLEB723 AWS Error Code: AccessDenied AWS Error Message: Access Denied S3 Extended Request ID: IOWQ4fDEXAMPLEQM+ey7N9WgVhSnQ6JEXAMPLEZb7hSQDASK+Jd1vEXAMPLEa3Km

SDK for PHP を使用したリクエスト ID の取得

ログ記録の設定は、PHP を使って行うことができます。詳細については、AWS SDK for PHP のよくある質問で「送信されるデータを表示する方法」を参照してください。

SDK for Java を使用したリクエスト ID の取得

特定のリクエストまたは応答のログ記録を有効にすることができます。これにより、関連するヘッダーのみを取得して返すことができます。これを行うには、com.amazonaws.services.s3.S3ResponseMetadata クラスをインポートします。その後、実際のリクエストを実行する前に変数にリクエストを保存できます。記録されたリクエストまたは応答を取得するには、getCachedResponseMetadata(AmazonWebServiceRequest request).getRequestID() を呼び出します。

PutObjectRequest req = new PutObjectRequest(bucketName, key, createSampleFile()); s3.putObject(req); S3ResponseMetadata md = s3.getCachedResponseMetadata(req); System.out.println("Host ID: " + md.getHostId() + " RequestID: " + md.getRequestId());

または、Java のすべてのリクエストと応答の詳細ログ記録を使用できます。詳細については、AWS SDK for Java 開発者ガイドの「AWS SDK for Java の呼び出しの記録」トピックの「詳細なワイヤログ記録」を参照してください。

AWS SDK for .NET を使用したリクエスト ID の取得

組み込みの System.Diagnostics ログ作成ツールを使用して、AWS SDK for .NET のログ記録を設定できます。詳細については、AWS 開発者ブログの投稿「AWS SDK for .NET でログを記録する」を参照してください。

注記

デフォルトでは、返されたログにはエラー情報のみが含まれます。リクエスト ID を取得するには、設定ファイルに AWSLogMetrics (およびオプションで AWSResponseLogging) を追加する必要があります。

SDK for Python (Boto3) を使用したリクエスト ID の取得

SDK for Python (Boto3) を使用すると、特定の応答をログに記録できます。これにより、関連するヘッダーのみのキャプチャが可能になります。次のコードは、レスポンスの一部をファイルに記録する方法を示しています。

import logging import boto3 logging.basicConfig(filename='logfile.txt', level=logging.INFO) logger = logging.getLogger(__name__) s3 = boto3.resource('s3') response = s3.Bucket(bucket_name).Object(object_key).put() logger.info("HTTPStatusCode: %s", response['ResponseMetadata']['HTTPStatusCode']) logger.info("RequestId: %s", response['ResponseMetadata']['RequestId']) logger.info("HostId: %s", response['ResponseMetadata']['HostId']) logger.info("Date: %s", response['ResponseMetadata']['HTTPHeaders']['date'])

例外を発生時にキャッチし、関連情報をログに記録することもできます。詳細については、Boto3 開発者ガイドの「Discerning useful information from error responses」(エラー応答から有用な情報を識別する) を参照してください。

さらに、次のコードを使用して、詳細なデバッグログを出力するように Boto3 を構成できます。

import boto3 boto3.set_stream_logger('', logging.DEBUG)

詳細については、Boto3 リファレンスの「set_stream_logger」を参照してください。

SDK for Ruby を使用したリクエスト ID の取得

SDK for Ruby バージョン 1、バージョン 2、またはバージョン 3 を使用して、リクエスト ID を取得できます。

  • SDK for Ruby - バージョン 1 の使用 – 次のコードで、HTTP ワイヤログをグローバルに有効にすることができます。

    s3 = AWS::S3.new(:logger => Logger.new($stdout), :http_wire_trace => true)
  • SDK for Ruby - バージョン 2 またはバージョン 3 の使用 – 次のコードで、HTTP ワイヤログをグローバルに有効にすることができます。

    s3 = Aws::S3::Client.new(:logger => Logger.new($stdout), :http_wire_trace => true)

AWS CLI を使用したリクエスト ID の取得

コマンドに --debug を追加することで、AWS CLI でリクエスト ID を取得できます。

トラブルシューティングとサポートに関するその他のトピックについては、以下を参照してください。

サードパーティ製ツールに関するトラブルシューティング情報については、AWS 開発者フォーラムの「Amazon S3 リクエスト ID の取得」を参照してください。