2015-10-14 1 views
4

Мне нужно преобразовать .zip-файл из S3 в файл .gzip с помощью boto3 python в функции AWS лямбда. Любые предложения о том, как это сделать?Использовать функцию лямбда AWS для преобразования файла S3 из zip в gzip с помощью boto3 python

Вот то, что я до сих пор:

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

Подробнее и ваш текущий код поможет. Вы хотите повторно загрузить файл в S3 gziped или просто сделать что-то с ним локально gzipped? Почему она должна быть лямбда-функцией? Вы имеете в виду python lambda, или AWS лямбда? – Lee

+0

Я имею в виду функцию AWS Lambda с использованием python, поскольку она поддерживается сейчас. У меня есть файл на S3, который находится в формате .zip, мне нужно изменить его на формат .gzip. – Scotty

+0

Отлично, спасибо за разъяснение. Что происходит с текущим кодом? Вызывает ли это исключение или не делает то, что вы хотите ...? – Lee

ответ

6

ОК, получил это выяснили. Спасибо за ваш вклад Ли.

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

В чем проблема? Довольно много изменений в вашем коде. Но сохранил ли объект во временном файле? – Lee

+0

@ Ли, я уверен, проблема в том, что объект Boto3 не читается правильно как двоичный. Поэтому Скотти нужно загрузить файл из ведра S3 вместо использования 'response ['Body']. Read()' с get - который должен быть содержимым двоичного файла. У меня такая же проблема - попытка напечатать 'response ['Body']. Read()' просто дает мне строку «PK». Не уверен, что это значит. Притянуть из ведра довольно раздражает. – unclemeat

Смежные вопросы