Android: прерывание 404 Nosuchkey при загрузке одного и того же объекта S3 от Android (AWS SDK V2)Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Android: прерывание 404 Nosuchkey при загрузке одного и того же объекта S3 от Android (AWS SDK V2)

Сообщение Anonymous »

Я использую AWS SDK для Java V2 на Android для загрузки аудиофайлов .AAC из ковша S3. Для того же ключа загрузки периодически терпят неудачу с Nosuchkey (404). Если я снова открою приложение или попробую позже, тот же ключ работает без каких-либо изменений. < /P>
Я хотел бы понять, почему это может произойти и как заставить клиентскую сторону более надежным.

Код: Выделить всё

Android 15 (SDK 35), POCO device
AWS SDK for Java v2 (S3): 2.x.x
Bucket region: eu-west-1 (client configured to the same region)
IAM: read access to the audio prefix
< /code>
ошибка (пример): < /p>
software.amazon.awssdk.services.s3.model.NoSuchKeyException: The specified key does not exist.
Service: S3, Status Code: 404, Request ID: MCZP4XMJHPPPQHFT, Extended Request ID: ygGBV...
Мой метод получения:

Код: Выделить всё

fun getObjectBytes(bucketName: String, keyName: String, folder: String): Boolean {
try {
val aws = AWSConnection()
val objectRequest = GetObjectRequest
.builder()
.key("$folder/$keyName")
.bucket(bucketName)
.build()

val objectBytes = aws.s3Client.getObjectAsBytes(objectRequest)
val data = objectBytes.asByteArray()
writeToLocal(data, keyName)
return true
} catch (e: IOException) {
e.logException()
return false
} catch (e: S3Exception) {
e.logException()
return false
} catch (e: Exception) {
e.logException()
return false
}
}
Как это назвать:

Код: Выделить всё

private fun downloadAudio(uri: Uri, audioFilename: String, s3Folder: String){
if (!Http.isOnline){
confirmInternetConnection(uri, audioFilename, s3Folder)
}else{
val taskRunner = TaskRunner()
taskRunner.executeAsync(DownloadAudioTask(s3Service, audioFilename, s3Folder)) { fileGet: Boolean ->
if (!fileGet){
alertCannotGetFile()
}else{
playAudio(uri)
}
}
}
}

class DownloadAudioTask(
private val s3Service: IS3StorageService,
private val filename: String,
private val s3Folder: String) : Callable {
override fun call(): Boolean {
return s3Service.getObjectBytes(props.aws.s3.audioBucketName, filename, s3Folder)
}
}
Что я уже пробовал:

Код: Выделить всё

Retries with exponential backoff + jitter (up to 5 attempts) → when it fails, it fails for all immediate retries.

Prior headObject → sometimes GET fails even if HEAD didn’t throw.

Key normalization (avoid //, trim spaces, NFC for Unicode).

Single S3Client instance and fixed region (no per-call client creation).

Verified the GET is always using the exact key "$folder/$fileName".
Что я ищу
Вероятные причины периодического появления NoSuchKey для одного и того же ключа (например, управление версиями сегмента с маркером удаления как самого последнего, ограничения префикса IAM, маскирующиеся под 404, несоответствие регионов и т. д.).
Любая диагностика на основе CLI или идентификатора запроса, которую мне следует использовать
Что может привести к тому, что S3 периодически возвращает 404 NoSuchKey для одного и того же ключа и какой наиболее надежный подход на стороне клиента (Android, AWS SDK v2) позволяет предотвратить это — в идеале без изменения серверной части?>

Подробнее здесь: https://stackoverflow.com/questions/797 ... t-from-and
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»