2016-09-08 10 views
12

पढ़ने के लिए फ़ाइल खोलते समय त्रुटि मैं अपने lambda फ़ंक्शन से नीचे की त्रुटि देख रहा हूं जब मैं एक फ़ाइल csv को S3 बाल्टी में छोड़ देता हूं। फ़ाइल बड़ी नहीं है और मैंने पढ़ने के लिए फ़ाइल खोलने से पहले 60 सेकंड नींद भी जोड़ा है, लेकिन किसी कारण से फ़ाइल में अतिरिक्त ".6CEdFe7C" संलग्न है। ऐसा क्यों है?पायथन केवल पढ़ने के लिए फ़ाइल सिस्टम S3 और Lambda के साथ त्रुटि

[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 कर दिया जाता है?

+0

डंप पढ़ने के बराबर नहीं है! तो अस्थायी फ़ोल्डर (या रैम में) पर आपकी फ़ाइल को 'self._osutil.open (फ़ाइल नाम,' wb ') को डंप करने की आवश्यकता नहीं है: ', केवल' rb'etc की अनुमति है। तो प्रसंस्करण से पहले स्रोत फ़ाइल संभाल लें। – dsgdfg

उत्तर

36

केवल /tmp एडब्ल्यूएस लैम्ब्डा में लिखने योग्य प्रतीत होता है।

इसलिए इस काम करेगा:

filepath = '/tmp/' + key 
+1

डेढ़ साल बाद, मुझे आपका जवाब मिल गया ... वे यह स्पष्ट क्यों नहीं करते? धन्यवाद! – john

+1

मैं वही सोच रहा था। कारण के लिए यह भी कठिन कठिन था! खुशी है कि मैं मदद कर सकता हूँ, दोस्त। –

+0

@ जॉन एडब्ल्यूएस में भारी दस्तावेज़ीकरण के साथ समस्या है! –

-2

एकॉर्ड http://boto3.readthedocs.io/en/latest/guide/s3-example-download-file.html

को नेक्स उदाहरण कैसे उपयोग करने के लिए पता चलता है, पहले पैरामीटर बादल नाम है, दूसरा स्थानीय पथ डाउनलोड किया जा रहा है।

enter image description here

दूसरे हाथ में

, amazaon docs का कहना है enter image description here

इस प्रकार, हम फ़ाइलों को बनाने के लिए 512 एमबी की है। मेरे लिए लैम्बडा aws में मेरे लिए कोड है, क्योंकि मेरे लिए आकर्षण की तरह काम करता है।

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

शांत, यह आपका कोड है, इसके बारे में क्या? यदि आपका उत्तर प्रश्न हल करता है, तो कृपया एक स्पष्टीकरण जोड़ें ** क्यों ** यह काम करता है। यदि ऐसा नहीं होता है, तो कृपया इसे हटाएं। – sjaustirni

+0

ठीक है, मुझे बताएं कि मुझे अधिक जानकारी –

+0

सेट करना है, भले ही यह केवल एक उदाहरण है, कृपया, किसी छवि में कोड न डालें। ऐसा करने के दौरान, कृपया अपने उत्तर में टाइपो को ठीक करें। कुल मिलाकर, जवाब बेहतर हो गया। :-D – sjaustirni

संबंधित मुद्दे