Accéder à des objets privés dans S3

Introduction à AWS Boto en Python

Maksim Pecherskiy

Data Engineer

Télécharger un fichier privé

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

Aperçu

Introduction à AWS Boto en Python

Télécharger des fichiers privés

Télécharger le fichier

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

Lire depuis le disque

pd.read_csv('./potholes_local.csv')
Introduction à AWS Boto en Python

Accéder à des fichiers privés

Utiliser '.get_object()'

obj = s3.get_object(Bucket='gid-requests', Key='2019/potholes.csv')
print(obj)
Introduction à AWS Boto en Python

Accéder à des fichiers privés

Accéder à des fichiers privés

Introduction à AWS Boto en Python

Accéder à des fichiers privés

Récupérer l'objet

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

Lire le StreamingBody dans Pandas

pd.read_csv(obj['Body'])
Introduction à AWS Boto en Python

URLs pré-signées

  • Expirent après un délai défini
  • Idéales pour un accès temporaire

Exemple

https://?AWSAccessKeyId=12345&Signature=rBmnrwutb6VkJ9hE8Uub%2BBYA9mY%3D&Expires=1557624801
Introduction à AWS Boto en Python

URLs pré-signées

Téléverser un fichier

s3.upload_file(
  Filename='./potholes.csv', 
  Key='potholes.csv', 
  Bucket='gid-requests')
Introduction à AWS Boto en Python

URLs pré-signées

Générer une URL pré-signée

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

Ouvrir dans Pandas

pd.read_csv(share_url)
Introduction à AWS Boto en Python

Charger plusieurs fichiers dans un seul DataFrame

# Créer une liste pour stocker nos DataFrames
df_list = []

# Demander la liste des CSV sur S3 avec préfixe ; récupérer le contenu response = s3.list_objects( Bucket='gid-requests', Prefix='2019/')
# Obtenir le contenu de la réponse request_files = response['Contents']
Introduction à AWS Boto en Python

Charger plusieurs fichiers dans un seul DataFrame

# Itérer sur chaque objet
for file in request_files:
    obj = s3.get_object(Bucket='gid-requests', Key=file['Key'])

# Le lire comme DataFrame obj_df = pd.read_csv(obj['Body'])
# Ajouter le DataFrame à la liste df_list.append(obj_df)
Introduction à AWS Boto en Python

Charger plusieurs fichiers dans un seul DataFrame

# Concaténer tous les DataFrames de la liste
df = pd.concat(df_list)

# Prévisualiser le DataFrame df.head()

Aperçu du DataFrame

Introduction à AWS Boto en Python

Récapitulatif : accéder à des objets privés dans S3

Télécharger puis ouvrir

s3.download_file()

Ouvrir directement

s3.get_object()

Générer une URL pré-signée

s3.generate_presigned_url()
Introduction à AWS Boto en Python

Récapitulatif : partager des URLs

Fichiers publics : URL d'objet public

Générer avec .format()

'https://{bucket}.{key}'
Fichiers privés : URL pré-signée

Générer avec .get_presigned_url()

'https://?AWSAccessKeyId=12345&Signature=rBmnrwutb6VkJ9hE8Uub%2BBYA9mY%3D&Expires=1557624801'
Introduction à AWS Boto en Python

Passons à la pratique !

Introduction à AWS Boto en Python

Preparing Video For Download...