Saltar al contenido

¿Diferencia en boto3 entre recurso, cliente y sesión?

Hola usuario de nuestro sitio, tenemos la respuesta a tu búsqueda, continúa leyendo y la encontrarás a continuación.

Solución:

Aquí hay información más detallada sobre qué son Cliente, Recurso y Sesión.

Cliente:

  • acceso al servicio de AWS de bajo nivel
  • generado desde AWS Servicio descripción
  • expone el cliente botocore al desarrollador
  • normalmente se asigna 1:1 con la API del servicio de AWS
  • todas las operaciones de servicio de AWS son compatibles con los clientes
  • nombres de métodos en mayúsculas y minúsculas (p. ej. API ListBuckets => método list_buckets)

Este es un ejemplo de acceso a nivel de cliente a los objetos de un depósito de S3 (como máximo 1000**):

import boto3

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

** tendría que usar un paginador, o implementar su propio bucle, llamando a list_objects() repetidamente con un marcador de continuación si hubiera más de 1000.

Recurso:

  • API orientada a objetos de alto nivel
  • generada a partir de recurso descripción
  • utiliza identificadores y attributes
  • tiene acciones (operaciones sobre recursos)
  • expone subrecursos y colecciones de recursos de AWS
  • no proporciona una cobertura de API del 100 % de los servicios de AWS

Aquí está el ejemplo equivalente usando acceso a nivel de recursos a los objetos de un depósito S3 (todos):

import boto3

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

Tenga en cuenta que, en este caso, no tiene que realizar una segunda llamada a la API para obtener los objetos; están disponibles para usted como una colección en el cubo. Estas colecciones de subrecursos están cargadas de forma diferida.

Puedes ver que el Resource La versión del código es mucho más simple, más compacta y tiene más capacidad (hace la paginación por usted). los Client La versión del código en realidad sería más complicada que la que se muestra arriba si quisiera incluir la paginación.

Sesión:

  • almacena información de configuración (principalmente credenciales y región seleccionada)
  • le permite crear clientes de servicios y recursos
  • boto3 crea una sesión predeterminada para usted cuando sea necesario

Un recurso útil para aprender más sobre estos conceptos de boto3 es el video introductorio de re:Invent.

Voy a tratar de explicarlo lo más simple posible. Por lo tanto, no hay garantía de la exactitud de los términos reales.

Sesión es donde iniciar la conectividad a los servicios de AWS. Por ejemplo, la siguiente es una sesión predeterminada que usa el perfil de credenciales predeterminado (por ejemplo, ~/.aws/credentials, o suponga que su EC2 usa el perfil de instancia de IAM)

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

Debido a que la sesión predeterminada está limitada al perfil o al perfil de instancia utilizado, a veces es necesario usar la sesión personalizada para anular la configuración de la sesión predeterminada (p. ej., region_name, endpoint_url, etc.), p. ej.

# custom resource session must use boto3.Session to do the override
my_west_session = boto3.Session(region_name = 'us-west-2')
my_east_session = boto3.Session(region_name = 'us-east-1')
backup_s3 = my_west_session.resource('s3')
video_s3 = my_east_session.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')

Recurso : Esta es la clase de servicio de alto nivel que se recomienda utilizar. Esto le permite vincular recursos de AWS particulares y pasarlos, por lo que solo usa esta abstracción en lugar de preocuparse a qué servicios de destino apuntan. Como notará en la parte de la sesión, si tiene una sesión personalizada, simplemente pasa este objeto abstracto en lugar de preocuparse por todas las regiones personalizadas, etc. para pasar. El siguiente es un ejemplo complicado, por ejemplo

import boto3 
my_west_session = boto3.Session(region_name = 'us-west-2')
my_east_session = boto3.Session(region_name = 'us-east-1')
backup_s3 = my_west_session.resource("s3")
video_s3 = my_east_session.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)

Cliente es un objeto de clase de bajo nivel. Para cada llamada de cliente, debe especificar explícitamente los recursos de destino, el nombre de destino del servicio designado debe ser largo. Perderá la capacidad de abstracción.

Por ejemplo, si solo maneja la sesión predeterminada, esto se parece a 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') 

Sin embargo, si desea enumerar objetos de un depósito en diferentes regiones, debe especificar el parámetro de depósito explícito requerido para el cliente.

import boto3 
backup_s3 = my_west_session.client('s3',region_name = 'us-west-2')
video_s3 = my_east_session.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') 

Recuerda algo, que puedes permitirte comentar si te fue preciso.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *