Azure ストレージ アカウントのクライアント アプリケーション エラーのトラブルシューティング

この記事は、Azure Monitor でメトリック、 クライアント側ログ、およびリソース ログを使用して、クライアント アプリケーションエラーを調査するのに役立ちます。

エラーの診断

アプリケーションのユーザーは、クライアント アプリケーションによって報告されたエラーを通知することがあります。 また、Azure Monitor では、NetworkErrorClientTimeoutErrorAuthorizationError など、ストレージ サービスのさまざまな応答の種類 (ResponseType ディメンション) の数も記録されます。 Azure Monitor ではさまざまなエラーの種類の数のみが記録されますが、サーバー側、クライアント側、およびネットワーク ログを調べることで、個々の要求に関する詳細を取得できます。 通常、ストレージ サービスによって返される HTTP 状態コードは、要求が失敗した理由を示します。

注:

断続的なエラーが発生する可能性があることに注意してください。 たとえば、一時的なネットワーク状態やアプリケーション エラーによるエラーなどです。

次のリソースは、ストレージ関連の状態とエラー コードを理解するのに役立ちます。

クライアントが HTTP 403 (禁止) メッセージを受信している

クライアント アプリケーションが HTTP 403 (禁止) エラーをスローしている場合、クライアントがストレージ要求を送信するときに期限切れの Shared Access Signature (SAS) を使用している可能性があります (ただし、その他の原因にはクロック スキュー、無効なキー、空のヘッダーが含まれます)。

.NET 用ストレージ クライアント ライブラリを使用すると、アプリケーションによって実行されるストレージ操作に関連するクライアント側のログ データを収集できます。 詳細については、「 .NET Storage クライアント ライブラリを使用したクライアント側のログ記録」を参照してください。

次の表は、ストレージ クライアント ライブラリによって生成されたクライアント側ログのサンプルを示しています。この問題が発生していることを示します。

ソース 詳細 詳細 クライアント要求 ID 操作テキスト
Microsoft.Azure.Storage 情報 3 85d077ab-... Starting operation with location Primary per location mode PrimaryOnly.
Microsoft.Azure.Storage 情報 3 85d077ab -... Starting synchronous request to <https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Synchronous_and_Asynchronous_Requests#Synchronous_request>
Microsoft.Azure.Storage 情報 3 85d077ab -... Waiting for response.
Microsoft.Azure.Storage 警告 2 85d077ab -... Exception thrown while waiting for response: The remote server returned an error: (403) Forbidden.
Microsoft.Azure.Storage 情報 3 85d077ab -... Response received. Status code = 403, Request ID = <Request ID>, Content-MD5 = , ETag = .
Microsoft.Azure.Storage 警告 2 85d077ab -... Exception thrown during the operation: The remote server returned an error: (403) Forbidden..
Microsoft.Azure.Storage 情報 3 85d077ab -... Checking if the operation should be retried. Retry count = 0, HTTP status code = 403, Exception = The remote server returned an error: (403) Forbidden..
Microsoft.Azure.Storage 情報 3 85d077ab -... The next location has been set to Primary, based on the location mode.
Microsoft.Azure.Storage Error 1 85d077ab -... Retry policy did not allow for a retry. Failing with The remote server returned an error: (403) Forbidden.

このシナリオでは、クライアントがサーバーにトークンを送信する前に、SAS トークンの有効期限が切れている理由を調査する必要があります。

  • 通常、クライアントがすぐに使用する SAS を作成するときに開始時刻を設定しないでください。 現在の時刻を使用して SAS を生成するホストとストレージ サービスの間に小さなクロックの違いがある場合は、ストレージ サービスがまだ有効ではない SAS を受け取る可能性があります。

  • SAS で非常に短い有効期限を設定しないでください。 ここでも、SAS を生成するホストとストレージ サービスの間の小さなクロックの違いにより、予期したよりも早く SAS の有効期限が切れる可能性があります。

  • SAS キーの version パラメーター (=2015-04-05 など) は、 sv使用しているストレージ クライアント ライブラリのバージョンと一致しますか? 常に最新バージョンのストレージ クライアント ライブラリを使用することをお勧めします。

  • ストレージ アクセス キーを再生成すると、既存の SAS トークンが無効になる可能性があります。 この問題は、クライアント アプリケーションがキャッシュするために有効期限が長い SAS トークンを生成する場合に発生する可能性があります。

ストレージ クライアント ライブラリを使用して SAS トークンを生成する場合は、有効なトークンを簡単に作成できます。 ただし、Storage REST API を使用して SAS トークンを手動で構築する場合は、「 Shared Access Signature を使用したアクセスの委任」を参照してください。

クライアントが HTTP 404 (見つかりません) メッセージを受信している

クライアント アプリケーションがサーバーから HTTP 404 (見つかりません) メッセージを受信した場合、これは、クライアントが使用しようとしているオブジェクト (エンティティ、テーブル、BLOB、コンテナー、キューなど) がストレージ サービスに存在しないことを意味します。 これには、次のようないくつかの理由が考えられます。

  • クライアントまたは別のプロセスが以前にオブジェクトを削除しました。

  • Shared Access Signature (SAS) 承認の問題。

  • クライアント側の JavaScript コードには、オブジェクトにアクセスするためのアクセス許可がありません。

  • ネットワーク障害。

以前にオブジェクトを削除したクライアントまたは別のプロセス

クライアントがストレージ サービス内のデータの読み取り、更新、または削除を試みるシナリオでは、ストレージ サービスから対象のオブジェクトを削除した以前の操作をストレージ リソース ログで簡単に特定できます。 多くの場合、ログ データは、別のユーザーまたはプロセスがオブジェクトを削除したことを示します。 Azure Monitor ログ (サーバー側) には、クライアントがオブジェクトを削除したタイミングが表示されます。

クライアントがオブジェクトを挿入しようとしているシナリオでは、クライアントが新しいオブジェクトを作成していることを考えると、HTTP 404 (見つかりません) 応答が発生する理由はすぐには明らかでない場合があります。 ただし、クライアントが BLOB を作成している場合は、BLOB コンテナーを見つけることができる必要があります。 クライアントがメッセージを作成している場合は、キューを検索できる必要があります。 また、クライアントが行を追加している場合は、テーブルを検索できる必要があります。

ストレージ クライアント ライブラリのクライアント側ログを使用して、クライアントがストレージ サービスに特定の要求を送信するタイミングを理解できます。

ストレージ クライアント ライブラリによって生成される次のクライアント側ログは、クライアントが作成している BLOB のコンテナーが見つからない場合の問題を示しています。 このログには、次のストレージ操作の詳細が含まれています。

リクエスト ID 操作
07b26a5d-... DeleteIfExists メソッドを使用して BLOB コンテナーを削除します。 この操作には、コンテナーの存在をチェックするためのHEAD要求が含まれます。
e2d06d78... CreateIfNotExists メソッドを使用して BLOB コンテナーを作成します。 この操作には、 HEAD コンテナーの存在を確認する要求が含まれます。 は HEAD 404 メッセージを返しますが、続行します。
de8b1c3c-... UploadFromStream メソッドを使用して BLOB を作成します。 要求が PUT 404 メッセージで失敗する

ログ エントリ:

リクエスト ID 操作テキスト
07b26a5d-... Starting synchronous request to https://domemaildist.blob.core.windows.net/azuremmblobcontainer.
07b26a5d-... StringToSign = HEAD............x-ms-client-request-id:07b26a5d-....x-ms-date:Tue, 03 Jun 2014 10:33:11 GMT.x-ms-version:2014-02-14./domemaildist/azuremmblobcontainer.restype:container.
07b26a5d-... Waiting for response.
07b26a5d-... Response received. Status code = 200, Request ID = eeead849-...Content-MD5 = , ETag = &quot;0x8D14D2DC63D059B&quot;.
07b26a5d-... Response headers were processed successfully, proceeding with the rest of the operation.
07b26a5d-... Downloading response body.
07b26a5d-... Operation completed successfully.
07b26a5d-... Starting synchronous request to https://domemaildist.blob.core.windows.net/azuremmblobcontainer.
07b26a5d-... StringToSign = DELETE............x-ms-client-request-id:07b26a5d-....x-ms-date:Tue, 03 Jun 2014 10:33:12 GMT.x-ms-version:2014-02-14./domemaildist/azuremmblobcontainer.restype:container.
07b26a5d-... Waiting for response.
07b26a5d-... Response received. Status code = 202, Request ID = 6ab2a4cf-..., Content-MD5 = , ETag = .
07b26a5d-... Response headers were processed successfully, proceeding with the rest of the operation.
07b26a5d-... Downloading response body.
07b26a5d-... Operation completed successfully.
e2d06d78-... Starting asynchronous request to https://domemaildist.blob.core.windows.net/azuremmblobcontainer.
e2d06d78-... StringToSign = HEAD............x-ms-client-request-id:e2d06d78-....x-ms-date:Tue, 03 Jun 2014 10:33:12 GMT.x-ms-version:2014-02-14./domemaildist/azuremmblobcontainer.restype:container.
e2d06d78-... Waiting for response.
de8b1c3c-... Starting synchronous request to https://domemaildist.blob.core.windows.net/azuremmblobcontainer/blobCreated.txt.
de8b1c3c-... StringToSign = PUT...64.qCmF+TQLPhq/YYK50mP9ZQ==........x-ms-blob-type:BlockBlob.x-ms-client-request-id:de8b1c3c-....x-ms-date:Tue, 03 Jun 2014 10:33:12 GMT.x-ms-version:2014-02-14./domemaildist/azuremmblobcontainer/blobCreated.txt.
de8b1c3c-... Preparing to write request data.
e2d06d78-... Exception thrown while waiting for response: The remote server returned an error: (404) Not Found..
e2d06d78-... Response received. Status code = 404, Request ID = 353ae3bc-..., Content-MD5 = , ETag = .
e2d06d78-... Response headers were processed successfully, proceeding with the rest of the operation.
e2d06d78-... Downloading response body.
e2d06d78-... Operation completed successfully.
e2d06d78-... Starting asynchronous request to https://domemaildist.blob.core.windows.net/azuremmblobcontainer.
e2d06d78-... StringToSign = PUT...0.........x-ms-client-request-id:e2d06d78-....x-ms-date:Tue, 03 Jun 2014 10:33:12 GMT.x-ms-version:2014-02-14./domemaildist/azuremmblobcontainer.restype:container.
e2d06d78-... Waiting for response.
de8b1c3c-... Writing request data.
de8b1c3c-... Waiting for response.
e2d06d78-... Exception thrown while waiting for response: The remote server returned an error: (409) Conflict..
e2d06d78-... Response received. Status code = 409, Request ID = c27da20e-..., Content-MD5 = , ETag = .
e2d06d78-... Downloading error response body.
de8b1c3c-... Exception thrown while waiting for response: The remote server returned an error: (404) Not Found..
de8b1c3c-... Response received. Status code = 404, Request ID = 0eaeab3e-..., Content-MD5 = , ETag = .
de8b1c3c-... Exception thrown during the operation: The remote server returned an error: (404) Not Found..
de8b1c3c-... Retry policy did not allow for a retry. Failing with The remote server returned an error: (404) Not Found..
e2d06d78-... Retry policy did not allow for a retry. Failing with The remote server returned an error: (409) Conflict..

この例では、ログは、クライアントがメソッドからの CreateIfNotExists 要求 (要求 ID e2d06d78....) とメソッドからの UploadFromStream 要求 (de8b1c3c-...) をインターリーブしていることを示しています。このインターリーブは、クライアント アプリケーションがこれらのメソッドを非同期的に呼び出しているために発生します。 クライアントの非同期コードを変更して、コンテナー内の BLOB にデータをアップロードする前にコンテナーが作成されるようにします。 理想的には、すべてのコンテナーを事前に作成する必要があります。

Shared Access Signature (SAS) 承認の問題

クライアント アプリケーションが操作に必要なアクセス許可を含まない SAS キーを使用しようとすると、ストレージ サービスは HTTP 404 (見つかりません) メッセージをクライアントに返します。 同時に、Azure Monitor メトリックには、ResponseType ディメンションの AuthorizationError も表示されます。

クライアント アプリケーションにアクセス許可が付与されていない操作を実行しようとしている理由を調査します。

クライアント側の JavaScript コードには、オブジェクトにアクセスするためのアクセス許可がありません

JavaScript クライアントを使用していて、ストレージ サービスが HTTP 404 メッセージを返している場合は、ブラウザーで次の JavaScript エラーをチェックします。

SEC7120: Access-Control-Allow-Origin http://localhost:56309 ヘッダーに配信元が見つかりません。
SCRIPT7002: XMLHttpRequest: ネットワーク エラー 0x80070005、アクセスは拒否されます。

注:

クライアント側の JavaScript の問題をトラブルシューティングするときに、インターネット エクスプローラーの F12 Developer Tools を使用して、ブラウザーとストレージ サービスの間で交換されたメッセージをトレースできます。

これらのエラーは、Web ブラウザーが 同じ配信元ポリシー のセキュリティ制限を実装しているために発生します。これにより、Web ページがページの元のドメインとは異なるドメイン内の API を呼び出すのを防ぎます。

JavaScript の問題を回避するには、クライアントがアクセスしているストレージ サービスのクロスオリジン リソース共有 (CORS) を構成します。 詳細については、「 Azure Storage Services のクロスオリジン リソース共有 (CORS) サポート」を参照してください。

次のコード サンプルは、Contoso ドメインで実行されている JavaScript が BLOB ストレージ サービス内の BLOB にアクセスできるように BLOB サービスを構成する方法を示しています。

var connectionString = Constants.connectionString;

 BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString);

 BlobServiceProperties sp = blobServiceClient.GetProperties();

 // Set the service properties.
 sp.DefaultServiceVersion = "2013-08-15";
 BlobCorsRule bcr = new BlobCorsRule();
 bcr.AllowedHeaders = "*";

 bcr.AllowedMethods = "GET,POST";
 bcr.AllowedOrigins = "http://www.contoso.com";
 bcr.ExposedHeaders = "x-ms-*";
 bcr.MaxAgeInSeconds = 5;
 sp.Cors.Clear();
 sp.Cors.Add(bcr);
 blobServiceClient.SetProperties(sp);

ネットワーク エラー

状況によっては、ネットワーク パケットが失われると、ストレージ サービスが HTTP 404 メッセージをクライアントに返す可能性があります。 たとえば、クライアント アプリケーションがテーブル サービスからエンティティを削除している場合、クライアントは、テーブル サービスから "HTTP 404 (Not Found)" 状態メッセージを報告するストレージ例外をスローすることがわかります。 テーブル ストレージ サービス内のテーブルを調査すると、要求に応じてサービスによってエンティティが削除されたことがわかります。

クライアントの例外の詳細には、要求に対してテーブル サービスによって割り当てられた要求 ID (7e84f12d...) が含まれます。この情報を使用して、ログ エントリの 操作がどのように認証されたかを説明するフィールド を検索することで、Azure Monitor のストレージ リソース ログ内の要求の詳細を見つけることができます。 また、メトリックを使用して、このようなエラーが発生したタイミングを特定し、メトリックがこのエラーを記録した時刻に基づいてログ ファイルを検索することもできます。 このログ エントリは、削除が "HTTP (404) Client Other Error" 状態メッセージで失敗したことを示しています。 同じログ エントリには、列 (813ea74f...) に client-request-id クライアントによって生成された要求 ID も含まれています。

サーバー側ログには、同じエンティティと同じクライアントからの削除操作が成功した場合に、同じ client-request-id 値 (813ea74f...) を持つ別のエントリも含まれます。 この正常な削除操作は、失敗した削除要求の直前に行われました。

このシナリオの最も可能性の高い原因は、クライアントがエンティティの削除要求をテーブル サービスに送信したことです。この要求は成功しましたが、サーバーから受信確認を受け取りませんでした (一時的なネットワークの問題が原因である可能性があります)。 その後、クライアントは (同じ client-request-idを使用して) 操作を自動的に再試行し、エンティティが既に削除されているため、この再試行は失敗しました。

この問題が頻繁に発生する場合は、クライアントがテーブル サービスから受信確認を受信できない理由を調査する必要があります。 問題が断続的な場合は、"HTTP (404) Not Found" エラーをトラップし、クライアントにログを記録しますが、クライアントの続行を許可する必要があります。

クライアントが HTTP 409 (競合) メッセージを受信している

クライアントが BLOB コンテナー、テーブル、またはキューを削除すると、名前が再び使用可能になるまでの短い期間があります。 クライアント アプリケーションのコードが削除した後、同じ名前を使用して BLOB コンテナーを直ちに再作成した場合、 CreateIfNotExists メソッドは最終的に HTTP 409 (Conflict) エラーで失敗します。

削除/再作成パターンが一般的な場合、クライアント アプリケーションは新しいコンテナーを作成するたびに一意のコンテナー名を使用する必要があります。

メトリックは、トランザクション状態が ClientOtherErrors の操作を持つ低 PercentSuccess または分析ログ エントリを示します

Success の値と等しい ResponseType ディメンションは、HTTP 状態コードに基づいて成功した操作の割合をキャプチャします。 状態コードが 2XX の操作は成功としてカウントされますが、3XX、4XX、および 5XX の範囲の状態コードを持つ操作は失敗としてカウントされ、成功メトリック値は低くなります。 ストレージ リソース ログでは、これらの操作は ClientOtherError のトランザクション状態で記録されます。

これらの操作は正常に完了しているため、可用性などの他のメトリックには影響しません。 正常に実行されるが、HTTP 状態コードが失敗する可能性がある操作の例を次に示します。

  • ResourceNotFound (Not Found 404) (GET 要求から存在しない BLOB など)。
  • ResourceAlreadyExists (Conflict 409) (たとえば、リソースが既に存在する操作から CreateIfNotExist )。
  • ConditionNotMet (Not Modified 304) は、たとえば、クライアントが値を送信 ETag するときや、最後の操作以降に更新された場合にのみイメージを要求する HTTP If-None-Match ヘッダーなどの条件付き操作からです。

ストレージ サービスから返される一般的な REST API エラー コードの一覧については、 共通 REST API エラー コードに関するページを参照してください。

関連項目

お問い合わせはこちらから

質問がある場合やヘルプが必要な場合は、サポート要求を作成するか、Azure コミュニティ サポートにお問い合わせください。 Azure フィードバック コミュニティに製品フィードバックを送信することもできます。