Usar resultados paginados no AWS SDK para Rust
Muitas operações AWS retornam resultados truncados quando a carga útil é muito grande para ser retornada em uma única resposta. Em vez disso, o serviço retorna uma parte dos dados e um token para recuperar o próximo conjunto de itens. Esse padrão é conhecido como paginação.
O AWS SDK para Rust inclui métodos de extensão de into_paginator em construtores de operações que podem ser usados para paginar automaticamente os resultados para você. Você precisa somente escrever o código que processará os resultados. Todos os criadores de operações de paginação têm um método de into_paginator() disponível que expõe um PaginationStream<Item>
-
No Amazon S3, um exemplo disso é
aws_sdk_s3::operation::list_objects_v2::builders::ListObjectsV2FluentBuilder::into_paginator.
Os exemplos a seguir usam o Amazon Simple Storage Service. No entanto, os conceitos são os mesmos para qualquer serviço que tenha uma ou mais APIs paginadas.
O seguinte exemplo de código mostra o exemplo mais simples que usa o método try_collect()Vec:
let config = aws_config::defaults(BehaviorVersion::latest()) .load() .await; let s3 = aws_sdk_s3::Client::new(&config); let all_objects = s3.list_objects_v2() .bucket("my-bucket") .into_paginator() .send() .try_collect() .await? .into_iter() .flat_map(|o| o.contents.unwrap_or_default()) .collect::<Vec<_>>();
Às vezes, você quer ter mais controle sobre a paginação e não colocar tudo na memória de uma só vez. O exemplo a seguir itera sobre objetos em um bucket do Amazon S3 até que não haja mais objetos.
let config = aws_config::defaults(BehaviorVersion::latest()) .load() .await; let s3 = aws_sdk_s3::Client::new(&config); let mut paginator = s3.list_objects_v2() .bucket("my-bucket") .into_paginator() // customize the page size (max results per/response) .page_size(10) .send(); println!("Objects in bucket:"); while let Some(result) = paginator.next().await { let resp = result?; for obj in resp.contents() { println!("\t{:?}", obj); } }