чтение и запись файлов Excel из s3 с использованием boto3 в лямбда - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь прочитать файл Excel из одной корзины s3 и записать его в другую корзину, используя boto3 в aws lambda. Я предоставил s3 полный доступ к своей роли и написал следующий код

import boto3
import botocore
import io
def lambda_handler(event, context):
    s3 = boto3.resource('s3')
    s3.Bucket('<first_bucket>').download_file('<file_name>.xlsx', '/tmp/<file_name>.xlsx')
    object = s3.Object('<first_bucket>','<file_name>.xlsx')
    with open('/tmp/<file_name>', 'wb') as data:
        object.download_fileobj(data)
    target_object =  s3.Object('<second_bucket>','<file_name>.xlsx')
    target_object.put(data)


    return 'Successfully written to new bucket'

Я выполнил этот код в Lambda, и когда я проверяю свое второе ведро, я вижу, что файл присутствует, но его размер равен 0. Я не уверен, почему и как это исправить. Есть указатели?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Временный файл, который вы храните локально, вы не ссылаетесь на него. Следующий код должен работать для вас.

import boto3
import botocore
import io
 def lambda_handler(event, context):
  s3 = boto3.resource('s3')
   s3.Bucket('<first_bucket>').download_file('<file_name>.xlsx', '/tmp/<file_name>.xlsx')

//upload start from here

s3 = boto3.resource('s3')
s3.meta.client.upload_file('/tmp/<file_name>.xlsx', '<second_bucket>', '/path/to/bucket/<file_name>.xlsx')
return 'Successfully written to new bucket'
0 голосов
/ 30 апреля 2018

Boto предоставляет функцию copy_from для прямого копирования объекта в другое место. Это позволяет избежать необходимости загружать файл вручную.

target_object.copy_from(CopySource='from_bucket/from_file')

Вы можете использовать это или убедиться, что файл, с которого вы читаете, открыт и расположен в первом байте. В приведенном выше фрагменте файл уже был закрыт после оператора with.

with open('/tmp/file', 'rb') as file:
    target_object.put(Body=file)

Или повторно использовать тот же дескриптор файла, ища в начале:

file.seek(0)
target_object.put(Body=file)
...