Acceder a objetos privados en S3

Introducción a AWS Boto en Python

Maksim Pecherskiy

Data Engineer

Descargar un archivo privado

df = pd.read_csv('https://gid-staging.potholes.csv')

Vista previa

Introducción a AWS Boto en Python

Descargar archivos privados

Descargar archivo

s3.download_file(
  Filename='potholes_local.csv',
  Bucket='gid-staging', 
  Key='2019/potholes_private.csv')

Leer desde disco

pd.read_csv('./potholes_local.csv')
Introducción a AWS Boto en Python

Acceder a archivos privados

Usa '.get_object()'

obj = s3.get_object(Bucket='gid-requests', Key='2019/potholes.csv')
print(obj)
Introducción a AWS Boto en Python

Acceder a archivos privados

Acceder a archivos privados

Introducción a AWS Boto en Python

Acceder a archivos privados

Obtener el objeto

obj = s3.get_object(
  Bucket='gid-requests', 
  Key='2019/potholes.csv')

Leer StreamingBody en Pandas

pd.read_csv(obj['Body'])
Introducción a AWS Boto en Python

URLs prefirmadas

  • Caducan tras un tiempo
  • Ideales para acceso temporal

Ejemplo

https://?AWSAccessKeyId=12345&Signature=rBmnrwutb6VkJ9hE8Uub%2BBYA9mY%3D&Expires=1557624801
Introducción a AWS Boto en Python

URLs prefirmadas

Subir un archivo

s3.upload_file(
  Filename='./potholes.csv', 
  Key='potholes.csv', 
  Bucket='gid-requests')
Introducción a AWS Boto en Python

URLs prefirmadas

Generar URL prefirmada

share_url = s3.generate_presigned_url(
  ClientMethod='get_object',
  ExpiresIn=3600,
  Params={'Bucket': 'gid-requests','Key': 'potholes.csv'}
)

Abrir en Pandas

pd.read_csv(share_url)
Introducción a AWS Boto en Python

Cargar varios archivos en un único DataFrame

# Crea una lista para guardar los DataFrames
df_list = []

# Pide a S3 la lista de csv con prefijo; obtiene el contenido response = s3.list_objects( Bucket='gid-requests', Prefix='2019/')
# Obtén el contenido de la respuesta request_files = response['Contents']
Introducción a AWS Boto en Python

Cargar varios archivos en un único DataFrame

# Itera sobre cada objeto
for file in request_files:
    obj = s3.get_object(Bucket='gid-requests', Key=file['Key'])

# Léelo como DataFrame obj_df = pd.read_csv(obj['Body'])
# Añade el DataFrame a la lista df_list.append(obj_df)
Introducción a AWS Boto en Python

Cargar varios archivos en un único DataFrame

# Concatena todos los DataFrames de la lista
df = pd.concat(df_list)

# Vista previa del DataFrame df.head()

Vista previa del DataFrame

Introducción a AWS Boto en Python

Repaso: acceder a objetos privados en S3

Descargar y luego abrir

s3.download_file()

Abrir directamente

s3.get_object()

Generar URL prefirmada

s3.generate_presigned_url()
Introducción a AWS Boto en Python

Repaso: compartir URLs

Archivos públicos: URL de objeto público

Genera con .format()

'https://{bucket}.{key}'
Archivos privados: URL prefirmada

Genera con .get_presigned_url()

'https://?AWSAccessKeyId=12345&Signature=rBmnrwutb6VkJ9hE8Uub%2BBYA9mY%3D&Expires=1557624801'
Introducción a AWS Boto en Python

¡Vamos a practicar!

Introducción a AWS Boto en Python

Preparing Video For Download...