python - aws - install boto3
¿Diferencia en boto3 entre recurso, cliente y sesión? (2)
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 cuándo usar recursos, clientes o sesiones, y sus respectivas funciones.
Aquí hay información más detallada sobre el Client , el Resource y la Session .
Cliente:
- acceso de servicio de bajo nivel
- generado a partir de la descripción del servicio
- expone al cliente botocore al desarrollador
- normalmente asigna 1: 1 con la API de servicio
- todas las operaciones de servicio son respaldadas por 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(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 paginator , 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
- no proporciona una cobertura API del 100%
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 versión de
Resource
del código es mucho más simple, más compacta y tiene más capacidad (hace paginación por usted).
La versión del código del
Client
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 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 .
Trataré de explicarlo lo más simple posible. Por lo tanto, no hay garantía de la exactitud de los términos reales.
Session 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 su 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, en algún momento debe 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_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 es la clase de servicio de alto nivel que se recomienda usar. Esto le permite vincular recursos de AWS particulares 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 que se preocupa de 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_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 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 largo. 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 del depósito en una región diferente, 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_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'')