2015-10-14 1 views
4

Je dois convertir un fichier .zip de S3 en fichier .gzip en utilisant boto3 python dans une fonction AWS lambda. Des suggestions sur la façon de faire cela?Utiliser la fonction AWS lambda pour convertir le fichier S3 de zip en gzip en utilisant boto3 python

Voici ce que j'ai jusqu'à présent:

import json 
import boto3 
import zipfile 
import gzip 

s3 = boto3.resource('s3') 

def lambda_handler(event, context): 

    bucket = event['Records'][0]['s3']['bucket']['name'] 
    key = event['Records'][0]['s3']['object']['key'] 

    try: 
     s3Obj = s3.Object(bucket_name=bucket, key=key) 
     response = s3Obj.get() 
     data = response['Body'].read() 
     zipToGzip = gzip.open(data, 'wb') 
     zipToGzip.write(s3.upload_file(bucket, (s3 + '.gz'))) 
     zipToGzip.close() 
    except Exception as e: 
     print(e) 
     print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket)) 
     raise e 
+0

Plus de détails et votre code actuel aiderait. Voulez-vous re-télécharger le fichier sur S3 gziped, ou juste faire quelque chose avec lui localement gzippé? Pourquoi est-ce que ça doit être une fonction lambda? Voulez-vous dire python lambda, ou AWS lambda? – Lee

+0

Je veux dire AWS Lambda Fonction utilisant Python comme il est supporté maintenant. J'ai un fichier sur S3 qui est au format .zip, j'ai besoin de le changer au format .gzip. – Scotty

+0

Super, merci pour la clarification. Que se passe-t-il avec le code actuel? Est-ce qu'il soulève une exception, ou ne fait pas ce que vous voulez ...? – Lee

Répondre

6

OK, a pensé à elle. Merci pour votre contribution Lee.

import json 
import boto3 
import zipfile 
import gzip 

print('Loading function') 

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

def lambda_handler(event, context): 

    # Get the object from the event and show its content type 
    bucket = event['Records'][0]['s3']['bucket']['name'] 
    key = event['Records'][0]['s3']['object']['key'] 

    try: 
     s3_client.download_file(bucket, key, '/tmp/file.zip') 
     zfile = zipfile.ZipFile('/tmp/file.zip') 
     namelist = zfile.namelist() 

     if len(namelist) >1: 
      pass 
      #alertme() 

     for filename in namelist: 
      data = zfile.read(filename) 
      f = open('/tmp/' + str(filename), 'wb') 
      f.write(data) 
      f.close() 

     zipToGzip = gzip.open('/tmp/data.gz', 'wb') 
     zipToGzip.write(data) 
     zipToGzip.close() 
     s3_client.upload_file('/tmp/data.gz', bucket, key + '.gz') 
     s3_client.delete_object(Bucket=bucket, Key=key) 
    except Exception as e: 
     print(e) 
     print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket)) 
     raise e 
+0

Quel était le problème? Un bon nombre de changements dans votre code. Mais enregistrer l'objet dans un fichier temporaire l'a corrigé? – Lee

+0

@Lee, Je suis assez sûr que le problème est que l'objet Boto3 n'est pas lu correctement en tant que binaire. Donc, Scotty doit télécharger le fichier à partir du seau S3, au lieu d'utiliser 'response ['Body']. Read()' avec get - ce qui devrait être le contenu du fichier binaire. J'ai le même problème - en essayant d'imprimer 'response ['Body']. Read()' me donne juste la chaîne "PK". Je ne suis pas sûr de ce que cela signifie. Avoir à tirer du seau est assez ennuyeux. – unclemeat