Я хотел бы понять, почему это может произойти и как заставить клиентскую сторону более надежным.
Код: Выделить всё
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
Мобильная версия