Python只读文件系统错误使用S3和Lambda打开文件进行读取时

use*_*318 36 python io lambda amazon-s3

当我将file.csv放入S3存储桶时,我看到了lambda函数的以下错误.文件不大,我甚至在打开文件进行读取之前添加了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'
Run Code Online (Sandbox Code Playgroud)

码:

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)
Run Code Online (Sandbox Code Playgroud)

以上结果是:

mytestbucket
file.csv
/file.csv
[Errno 30] Read-only file system: u'/file.csv.6CEdFe7C'
Run Code Online (Sandbox Code Playgroud)

如果密钥/文件是"file.csv",那么为什么s3.download_file方法尝试下载"file.csv.6CEdFe7C"?我猜测当触发该函数时,该文件是file.csv.xxxxx但是当它到达第75行时,该文件被重命名为file.csv?

joo*_*.fi 110

只有/tmp似乎是在AWS LAMBDA写.

因此,这将工作:

filepath = '/tmp/' + key
Run Code Online (Sandbox Code Playgroud)

  • 一个半小时后,我找到你的答案......他们为什么不说清楚?谢谢! (10认同)
  • 我想知道同样的事情.谷歌搜索甚至很难!很高兴我可以帮忙,交配. (3认同)
  • @john AWS 有大量文档的问题! (2认同)

Ega*_*cia 7

根据http://boto3.readthedocs.io/en/latest/guide/s3-example-download-file.html

该示例显示如何将第一个参数用于云名称,将第二个参数用于要下载的本地路径。

在此处输入图片说明

另一方面,amazaon docs在此处输入图片说明

因此,我们有512 MB用于创建文件。这是我在lambda aws中为我编写的代码,因为我的工作就像魅力。

.download_file(Key=nombre_archivo,Filename='/tmp/{}'.format(nuevo_nombre))
Run Code Online (Sandbox Code Playgroud)

  • 即使只是示例,也请不要在代码中放入代码。这样做时,请修正答案中的错字。总体而言,答案变得更好。:-D (2认同)