Estoy usando Python 2.7.12 en Ubuntu 16.04 LTS. Estoy aprendiendo a usar boto3 desde el siguiente enlace: https://boto3.readthedocs.io/en/latest/guide/quickstart.html#using-boto-3 . Mi duda es cuando usar recurso, cliente o sesión, y su respectiva funcionalidad.
Client y Resource son dos abstracciones diferentes dentro del SDK de boto3 para realizar solicitudes de servicio de AWS. Si desea realizar llamadas de API a un servicio de AWS con boto3, debe hacerlo a través de un Cliente o un Recurso.
Por lo general, elegiría usar la abstracción del cliente o la abstracción del recurso, pero una aplicación puede usar ambas, según sea necesario. He esbozado las diferencias entre Cliente y Recurso a continuación para ayudar a los lectores a decidir cuál usar.
La sesión es en gran parte ortogonal a los conceptos de Cliente y Recurso (pero ambos la usan).
Aquí hay información más detallada sobre qué son Client , Resource y Session .
Cliente:
Este es un ejemplo de acceso a nivel de cliente a los objetos de un depósito de S3:
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'])Nota: este código de nivel de cliente se limita a enumerar como máximo 1000 objetos. Tendría que usar un paginador o implementar su propio bucle, llamando a list_objects_v2() repetidamente con un marcador de continuación si hubiera más de 1000 objetos.
Bien, esa es la interfaz de cliente de bajo nivel. Ahora en la interfaz de recursos de nivel superior (más abstracta).
Recurso:
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)Nota: en este caso no es necesario 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 tienen una carga lenta.
Puede ver que la versión Resource del código es mucho más simple, más compacta y tiene más capacidad (por ejemplo, hace la paginación por usted y expone las propiedades en lugar de un diccionario sin formato). La versión del Client del código en realidad sería más complicada que la que se muestra arriba si quisiera incluir la paginación.
Finalmente, en Sesión, que es fundamental tanto para el Cliente como para el Recurso y cómo ambos obtienen acceso a las credenciales de AWS, por ejemplo.
Sesión:
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.
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 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)El 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')