Categorías
Python

El uso de pandas y Python para explorar el conjunto de datos

 

Índice Instrucciones de instalación

  • Cliente Versus Recursos
  • Común OperationsCreating un BucketNaming Su FilesCreating Cubo y InstancesUnderstanding Objeto Sub-resourcesUploading un FileDownloading un FileCopying un objeto entre BucketsDeleting un objeto
  • Creación de un cubo
  • Designación de su archivos
  • Creación de depósito y de objeto instancias
  • Comprensión subrecursos
  • cargar un archivo
  • descarga de un archivo
  • la copia de un objeto entre Cubos
  • eliminar un objeto
  • avanzada ConfigurationsACL (Access control Lists) EncryptionStorageVersioning
  • ACL (Access control Lists )
  • Encryption
  • almacenamiento
  • de versiones
  • TraversalsBucket TraversalObject Traversal
  • Bucket Traversal
  • objeto Traversal
  • Eliminación de cucharas y ObjectsDeleting un no-vacío BucketDeleting Cubos
  • Eliminación de un código no vacía Cubo
  • eliminación de Cubos
  • Python o Infraestructura como código (IAC)?
  • Conclusión
  • Lectura adicional
  • Creación de un cubo
  • Designación de su archivos
  • Creación de Cubo y las instancias de objeto
  • Comprensión subrecursos
  • cargar un archivo
  • descarga de un archivo
  • La copia de un objeto entre Cubos
  • eliminar un objeto
  • ACL (Lista de control de Acceso)
  • Encryption
  • almacenamiento
  • de versiones
  • Bucket Traversal
  • objeto Traversal
  • Eliminación de un no vacío Bucket
  • Eliminación de cucharas

Mira ahora Este tutorial tiene un vídeo relacionado curso creado por el equipo del real Python. Mira que junto con el tutorial escrito para profundizar su comprensión: Python, Boto3, y AWS S3: Desmitificar

Amazon Web Services (AWS) se ha convertido en un líder en la computación en nube. Uno de sus componentes fundamentales es S3, el servicio de almacenamiento objeto ofrecido por AWS. Con su impresionante disponibilidad y durabilidad, se ha convertido en la forma estándar para almacenar vídeos, imágenes y datos. Se pueden combinar S3 con otros servicios para construir aplicaciones infinitamente escalable.

Boto3 es el nombre del SDK de Python para AWS. Se le permite crear directamente, actualizar y recursos de AWS eliminar de scripts de Python.

si usted ha tenido alguna exposición AWS antes, tienen su propia cuenta de AWS, y quieren llevar sus habilidades al siguiente nivel al comenzar a utilizar los servicios de AWS desde el código Python, entonces sigue leyendo.

Al final de este tutorial, usted:

  • Sé trabajo seguro con cubos y objetos directamente de las secuencias de comandos de Python
  • saber cómo evitar errores comunes al usar Boto3 y S3
  • entender cómo configurar sus datos desde el inicio a evitar problemas de rendimiento después
  • aprender cómo configurar los objetos para aprovechar las mejores características del S3

Antes de explorar las características de Boto3, lo primero que verá cómo configurar el SDK en su máquina. Este paso será establecer que para el resto del tutorial. Bono

gratuito: 5 pensamientos sobre Python Maestría, un curso gratuito para los desarrolladores de Python que muestra la hoja de ruta y la mentalidad que necesita para tomar sus habilidades de Python al siguiente nivel.

instalación

Para instalar Boto3 en su ordenador, vaya a su terminal y ejecute el siguiente:

$ pip install boto3

que tenga el SDK. Sin embargo, usted no será capaz de utilizarlo en este momento, ya que no sabe qué AWS cuenta que debe conectarse.

Para hacer que se ejecute en contra de su cuenta de AWS, tendrá que proporcionar algunas credenciales válidas. Si ya tiene un usuario de IAM que tiene todos los permisos a S3, puede utilizar las credenciales de los usuarios (su clave de acceso y la clave de acceso secreta) sin necesidad de crear un nuevo usuario. De lo contrario, la manera más fácil de hacer esto es crear un nuevo usuario de AWS y luego almacenar las nuevas credenciales.

Para crear un nuevo usuario, vaya a su cuenta de AWS, y luego ir a Servicios y seleccione IAM . A continuación, seleccione Usuarios y haga clic en Añadir usuario .

dar al usuario un nombre (por ejemplo, boto3user ). Habilitar el acceso mediante programación . Esto asegurará que este usuario será capaz de trabajar con cualquier AWS SDK compatibles o hacen llamadas a la API separados:

Para mantener las cosas simples, elegir la política AmazonS3FullAccess preconfigurado. Con esta política, el nuevo usuario será capaz de tener un control total sobre S3. Haga clic en Siguiente : Revisión :

Seleccionar Crear usuario :

una nueva pantalla le mostrará las credenciales generadas por el usuario. Haga clic en el botón Descargar .csv para hacer una copia de las credenciales. Los necesitará para completar la configuración.

Ahora que tiene su nuevo usuario, crear un nuevo archivo, ~ / .AWS / credenciales:

$ touch ~/.aws/credentials

Abrir el archivo y pegar la estructura a continuación. Rellenar los marcadores de posición con las nuevas credenciales de usuario que ha descargado:

[default]
aws_access_key_id = YOUR_ACCESS_KEY_ID
aws_secret_access_key = YOUR_SECRET_ACCESS_KEY

guardar el archivo.

Ahora que ha establecido estas credenciales, que tiene un perfil predeterminado, el cual será utilizado por Boto3 para interactuar con su cuenta de AWS.

Hay una configuración más de configurar: la región predeterminada que debe interactuar con Boto3. Se puede extraer de la tabla completa de las regiones de AWS compatibles. Elija la región que está más cerca de usted. Copiar su región preferida de la columna de Región . En mi caso, estoy usando eu-oeste-1 (Irlanda).

Crear un nuevo archivo, ~ / .AWS / config:

$ touch ~/.aws/config

Añadir la siguiente y reemplace el marcador de posición con la región que ha copiado:

[default]
region = YOUR_PREFERRED_REGION

guardar el archivo.

Ahora está creado oficialmente por el resto del tutorial.

A continuación, podrás ver las diferentes opciones Boto3 da a conectarse a S3 y otros servicios de AWS.

Cliente Versus Recursos

En su esencia, todo lo que hace es Boto3 AWS llamadas API en su nombre. Para la mayoría de los servicios de AWS, Boto3 ofrece dos formas distintas de acceder a estas API resumieron:

  • cliente: acceso servicio de bajo nivel
  • Recursos

  • : de más alto nivel de acceso al servicio orientado a objetos

Puede utilizar cualquiera de interactuar con S3.

Para conectarse a la interfaz de cliente de bajo nivel, debe utilizar el cliente de Boto3 (). A continuación, pasar el nombre del servicio que desea conectarse, en este caso, s3:

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

Para conectarse a la interfaz de alto nivel, se le sigue un enfoque similar, pero el uso de recursos ():

import boto3
s3_resource = boto3.resource('s3')

que ha conectado con éxito para ambas versiones, pero ahora puede que se pregunte, “¿Cuál debo usar?”

con los clientes, hay más trabajo programático a hacerse. La mayoría de las operaciones de los clientes le dan una respuesta diccionario. Para obtener la información exacta que necesita, tendrá que analizar ese diccionario sí mismo. Con métodos de recursos, el SDK hace que el trabajo para usted.

con el cliente, es posible que vea algunas ligeras mejoras en el rendimiento. La desventaja es que su código se vuelve menos legible de lo que sería si se utilizara el recurso. Recursos ofrecen una mejor abstracción, y su código será más fácil de comprender.

La comprensión de cómo se generan el cliente y el recurso también es importante cuando usted está considerando cuál elegir:

  • Boto3 genera el cliente de un archivo de definición de servicio JSON. Los métodos del cliente son compatibles con cada tipo de interacción con el servicio AWS objetivo.
  • Recursos

  • , por el contrario, se generan a partir de los archivos de definición de recursos de JSON.

Boto3 genera el cliente y el recurso de diferentes definiciones. Como resultado, es posible encontrar casos en los que una operación apoyada por el cliente no es ofrecido por el recurso. Aquí está la parte interesante: no es necesario cambiar el código para utilizar el cliente en todas partes. Para esta operación, se puede acceder al cliente directamente a través del recurso de este modo: s3_resource.meta.client.

Una de esas operaciones cliente es .generate_presigned_url (), que le permite dar a sus usuarios el acceso a un objeto dentro de su cubo por un período determinado de tiempo, sin que tengan que tener credenciales de AWS.

Común Operaciones

Ahora que ya sabe acerca de las diferencias entre los clientes y los recursos, vamos a empezar a usarlos para construir algunos nuevos componentes S3.

Creación de un cubo

Para empezar, necesita un depósito de S3. Para crear una programación, primero debe elegir un nombre para su cubo. Recuerde que este nombre debe ser único en toda la plataforma AWS, como los nombres de contenedor son compatibles con DNS. Si intenta crear un cubo pero otro usuario ya se ha cobrado su nombre de depósito deseada, su código fallará. En lugar de éxito, verá el siguiente error: botocore.errorfactory.BucketAlreadyExists.

Usted puede aumentar sus probabilidades de éxito al crear su cubo escogiendo un nombre aleatorio. Puede generar su propia función que lo hace por usted. En esta implementación, verá cómo utilizar el módulo uuid le ayudará a lograr eso. Una representación de cadena de uuid4 es de 36 caracteres (incluyendo guiones), y se puede añadir un prefijo para especificar lo que cada cubo es para.

Aquí está una manera se puede lograr que:

import uuid
def create_bucket_name(bucket_prefix):
# The generated bucket name must be between 3 and 63 chars long
return ''.join([bucket_prefix, str(uuid.uuid4())])

lo que tiene su nombre de depósito, pero ahora hay una cosa más que necesita para tener en cuenta: a menos que su región se encuentra en los Estados Unidos, tendrá que definir el región explícitamente cuando se va a crear el cubo. De lo contrario obtendrá una IllegalLocationConstraintException.

para ejemplificar lo que esto significa al crear su cubo S3 en una región fuera de Estados Unidos, echar un vistazo al siguiente código:

s3_resource.create_bucket(Bucket=YOUR_BUCKET_NAME,
CreateBucketConfiguration={
'LocationConstraint': 'eu-west-1'})

es necesario proporcionar un nombre de cubo y una configuración cubo donde se debe especificar el región, que en mi caso es eu-oeste-1.

Esto no es ideal. Imagine que usted quiere llevar su código e implementarlo en la nube. Su tarea será cada vez más difícil, ya que ahora ha codificado la región. Se podría refactorizar la región y transformarlo en un variable de entorno, pero entonces tendría una cosa más de manejar.

Por suerte, hay una mejor manera de conseguir la región mediante programación, mediante el aprovechamiento de un objeto de sesión. Boto3 creará la sesión desde sus credenciales. Sólo tiene que tomar la región y pasarlo a create_bucket () como su configuración LocationConstraint. Aquí está cómo hacerlo:

def create_bucket(bucket_prefix, s3_connection):
session = boto3.session.Session()
current_region = session.region_name
bucket_name = create_bucket_name(bucket_prefix)
bucket_response = s3_connection.create_bucket(
Bucket=bucket_name,
CreateBucketConfiguration={
'LocationConstraint': current_region})
print(bucket_name, current_region)
return bucket_name, bucket_response

La parte buena es que este código funciona sin importar dónde se desea implementar es: a nivel local / EC2 / Lambda. Por otra parte, no es necesario para codificar el región.

Como tanto el cliente como el recurso a crear cubos de la misma manera, se puede pasar a cualquiera de ellos como el parámetro s3_connection.

Ahora vamos a crear dos cubos. En primer lugar crear una con el cliente, lo que le da una copia de la bucket_response como un diccionario:

>>> first_bucket_name, first_response = create_bucket(
... bucket_prefix='firstpythonbucket',
... s3_connection=s3_resource.meta.client)
firstpythonbucket7250e773-c4b1-422a-b51f-c45a52af9304 eu-west-1

>>> first_response
{'ResponseMetadata': {'RequestId': 'E1DCFE71EDE7C1EC', 'HostId': 'r3AP32NQk9dvbHSEPIbyYADT769VQEN/+xT2BPM6HCnuCb3Z/GhR2SBP+GM7IjcxbBN7SQ+k+9B=', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amz-id-2': 'r3AP32NQk9dvbHSEPIbyYADT769VQEN/+xT2BPM6HCnuCb3Z/GhR2SBP+GM7IjcxbBN7SQ+k+9B=', 'x-amz-request-id': 'E1DCFE71EDE7C1EC', 'date': 'Fri, 05 Oct 2018 15:00:00 GMT', 'location': 'http://firstpythonbucket7250e773-c4b1-422a-b51f-c45a52af9304.s3.amazonaws.com/', 'content-length': '0', 'server': 'AmazonS3'}, 'RetryAttempts': 0}, 'Location': 'http://firstpythonbucket7250e773-c4b1-422a-b51f-c45a52af9304.s3.amazonaws.com/'}

A continuación, crear una segunda cubeta utilizando el recurso, lo que le da una copia de una instancia de cubo como el bucket_response:

>>> second_bucket_name, second_response = create_bucket(
... bucket_prefix='secondpythonbucket', s3_connection=s3_resource)
secondpythonbucket2d5d99c5-ab96-4c30-b7f7-443a95f72644 eu-west-1

>>> second_response
s3.Bucket(name='secondpythonbucket2d5d99c5-ab96-4c30-b7f7-443a95f72644')

lo que tiene su cubos. A continuación, tendrá que empezar a agregar algunos archivos a ellos.

Designación de su archivos

puede asignar nombres a los objetos mediante el uso de las convenciones de nomenclatura de archivos estándar. Se puede utilizar cualquier nombre válido. En este artículo, usted mira a un caso más específico que le ayuda a entender cómo funciona S3 bajo el capó.

Si usted está pensando en acoger un gran número de archivos en el depósito de S3, hay algo que usted debe tener en cuenta. Si todos los nombres de archivo tienen un prefijo determinista que se repite para cada archivo, como por ejemplo un formato de hora como “AAAA-MM-DDThh: mm: ss”, entonces usted pronto encontrará que se está ejecutando en problemas de rendimiento cuando’ re tratando de interactuar con su cubo.

Esto sucederá porque S3 lleva el prefijo del archivo y lo asigna a una partición. Los archivos más que añadir, más serán asignados a la misma partición, y que la partición va a ser muy pesado y menos sensibles.

¿Qué se puede hacer para evitar que eso suceda?

La solución más fácil es cambiar aleatoriamente el nombre del archivo. Se pueden imaginar muchas implementaciones diferentes, pero en este caso, va a utilizar el módulo de UUID de confianza para ayudar con eso. Para hacer que los nombres de archivo más fácil de leer para este tutorial, que va a tomar los primeros seis caracteres de la representación hexadecimal del número generado y concatena con su nombre de archivo base.

La función de ayuda a continuación le permite pasar en el número de bytes que desea que el archivo tenga, el nombre del archivo, y un contenido de muestra para el archivo que se repite para compensar el tamaño de archivo deseado:

def create_temp_file(size, file_name, file_content):
random_file_name = ''.join([str(uuid.uuid4().hex[:6]), file_name])
with open(random_file_name, 'w') as f:
f.write(str(file_content) * size)
return random_file_name

Creación de la primera archivo, que se va a utilizar en breve:

first_file_name = create_temp_file(300, 'firstfile.txt', 'f')

al añadir aleatoriedad a los nombres de archivo, se puede distribuir eficientemente sus datos dentro de su contenedor de S3.

Creación de Cubo y las instancias de objeto

El siguiente paso después de crear el archivo es ver cómo integrar en su flujo de trabajo S3.

Aquí es donde las clases del recurso juegan un papel importante, ya que estas abstracciones hacen que sea fácil trabajar con S3.

Mediante el uso del recurso, que tiene acceso a las clases de alto nivel (depósito y de objeto). Así es como se puede crear uno de cada uno:

first_bucket = s3_resource.Bucket(name=first_bucket_name)
first_object = s3_resource.Object(
bucket_name=first_bucket_name, key=first_file_name)

La razón por la que no ha visto ningún error con la creación de la variable first_object es que Boto3 no hace llamadas a AWS para crear la referencia. El bucket_name y la clave son llamados identificadores, y ellos son los parámetros necesarios para crear un objeto. Cualquier otro atributo de un objeto, tal como su tamaño, se carga con pereza. Esto significa que para Boto3 para obtener los atributos solicitados, se tiene que hacer llamadas a AWS.

Comprensión subrecursos

depósito y de objeto son sub-recursos de unos a otros. Subrecursos son métodos que crean una nueva instancia de un recurso secundario. identificadores de los padres se pasan al recurso niño.

Si tiene una variable del cubo, puede crear un objeto directamente:

first_object_again = first_bucket.Object(first_file_name)

O si tiene una variable de objeto, entonces se puede obtener la cuchara:

first_bucket_again = first_object.Bucket()

Gran, ahora se entiende cómo generar un cubo y un objeto . A continuación, se va a llegar a cargar el archivo recién generado a S3 utilizando estas construcciones.

carga de un archivo

Hay tres maneras en que puede cargar un archivo:

  • de una instancia de objeto
  • de un cubo ejemplo
  • Desde el cliente

En cada caso, usted tiene que proporcionar el nombre de archivo, el cual es la ruta del archivo que desea cargar. Ahora vamos a explorar las tres alternativas. Siéntase libre de escoger lo que más le gusta a subir el first_file_name a S3.

objeto Versión Instancia

Puede cargar utilizando una instancia del objeto:

s3_resource.Object(first_bucket_name, first_file_name).upload_file(
Filename=first_file_name)

O puede utilizar la instancia first_object:

first_object.upload_file(first_file_name)

Cubo instancia versión

Así es como se puede cargar utilizando una instancia de la cuchara:

s3_resource.Bucket(first_bucket_name).upload_file(
Filename=first_file_name, Key=first_file_name)

versión de cliente

también puede cargar utilizando el cliente:

s3_resource.meta.client.upload_file(
Filename=first_file_name, Bucket=first_bucket_name,
Key=first_file_name)

ha cargado correctamente el archivo a S3 usando uno de los tres métodos disponibles. En las próximas secciones, que vamos a trabajar principalmente con la clase de objeto, ya que las operaciones son muy similares entre el cliente y las versiones de cubo.

descarga de un archivo

Para descargar un archivo desde S3 localmente, podrás seguir los mismos pasos como lo hizo cuando la carga. Pero en este caso, el parámetro de nombre de archivo mapa a su ruta local deseado. En esta ocasión, se descargará el archivo en el directorio tmp:

s3_resource.Object(first_bucket_name, first_file_name).download_file(
f'mp/{first_file_name}') # Python 3.6+

que haya descargado correctamente el archivo desde S3. A continuación, verá cómo copiar el mismo archivo entre sus cubos S3 usando una sola llamada a la API.

La copia de un objeto entre Cubos

Si necesita copiar archivos de un cubo a otro, Boto3 le ofrece esa posibilidad. En este ejemplo, podrás copiar el archivo desde el primer segmento a la segunda, utilizando .copy ():

def copy_to_bucket(bucket_from_name, bucket_to_name, file_name):
copy_source = {
'Bucket': bucket_from_name,
'Key': file_name
}
s3_resource.Object(bucket_to_name, file_name).copy(copy_source)

copy_to_bucket(first_bucket_name, second_bucket_name, first_file_name)

Nota: Si estás con el objetivo de replicar el S3 se opone a un cubo en una región diferente, tienen un vistazo a la Cruz Región de replicación. borrar el archivo nuevo de

eliminar un objeto

Let desde el segundo cubo llamando .Delete () en la instancia de objetos equivalentes:

s3_resource.Object(second_bucket_name, first_file_name).delete()

Ahora hemos visto cómo utilizar las operaciones centrales de S3. Usted está listo para llevar su conocimiento al siguiente nivel con características más complejas en las próximas secciones.

avanzada Configuraciones

En esta sección, vamos a explorar más elaborado cuenta con S3. Vas a ver ejemplos de cómo usarlos y los beneficios que pueden aportar a sus aplicaciones.

ACL (Access Control Lists) Listas de Control de Acceso

(ACL) que ayuda a administrar el acceso a los cubos y los objetos dentro de ellos. Ellos se consideran la forma legado de la administración de permisos a S3. ¿Por qué debe saber acerca de ellos? Si usted tiene que administrar el acceso a los objetos individuales, a continuación, se usaría un objeto ACL.

Por defecto, cuando se carga un objeto a S3, ese objeto es privada. Si desea realizar este objeto a disposición de otra persona, se puede establecer la ACL del objeto a ser público en el momento de la creación. He aquí cómo se carga un nuevo archivo al cubo y hacerlo accesible a todo el mundo:

second_file_name = create_temp_file(400, 'secondfile.txt', 's')
second_object = s3_resource.Object(first_bucket.name, second_file_name)
second_object.upload_file(second_file_name, ExtraArgs={
'ACL': 'public-read'})

Puede obtener la instancia ObjectAcl del objeto, ya que es una de sus subclases de recursos:

second_object_acl = second_object.Acl()

Para ver quién tiene acceso a su objeto, utilice el atributo subvenciones:

>>> second_object_acl.grants
[{'Grantee': {'DisplayName': 'name', 'ID': '24aafdc2053d49629733ff0141fc9fede3bf77c7669e4fa2a4a861dd5678f4b5', 'Type': 'CanonicalUser'}, 'Permission': 'FULL_CONTROL'}, {'Grantee': {'Type': 'Group', 'URI': 'http://acs.amazonaws.com/groups/global/AllUsers'}, 'Permission': 'READ'}]

usted puede hacer su objeto privado de nuevo, sin necesidad de volver a subirlo:

>>> response = second_object_acl.put(ACL='private')
>>> second_object_acl.grants
[{'Grantee': {'DisplayName': 'name', 'ID': '24aafdc2053d49629733ff0141fc9fede3bf77c7669e4fa2a4a861dd5678f4b5', 'Type': 'CanonicalUser'}, 'Permission': 'FULL_CONTROL'}]

has visto cómo se pueden utilizar las ACL para administrar el acceso a los objetos individuales. A continuación, verá cómo puede agregar una capa adicional de seguridad a los objetos mediante el uso de cifrado.

Nota: Si lo que busca es dividir los datos en múltiples categorías, echar un vistazo a las etiquetas. Puede conceder acceso a los objetos en función de sus etiquetas.

cifrado

Con S3, puede proteger sus datos mediante el cifrado. Explorará el cifrado del lado del servidor usando el algoritmo AES-256, donde AWS gestiona tanto el cifrado y las claves.

Crear un nuevo archivo y subirlo utilizando ServerSideEncryption:

third_file_name = create_temp_file(300, 'thirdfile.txt', 't')
third_object = s3_resource.Object(first_bucket_name, third_file_name)
third_object.upload_file(third_file_name, ExtraArgs={
'ServerSideEncryption': 'AES256'})

Puede comprobar el algoritmo que se utilizó para cifrar el archivo, en este caso AES256:

>>> third_object.server_side_encryption
'AES256'

Ahora entiende cómo agregar una capa adicional de protección a los objetos usando el algoritmo de cifrado del lado del servidor AES-256 ofrecido por AWS.

almacenamiento

Cada objeto que se incorpora a su depósito de S3 se asocia con una clase de almacenamiento. Todas las clases de almacenamiento disponibles ofrecen una gran durabilidad. Solo tiene que elegir cómo desea almacenar sus objetos basado en los requisitos de acceso el rendimiento de su aplicación.

En la actualidad, se pueden utilizar las siguientes clases de almacenamiento con S3:

  • ESTÁNDAR: por defecto para los datos de acceso frecuente
  • STANDARD_IA: para los datos utilizados con poca frecuencia que necesita ser recuperados rápidamente cuando solicitado
  • ONEZONE_IA: para el mismo caso de uso como STANDARD_IA, pero almacena los datos en una disponibilidad Zona lugar de tres
  • REDUCED_REDUNDANCY: para datos no críticos utilizados con frecuencia que es fácilmente reproducible

Si desea cambiar la clase de almacenamiento de un objeto existente, necesita volver a crear el objeto.

Por ejemplo, el Reupload third_object y establezca su clase de almacenamiento a Standard_IA:

third_object.upload_file(third_file_name, ExtraArgs={
'ServerSideEncryption': 'AES256',
'StorageClass': 'STANDARD_IA'})

Nota: Si se realizan cambios en el objeto, se puede encontrar que su instancia local no muestra ellos. Lo que hay que hacer en ese momento es .Reload llamada () para buscar la versión más reciente de su objeto.

Actualizar el objeto, y se puede ver su nueva clase de almacenamiento:

>>> third_object.reload()
>>> third_object.storage_class
'STANDARD_IA'

Nota: Use LifeCycle Configuraciones de objetos de transición a través de las diferentes clases como a encontrar la necesidad de ellos. Ellos tendrán una transición automáticamente estos objetos para usted.

de versiones

Debe utilizar versiones para mantener un registro completo de los objetos a través del tiempo. También actúa como un mecanismo de protección contra el borrado accidental de sus objetos. Cuando se solicita un objeto versionado, Boto3 recuperará la versión más reciente.

Cuando se agrega una nueva versión de un objeto, el objeto de almacenamiento que tiene en total es la suma del tamaño de sus versiones. Así que si usted está almacenando un objeto de 1 GB, y crear 10 versiones, entonces usted tiene que pagar por 10 GB de almacenamiento.

Enable versionado por primera cubeta. Para ello, es necesario utilizar la clase BucketVersioning:

def enable_bucket_versioning(bucket_name):
bkt_versioning = s3_resource.BucketVersioning(bucket_name)
bkt_versioning.enable()
print(bkt_versioning.status)
>>> enable_bucket_versioning(first_bucket_name)
Enabled

A continuación, crear dos nuevas versiones para el primer objeto de archivo, una con el contenido del archivo original y otra con el contenido del tercer archivo:

s3_resource.Object(first_bucket_name, first_file_name).upload_file(
first_file_name)
s3_resource.Object(first_bucket_name, first_file_name).upload_file(
third_file_name)

Ahora reupload el segundo archivo, lo que creará una nueva versión:

s3_resource.Object(first_bucket_name, second_file_name).upload_file(
second_file_name)

puede recuperar la última versión disponible de los objetos de esta manera:

>>> s3_resource.Object(first_bucket_name, first_file_name).version_id
'eQgH6IC1VGcn7eXZ_.ayqm6NdjjhOADv'

En esta sección, usted ha visto cómo trabajar con algunos de los más importantes atributos y S3 añadirlos a sus objetos. A continuación, verá cómo atravesar fácilmente cubos y objetos.

Recorridos

Si necesita recuperar información de una operación o aplicar a todos los recursos a su S3, Boto3 le da varias maneras de forma iterativa Traverse sus cubos y sus objetos. Vamos a empezar por la que atraviesa todas sus cubos creados.

Cubo Transversal

para atravesar todos los cubos en su cuenta, puede utilizar cubos del recurso atribuyen junto .all (), que le da la lista completa de los casos de cubo:

>>> for bucket in s3_resource.buckets.all():
... print(bucket.name)
...
firstpythonbucket7250e773-c4b1-422a-b51f-c45a52af9304
secondpythonbucket2d5d99c5-ab96-4c30-b7f7-443a95f72644

Usted puede utilizar el cliente para recuperar el cubo información, así, pero el código es más complejo, ya que necesita para extraerlo del diccionario que la rentabilidad de los clientes:

>>> for bucket_dict in s3_resource.meta.client.list_buckets().get('Buckets'):
... print(bucket_dict['Name'])
...
firstpythonbucket7250e773-c4b1-422a-b51f-c45a52af9304
secondpythonbucket2d5d99c5-ab96-4c30-b7f7-443a95f72644

se han visto la manera de recorrer los cubos que tiene en su cuenta. En la próxima sección, que va a retomar una de sus cubos y iterativa ver los objetos que contiene.

objeto Transversal

Si desea una lista de todos los objetos de un depósito, el siguiente código generará un iterador para usted:

>>> for obj in first_bucket.objects.all():
... print(obj.key)
...
127367firstfile.txt
616abesecondfile.txt
fb937cthirdfile.txt

El obj variable es un ObjectSummary. Esta es una representación de peso ligero de un objeto. La versión resumida no es compatible con todos los atributos que el objeto tiene. Si necesita acceder a ellos, utilice el objeto () subrecurso para crear una nueva referencia a la clave almacenada subyacente. Entonces serás capaz de extraer los atributos que faltan: ahora

>>> for obj in first_bucket.objects.all():
... subsrc = obj.Object()
... print(obj.key, obj.storage_class, obj.last_modified,
... subsrc.version_id, subsrc.metadata)
...
127367firstfile.txt STANDARD 2018-10-05 15:09:46+00:00 eQgH6IC1VGcn7eXZ_.ayqm6NdjjhOADv {}
616abesecondfile.txt STANDARD 2018-10-05 15:09:47+00:00 WIaExRLmoksJzLhN7jU5YzoJxYSu6Ey6 {}
fb937cthirdfile.txt STANDARD_IA 2018-10-05 15:09:05+00:00 null {}

Puede realizar operaciones de forma iterativa en sus cubos y objetos. Ya casi terminas. Hay una cosa más que usted debe saber en esta etapa: cómo eliminar todos los recursos que ha creado en este tutorial.

eliminación de depósitos y de objetos

Para eliminar todos los depósitos y los objetos que haya creado, debe asegurarse primero de que sus cubos tienen ningún objeto dentro de ellos.

Eliminación de un cubo vacío para no

Para poder eliminar un cubo, primero debe eliminar todos los objetos dentro del cubo, o de lo contrario se le planteó la excepción BucketNotEmpty. Cuando usted tiene un cubo versionado, lo que tenga que eliminar todos los objetos y todas sus versiones.

Si usted encuentra que una regla de ciclo de vida que va a hacer esto automáticamente para usted no es adecuado a sus necesidades, aquí está cómo se puede eliminar mediante programación los objetos:

def delete_all_objects(bucket_name):
res = []
bucket=s3_resource.Bucket(bucket_name)
for obj_version in bucket.object_versions.all():
res.append({'Key': obj_version.object_key,
'VersionId': obj_version.id})
print(res)
bucket.delete_objects(Delete={'Objects': res})

Las encima de código funciona si está o no han permitido versionado en su cubo . Si no es así, la versión de los objetos será nulo. Usted puede tratar hasta 1.000 supresiones en una llamada a la API, utilizando .delete_objects () en la instancia del cubo, que es más rentable que la de eliminar de forma individual cada objeto.

Ejecutar la nueva función contra el primer cubo para eliminar todos los objetos versionados:

>>> delete_all_objects(first_bucket_name)
[{'Key': '127367firstfile.txt', 'VersionId': 'eQgH6IC1VGcn7eXZ_.ayqm6NdjjhOADv'}, {'Key': '127367firstfile.txt', 'VersionId': 'UnQTaps14o3c1xdzh09Cyqg_hq4SjB53'}, {'Key': '127367firstfile.txt', 'VersionId': 'null'}, {'Key': '616abesecondfile.txt', 'VersionId': 'WIaExRLmoksJzLhN7jU5YzoJxYSu6Ey6'}, {'Key': '616abesecondfile.txt', 'VersionId': 'null'}, {'Key': 'fb937cthirdfile.txt', 'VersionId': 'null'}]

Como prueba final, se puede cargar un archivo en el segundo cubo. Este cubo no tiene el control de versiones está habilitado, y por lo tanto la versión será nulo. Aplicar la misma función para eliminar el contenido:

>>> s3_resource.Object(second_bucket_name, first_file_name).upload_file(
... first_file_name)
>>> delete_all_objects(second_bucket_name)
[{'Key': '9c8b44firstfile.txt', 'VersionId': 'null'}]

que ha logrado eliminar todos los objetos de ambos sus cubos. Ahora está listo para eliminar los cubos.

eliminación de Cubos

Para terminar, vamos a usar .Delete () en la instancia del cucharón para quitar el primer cubo:

s3_resource.Bucket(first_bucket_name).delete()

Si lo desea, puede utilizar la versión del cliente para eliminar el segundo cubo:

s3_resource.meta.client.delete_bucket(Bucket=second_bucket_name)

tanto las operaciones tuvieron éxito porque ha vaciado cada cubeta antes de intentar eliminarlo.

Ahora han acabado algunas de las más importantes operaciones que se pueden realizar con S3 y Boto3. ¡Felicidades por haber llegado tan lejos! Como beneficio adicional, vamos a explorar algunas de las ventajas de la gestión de los recursos S3 con la infraestructura como Código. Código

Python o Infraestructura como código (IAC)?

Como hemos visto, la mayoría de las interacciones que ha tenido con S3 en este tutorial tenía que ver con los objetos. No viste muchas operaciones relacionadas con cubos, tales como la adición de políticas para el cubo, añadiendo una regla de ciclo de vida para la transición de los objetos a través de las clases de almacenamiento, archivarlos en el glaciar o eliminar por completo o hacer cumplir todos los objetos que pueden cifrar mediante la configuración del cubo encriptación.

manual de gestión del estado de sus clientes o cubos a través de los recursos de Boto3 vuelve cada vez más difícil, ya que su aplicación se inicia la adición de otros servicios y se hace más compleja. Para controlar su infraestructura en concierto con Boto3, considerar el uso de una infraestructura como herramienta de código (IAC), como CloudFormation o Terraform para gestionar la infraestructura de su aplicación. Cualquiera de estas herramientas se mantendrá el estado de su infraestructura y le informará de los cambios que ha aplicado.

Si decide ir por este camino, tenga en cuenta lo siguiente:

  • Cualquier cubeta relacionados con operación que modifica el cubo de ninguna manera se deben hacer a través de IAC.
  • si desea que todos sus objetos a actuar de la misma manera (todo el cifrado, o todos los públicos, por ejemplo), por lo general hay una manera de hacerlo directamente a través de IAC, mediante la adición de una Política de cubo o una propiedad específica del cucharón.
  • Bucket operaciones de lectura, tales como iteración a través de los contenidos de un cubo, deben hacerse usando Boto3. operaciones relacionadas con objetos
  • a un nivel objeto individual se deben hacer usando Boto3.

Conclusión Felicidades

en llegar a la final de este tutorial!

Ahora estás preparado para empezar a trabajar mediante programación con S3. Ahora ya sabe cómo crear objetos, súbelas a S3, descarga su contenido y cambiar sus atributos directamente desde su escritura, a la vez que evitar los errores comunes con Boto3.

mayo de este tutorial sea un trampolín en su viaje para construir algo grande usando AWS!

Lectura adicional

Si desea obtener más información, echa un vistazo a la siguiente:

  • documentación Boto3
  • Generación de datos aleatorios en Python (Guía) Políticas
  • IAM y Políticas cubo y ACL
  • objeto etiquetado
  • LifeCycle Configuraciones
  • Cruz-Región de replicación
  • CloudFormation
  • Terraform

Mira ahora Este tutorial tiene un vídeo relacionado curso creado por el equipo del real Python. Mira que junto con el tutorial escrito para profundizar su comprensión: Python, Boto3, y AWS S3: Desmitificar

Deja un comentario

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