Listing folders on S3

just trying to parse and display a whole bucket, i can't get rid off the message no suchKeyException which is odd ..

The code below is connecting and displaying to standard out:

 import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider import software.amazon.awssdk.regions.Region import software.amazon.awssdk.services.s3.S3Client import software.amazon.awssdk.services.s3.model.EncodingType import software.amazon.awssdk.services.s3.model.ListObjectsV2Request import software.amazon.awssdk.services.s3.model.ListObjectsV2Response import software.amazon.awssdk.services.s3.paginators.ListObjectsV2Iterable import java.net.URI internal class S3ObjectsOps { companion object { private val BUCKET: String = "mybucket" private val REGION_IRE = software.amazon.awssdk.regions.Region.EU_WEST_1 val s3c = S3Client.builder() .region(REGION_IRE) .endpointOverride(URI("")) .credentialsProvider(ProfileCredentialsProvider.builder() .profileName("default") .build()) .build() fun lsfolders(bucket: String) { val listReq = ListObjectsV2Request.builder() .bucket(bucket) .delimiter("/") .prefix("") .maxKeys(10_000) .build() val listRes = s3c.listObjectsV2Paginator(listReq) listRes.contents().onEach { f -> if (!f.key().isNullOrBlank()) { println(">> ${f.key()}") } else { println(" = ") } } } @JvmStatic fun main(args: Array<String>) { val bucket: String = ((args.size > 0 && !args[0].isNullOrEmpty()).toString()) ?: BUCKET println("s3 ls test for bucket ${bucket}") lsfolders(bucket) } } } 

Which raises:

software.amazon.awssdk.services.s3.model.NoSuchKeyException: The specified key does not exist. (Service: S3Client; Status Code: 404; Request ID: C8AF9CB788D77F74) Exception in thread "main" software.amazon.awssdk.services.s3.model.NoSuchKeyException: The specified key does not exist. (Service: S3Client; Status Code: 404; Request ID: C8AF9CB788D77F74) at software.amazon.awssdk.core.http.pipeline.stages.HandleResponseStage.handleErrorResponse(HandleResponseStage.java:114)

Same Exception using a stream

 listRes.contents().stream().forEach { content -> println(" Key: " + content.key() + " | ") } 

Thanks folks !

3

1 Answer

The right calls of ListObjectsV2Request is:

val listReq = ListObjectsV2Request.builder() .bucket(bucket) .delimiter("/") .build() val listRes = s3c.listObjectsV2Paginator(listReq) listRes.contents().stream().forEach { content -> println(" Key: " + content.key() + " | ") } 

Then, s3client must init with mimimum params:

 val s3c = S3Client.builder() .credentialsProvider(ProfileCredentialsProvider.builder().profileName("default").build()) .region(REGION_IRE) .build() 

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like