私の Android アプリは、AWS Java SDK を使用してユーザーの写真を S3 にアップロードします。
ユーザーの電話の時計がずれていると、すべての転送が失敗します。これは、S3 の十分に文書化された側面です。
http://aws.amazon.com/articles/1109?_encoding=UTF8&jiveRedirect=1#04
アップストリームの S3 サービスがこのエラーを非常に明確に報告しているようです。
HTTP ステータス コード: 403 禁止
エラー コード: RequestTimeToo-Skewed
説明: 要求時間とサーバー時間の差が大きすぎます。
ただし、Java SDK を使用すると、有益な 403 コードが失われたように見えます...そして、通過する不透明な「TransferState.Failed」しかありません (これは、インターネット接続が失われた場合と同じエラーです。など)。
ドキュメントからわかる限り:
http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/index.html http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/transfer/TransferProgress .html http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/transfer/Transfer.TransferState.html http://docs.aws.amazon.com/AWSJavaSDK/latest /javadoc/com/amazonaws/services/s3/transfer/Upload.html
転送の失敗に関する追加の「RequestTimeToo-Skewed」メタデータを取得する方法はありません。
私はそれを見逃していますか?Amazon の Java SDK を使用して S3 転送が失敗した場合に、追加のエラー情報を取得する方法はありますか?
更新 #1: コメント投稿者は、2 つの点を明確にする必要があることを親切に強調しました。
- 私は実際に AWS SDK for Android を使用しています (これは Java SDK に非常に似ているように見えますが、それでも異なります)。
- TransferManager クラスを使用してアップロードを実行しています。どうやら、これは低レベルの AmazonS3Client をラップする高レベルのクラスであり、この低レベルのクラスは必要なエラー レポートを公開する必要がありますが、TransferManager と AmazonS3Client の間に含まれる正確なトレードオフについてはまだ調査中です。私が知る限り、(同期) AmazonS3Client.putObjectRequest を介して進行状況情報を取得する方法はありません。これは私にとってブロッカーになります...
更新 #2: ここに立ち寄って私を助けてくれた (AWS SDK チームの) Jason に心から感謝します。実際、特定のメソッドを使用すると、重要な情報は AmazonS3Exception のプロパティとして利用できます。ドキュメントはもともと私を混乱させ、ステータスをポーリングするには手動の Thread.sleep() ループが必要だと思っていました (したがって、waitForCompletion または waitForException を活用できませんでした)。しかし、PutObjectRequest で ProgressListener を使用すると、完全な進行状況のコールバックとAmazonS3Exception のエラー忠実度。