Подтвердить что ты не робот

Python Только для чтения файловая система Ошибка с S3 и Lambda при открытии файла для чтения

Я вижу ошибку ниже из моей лямбда-функции, когда я помещаю файл .csv в корзину S3. Файл не большой, и я даже добавил 60-секундный сон до открытия файла для чтения, но по какой-то причине к файлу добавлен дополнительный ".6CEdFe7C". Это почему?

[Errno 30] Read-only file system: u'/file.csv.6CEdFe7C': IOError
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 75, in lambda_handler
s3.download_file(bucket, key, filepath)
File "/var/runtime/boto3/s3/inject.py", line 104, in download_file
extra_args=ExtraArgs, callback=Callback)
File "/var/runtime/boto3/s3/transfer.py", line 670, in download_file
extra_args, callback)
File "/var/runtime/boto3/s3/transfer.py", line 685, in _download_file
self._get_object(bucket, key, filename, extra_args, callback)
File "/var/runtime/boto3/s3/transfer.py", line 709, in _get_object
extra_args, callback)
File "/var/runtime/boto3/s3/transfer.py", line 723, in _do_get_object
with self._osutil.open(filename, 'wb') as f:
File "/var/runtime/boto3/s3/transfer.py", line 332, in open
return open(filename, mode)
IOError: [Errno 30] Read-only file system: u'/file.csv.6CEdFe7C'

Код:

def lambda_handler(event, context):

    s3_response = {}
    counter = 0
    event_records = event.get("Records", [])

    s3_items = []
    for event_record in event_records:
        if "s3" in event_record:
            bucket = event_record["s3"]["bucket"]["name"]
            key = event_record["s3"]["object"]["key"]
            filepath = '/' + key
            print(bucket)
            print(key)
            print(filepath)
            s3.download_file(bucket, key, filepath)

Результатом вышесказанного является:

mytestbucket
file.csv
/file.csv
[Errno 30] Read-only file system: u'/file.csv.6CEdFe7C'

Если ключ/файл "file.csv", то почему метод s3.download_file пытается загрузить "file.csv.6CEdFe7C"? Я предполагаю, что когда функция запускается, это файл file.csv.xxxxx, но когда он доходит до строки 75, файл переименовывается в file.csv?

4b9b3361

Ответ 1

В AWS Lambda возможно только запись /tmp.

Поэтому это сработало бы:

filepath = '/tmp/' + key

Ответ 2

Согласно http://boto3.readthedocs.io/en/latest/guide/s3-example-download-file.html

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

enter image description here

с другой стороны, в документах amazaon говорится enter image description here

Таким образом, у нас есть 512 МБ для создания файлов. Вот мой код для меня в лямбда-AWS, для меня работает как шарм.

.download_file(Key=nombre_archivo,Filename='/tmp/{}'.format(nuevo_nombre))

Ответ 3

Я заметил, что когда я загрузил код для лямбда directly as a zip file который мог писать только в папку /tmp, но при загрузке кода из S3 я мог также писать в project root folder.

Ответ 4

@Pavlo Kovalchuk: вы хотите сказать, что вы могли писать, например, "fs.writeFile("/sampleps.ps ", event, function (err) {", когда вы загрузили код из S3?