list_objects_v2 - python s3 example




Diferença no boto3 entre recurso, cliente e sessão? (2)

Eu estou usando o Python 2.7.12 no Ubuntu 16.04 LTS. Estou aprendendo a usar o boto3 no seguinte link: https://boto3.readthedocs.io/en/latest/guide/quickstart.html#using-boto-3 . Minha dúvida é quando usar recurso, cliente ou sessão e sua respectiva funcionalidade.


Aqui estão algumas informações mais detalhadas sobre o que Client , Resource e Session são.

Cliente:

  • acesso de serviço de baixo nível
  • gerado a partir da descrição do serviço
  • expõe cliente botocore ao desenvolvedor
  • tipicamente mapeia 1: 1 com a API de serviço
  • todas as operações de serviço são suportadas pelos clientes
  • nomes de métodos com cascas de cobra (por exemplo, ListBuckets API => list_buckets method)

Aqui está um exemplo de acesso no nível do cliente a objetos do bucket do S3 (no máximo 1000 **):

import boto3

client = boto3.client('s3')
response = client.list_objects(Bucket='mybucket')
for content in response['Contents']:
    obj_dict = client.get_object(Bucket='mybucket', Key=content['Key'])
    print(content['Key'], obj_dict['LastModified'])

** você teria que usar um paginator , ou implementar seu próprio loop, chamando list_objects () repetidamente com um marcador de continuação se houvesse mais de 1000.

Recurso:

  • API orientada a objetos de nível superior
  • gerado a partir da descrição do recurso
  • usa identificadores e atributos
  • tem ações (operações em recursos)
  • expõe sub-recursos e coleções
  • não fornece cobertura 100% API

Aqui está o exemplo equivalente usando acesso em nível de recurso a objetos do bucket do S3 (all):

import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('mybucket')
for obj in bucket.objects.all():
    print(obj.key, obj.last_modified)

Observe que, nesse caso, você não precisa fazer uma segunda chamada de API para obter os objetos; eles estão disponíveis para você como uma coleção no balde. Essas coleções de sub-recursos são carregadas com preguiça.

Você pode ver que a versão do Resource do código é muito mais simples, mais compacta e tem mais capacidade (faz paginação para você). A versão do Client do código seria realmente mais complicada do que a mostrada acima, se você quisesse incluir a paginação.

Sessão:

  • armazena informações de configuração (principalmente credenciais e região selecionada)
  • permite criar clientes e recursos de serviço
  • boto3 cria uma sessão padrão para você quando necessário

Um recurso útil para aprender mais sobre esses conceitos de boto3 é o vídeo introdutório re: Invent .


Vou tentar explicar o mais simples possível. Portanto, não há garantia da exatidão dos termos reais.

Session é onde iniciar a conectividade com os serviços da AWS. Por exemplo, a seguir, a sessão padrão que usa o perfil de credencial padrão (por exemplo, ~ / .aws / credentials, ou assume o seu EC2 usando o perfil de instância do IAM)

sqs = boto3.client('sqs')
s3 = boto3.resource('s3')

Como a sessão padrão é limitada ao perfil ou ao perfil de instância usado, em algum momento você precisa usar a sessão personalizada para substituir a configuração de sessão padrão (por exemplo, region_name, endpoint_url etc.), por exemplo,

# custom resource session must use boto3.Session to do the override
my_west_session = boto3.Session(region_name = 'us-west-2')
my_east_sesison = boto3.Session(region_name = 'us-east-1')
backup_s3 = my_west_session.resource('s3')
video_s3 = my_east_sesison.resource('s3')

# you have two choices of create custom client session. 
backup_s3c = my_west_session.client('s3')
video_s3c = boto3.client("s3", region_name = 'us-east-1')

Resource : Esta é a classe de serviço de alto nível recomendada para ser usada. Isso permite que você vincule determinados recursos da AWS e os transmita, portanto, basta usar essa abstração do que preocupar-se com os serviços de destino. Como você percebe na parte da sessão, se você tiver uma sessão personalizada, basta passar esse objeto abstrato do que se preocupar com todas as regiões personalizadas, etc. para passar adiante. A seguir, um exemplo complicado, por exemplo

import boto3 
my_west_session = boto3.Session(region_name = 'us-west-2')
my_east_sesison = boto3.Session(region_name = 'us-east-1')
backup_s3 = my_west_session.resource("s3")
video_s3 = my_east_sesison.resource("s3")
backup_bucket = backup_s3.Bucket('backupbucket') 
video_bucket = video_s3.Bucket('videobucket')

# just pass the instantiated bucket object
def list_bucket_contents(bucket):
   for object in bucket.objects.all():
      print(object.key)

list_bucket_contents(backup_bucket)
list_bucket_contents(video_bucket)

Client é um objeto de classe de baixo nível. Para cada chamada de cliente, você precisa especificar explicitamente os recursos de segmentação, o nome de destino de serviço designado deve ser muito longo. Você perderá a capacidade de abstração.

Por exemplo, se você lida apenas com a sessão padrão, isso é semelhante ao boto3.resource.

import boto3 
s3 = boto3.client('s3')

def list_bucket_contents(bucket_name):
   for object in s3.list_objects_v2(Bucket=bucket_name) :
      print(object.key)

list_bucket_contents('Mybucket') 

No entanto, se você quiser listar objetos do bucket em regiões diferentes, precisará especificar o parâmetro de bucket explícito necessário para o cliente.

import boto3 
backup_s3 = my_west_session.client('s3',region_name = 'us-west-2')
video_s3 = my_east_sesison.client('s3',region_name = 'us-east-1')

# you must pass boto3.Session.client and the bucket name 
def list_bucket_contents(s3session, bucket_name):
   response = s3session.list_objects_v2(Bucket=bucket_name)
   if 'Contents'] in response:
     for obj in response['Contents']:
        print(obj['key'])

list_bucket_contents(backup_s3, 'backupbucket')
list_bucket_contents(video_s3 , 'videobucket') 




boto3