Acessando objetos privados no S3

Introdução ao AWS Boto em Python

Maksim Pecherskiy

Data Engineer

Baixando um arquivo privado

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

Prévia

Introdução ao AWS Boto em Python

Baixando arquivos privados

Fazer download

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

Ler do disco

pd.read_csv('./potholes_local.csv')
Introdução ao AWS Boto em Python

Acessando arquivos privados

Use '.get_object()'

obj = s3.get_object(Bucket='gid-requests', Key='2019/potholes.csv')
print(obj)
Introdução ao AWS Boto em Python

Acessando arquivos privados

Acessando arquivos privados

Introdução ao AWS Boto em Python

Acessando arquivos privados

Obter o objeto

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

Ler StreamingBody no Pandas

pd.read_csv(obj['Body'])
Introdução ao AWS Boto em Python

URLs pré-assinadas

  • Expira após um período definido
  • Ótimo para acesso temporário

Exemplo

https://?AWSAccessKeyId=12345&Signature=rBmnrwutb6VkJ9hE8Uub%2BBYA9mY%3D&Expires=1557624801
Introdução ao AWS Boto em Python

URLs pré-assinadas

Fazer upload de um arquivo

s3.upload_file(
  Filename='./potholes.csv', 
  Key='potholes.csv', 
  Bucket='gid-requests')
Introdução ao AWS Boto em Python

URLs pré-assinadas

Gerar URL pré-assinada

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

Abrir no Pandas

pd.read_csv(share_url)
Introdução ao AWS Boto em Python

Carregar vários arquivos em um único DataFrame

# Criar lista para armazenar nossos DataFrames
df_list = []

# Solicitar a lista de csvs do S3 com prefixo; obter conteúdo response = s3.list_objects( Bucket='gid-requests', Prefix='2019/')
# Obter o conteúdo da resposta request_files = response['Contents']
Introdução ao AWS Boto em Python

Carregar vários arquivos em um único DataFrame

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

# Ler como DataFrame obj_df = pd.read_csv(obj['Body'])
# Anexar o DataFrame à lista df_list.append(obj_df)
Introdução ao AWS Boto em Python

Carregar vários arquivos em um único DataFrame

# Concatenar todos os DataFrames da lista
df = pd.concat(df_list)

# Visualizar o DataFrame df.head()

Pré-visualizar DataFrame

Introdução ao AWS Boto em Python

Revisão Acessando objetos privados no S3

Baixar e depois abrir

s3.download_file()

Abrir direto

s3.get_object()

Gerar URL pré-assinada

s3.generate_presigned_url()
Introdução ao AWS Boto em Python

Revisão - Compartilhando URLs

Arquivos públicos: URL pública do objeto

Gerar usando .format()

'https://{bucket}.{key}'
Arquivos privados: URL pré-assinada

Gerar usando .get_presigned_url()

'https://?AWSAccessKeyId=12345&Signature=rBmnrwutb6VkJ9hE8Uub%2BBYA9mY%3D&Expires=1557624801'
Introdução ao AWS Boto em Python

Vamos praticar!

Introdução ao AWS Boto em Python

Preparing Video For Download...