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

Respuestas:

248

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

Cliente:

  • acceso al servicio de bajo nivel de AWS
  • generado a partir de la descripción del servicio de AWS
  • expone al cliente botocore al desarrollador
  • normalmente asigna 1: 1 con la API de servicio de AWS
  • todas las operaciones de servicio de AWS son compatibles con los clientes
  • nombres de métodos en forma de serpiente (por ejemplo, ListBuckets API => método list_buckets)

Aquí hay un ejemplo de acceso a nivel de cliente a los objetos de un depósito 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ías que usar un paginador , o implementar tu propio ciclo, llamando a list_objects () repetidamente con un marcador de continuación si hubiera más de 1000.

Recurso:

  • API orientada a objetos de nivel superior
  • generado a partir de la descripción del recurso
  • usa identificadores y atributos
  • tiene acciones (operaciones sobre recursos)
  • expone recursos secundarios y colecciones de recursos de AWS
  • no proporciona una cobertura API del 100% de los servicios de AWS

Este es el ejemplo equivalente que usa el 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 hacer 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 manera perezosa.

Puede ver que la Resourceversión del código es mucho más simple, más compacta y tiene más capacidad (hace paginación por usted). La Clientversión del código en realidad sería más complicada que la mostrada anteriormente si quisiera incluir la paginación.

Sesión:

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

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

jarmod
fuente
2
¿Hay alguna diferencia de rendimiento entre cliente y recurso? Tuve este problema en el que eliminar mensajes de la cola sqs era más rápido con el cliente y más lento con los recursos.
Vaulstein
3
@Vaulstein No tengo comparaciones específicas para compartir, pero generalmente esperaría que las interfaces del cliente sean más livianas que los recursos y, por lo tanto, potencialmente más rápidas en tiempo de ejecución (aunque más lento para codificar).
jarmod
@jarmod Como parte del aprendizaje, he intentado crear un cubo S3 usando ambos métodos. Siento que la creación de recursos ocurre más rápido cuando se usa "Cliente" en comparación con "Recurso". ¿Es correcto? Si es así, ¿por qué la creación de recursos es más rápida con el Cliente?
Saravanan G
1
@SaravananG Si puede s3.set_stream_logger('botocore'), puede ver registros de la metaprogramación que boto3 (llamando a botocore) realiza bajo el capó. Funciona para que no tengas que hacerlo. Tiene un sistema completo de eventos para personalización / capacidad de conexión y una taxonomía profunda de eventos 3 (+?), Para manejar la preparación de solicitudes, el análisis de respuestas y el encadenamiento de llamadas dependientes. La construcción de parámetros, la firma de solicitudes, la detección de regiones son notables. FYI es un dolor mágico para modificar. Ver cambio fácil .
mcint
89

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

La 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 credencial predeterminado (por ejemplo, ~ / .aws / credentials, o asume tu EC2 usando 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 perfil de instancia utilizado, a veces necesita usar la sesión personalizada para anular la configuración de sesión predeterminada (por ejemplo, nombre_región, extremo_url, etc.)

# 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 usar. Esto le permite vincular recursos particulares de AWS y transmitirlos, por lo que solo debe usar esta abstracción que preocuparse de los servicios de destino a los que apunta. Como observa 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. El siguiente es un ejemplo complicado Ej.

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)

El cliente es un objeto de clase de bajo nivel. Para cada llamada de cliente, debe especificar explícitamente los recursos de orientación, el nombre del objetivo del servicio designado debe pasar mucho tiempo. Perderás la habilidad de abstracción.

Por ejemplo, si solo se ocupa de 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') 
mootmoot
fuente
menor. ¿No es 'objeto' una palabra clave?
Swagatika
¿Deberíamos evitar usar tanto 'recurso' como 'cliente' en paralelo una función o módulo?
John Overiron
1
@JohnOveriron No todos los servicios de AWS tienen una contraparte de "recursos", por lo que aún necesita el "cliente" de bajo nivel. Si tiene la intención de usar para implementaciones, se recomienda usar la formación en la nube (es difícil de aprender pero le ahorrará tiempo a largo plazo) que usar API para automatizar las implementaciones.
mootmoot
@mootmoot Pero estas API pueden realizar consultas / manipulaciones de servicios / recursos aws fácilmente en lugar de obtener resultados o actualizar la pila a través de la formación en la nube. ¿Estoy en lo correcto?
SK Venkat
@SKVenkat Si usted comienza a construir una implementación de servidores múltiples, usando Integración continua, etc., la formación en la nube / terraformación / calor es mucho más fácil de mantener que usar el código boto3.
mootmoot