2016-09-08 16 views
12

Tôi thấy lỗi dưới đây từ hàm lambda của tôi khi tôi thả tệp.csv vào thùng S3. Tệp không lớn và thậm chí tôi đã thêm một giấc ngủ 60 giây trước khi mở tệp để đọc, nhưng vì lý do nào đó tệp có thêm ".6CEdFe7C" được thêm vào. Tại sao vậy?Python Hệ thống tệp chỉ đọc Lỗi Với S3 và Lambda khi mở tệp để đọc

[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' 

Code:

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) 

Kết quả trên là:

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

Nếu phím/file là "file.csv", thì tại sao phương pháp s3.download_file cố gắng tải xuống "file.csv.6CEdFe7C"? Tôi đoán khi chức năng được kích hoạt, tập tin là file.csv.xxxxx nhưng vào thời điểm nó được đưa vào dòng 75, tập tin được đổi tên thành file.csv?

+0

Dump không bằng để đọc! Vì vậy, tập tin của bạn trên thư mục temp (hoặc trong ram) cần dump không 'self._osutil.open (tên tập tin, 'wb') là f:', chỉ cho phép 'rb'etc. Vì vậy, cần xử lý tệp nguồn trước khi xử lý. – dsgdfg

Trả lời

36

Chỉ /tmp dường như có thể ghi trong AWS Lambda.

Do đó điều này sẽ làm việc:

filepath = '/tmp/' + key 
+1

Một tiếng rưỡi sau, tôi tìm thấy câu trả lời của bạn ... Tại sao họ không làm rõ điều này? Cảm ơn! – john

+1

Tôi đã tự hỏi như vậy. Nó thậm chí còn khó khăn Googling vì lý do! Vui vì tôi có thể giúp, giao phối. –

+0

@john AWS có vấn đề với tài liệu lớn! –

-2

Accord để http://boto3.readthedocs.io/en/latest/guide/s3-example-download-file.html

ví dụ nex cho thấy làm thế nào để sử dụng, tham số đầu tiên là tên điện toán đám mây, thứ hai là con đường địa phương để được tải về.

enter image description here

trong Mặt khác, amazaon docs, nói enter image description here

Do đó, chúng tôi có 512 MB cho tạo file. Đây là mã của tôi cho tôi trong những chiếc bế cừu, vì tôi làm việc như sự quyến rũ.

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

tuyệt vời, đó là mã của bạn, còn nó thì sao? Nếu câu trả lời của bạn giải quyết được câu hỏi, vui lòng thêm giải thích ** tại sao ** nó hoạt động. Nếu không, vui lòng xóa nó. – sjaustirni

+0

Đã sửa, hãy cho tôi biết nếu tôi phải đặt thêm thông tin –

+0

Thậm chí nếu đó chỉ là một ví dụ, vui lòng không đặt mã vào hình ảnh. Trong khi làm điều đó, hãy sửa lỗi chính tả trong câu trả lời của bạn. Tuy nhiên, nhìn chung, câu trả lời trở nên tốt hơn. :-D – sjaustirni

Các vấn đề liên quan