Как получить все S3ObjectSummary из корзины S3, используя scala и aws-java-sdk? - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть проект scala, и я пытаюсь реализовать службу, требующую доступа к корзине Amazon S3.

Я хочу получить список всех объектов корзины, но набор результатов равен * 1003.* разбит на страницы на 1000 элементов.

Чтобы получить все результаты, нужно выбрать несколько объектных списков.

Я нашел пример реализации Java , но он полагается наизменчивость (перезаписывая objectListing в цикле while):

AmazonS3 s3Client = AmazonS3Provider.getS3Client();
ListObjectsRequest req = new ListObjectsRequest().withBucketName(realBucket).withPrefix(!preprefix.equals("") ? preprefix + "/" + prefix : prefix);
ObjectListing objectListing = s3Client.listObjects(req);
List<S3ObjectSummary> summaries = objectListing.getObjectSummaries();

while (objectListing.isTruncated()) {
    objectListing = s3Client.listNextBatchOfObjects(objectListing);
    summaries.addAll(objectListing.getObjectSummaries());
}

Хотя я могу перевести это в scala штраф, я хочу использовать более идиоматический способ scala.

Как я могу получить всестраницы ведра с использованием scala?

1 Ответ

0 голосов
/ 25 апреля 2019

Я сейчас использую рекурсивный подход и заполняю объект результата во время каждой итерации. И как только будет достигнута последняя страница, она вернет окончательную коллекцию.

Соответствующая часть происходит в методе getAllSummaries, я оставляю другие детали реализации, чтобы они могли помочь другим заставить его работать легче. (Мой AmazonS3Config - это базовый класс дел, содержащий мои учетные данные S3.)

import com.amazonaws.auth.{AWSStaticCredentialsProvider, BasicAWSCredentials}
import com.amazonaws.regions.Regions
import com.amazonaws.services.s3.model.{ObjectListing, S3ObjectSummary}
import com.amazonaws.services.s3.{AmazonS3, AmazonS3ClientBuilder}

import scala.collection.JavaConverters._

object Starter extends App with Configurable {

  private lazy val client: AmazonS3 = createAmazonClient(this.config.s3)

  val objects = getAllObjects()

  def getAllObjects(): Seq[S3ObjectSummary] = {
    val bucket = "YOUR_BUCKET_NAME"
    val prefix = ""

    val objectListing: ObjectListing = client.listObjects(bucket, prefix)

    getAllSummaries(objectListing)
  }

  private def getAllSummaries(list: ObjectListing,
                              res: Seq[S3ObjectSummary] = Seq.empty[S3ObjectSummary]): Seq[S3ObjectSummary] =
    list.isTruncated match {
      case false => {
        res ++ list.getObjectSummaries.asScala
      }
      case true =>
        val newList = this.client.listNextBatchOfObjects(list)
        getAllSummaries(newList, res ++ newList.getObjectSummaries.asScala)

    }

  private def createAmazonClient(config: AmazonS3Config): AmazonS3 = {
    val region = Regions.valueOf(config.region)
    val awsCredentials = new BasicAWSCredentials(config.accessKey, config.secretKey)

    AmazonS3ClientBuilder
      .standard()
      .withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
      .withRegion(region)
      .build()
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...