2016-09-08 46 views
12

Bir file.csv dosyasını bir S3 hücresine bıraktığımda aşağıdaki hatayı lambda fonksiyonumdan görüyorum. Dosya büyük değil ve okuma için dosyayı açmadan önce 60 saniyelik bir uyku ekledim, ancak herhangi bir nedenle dosyaya ek olarak ".6CEdFe7C" eklenmiş. Neden?Python Salt okunur dosya sistemi hatası Okumak için bir dosya açıldığında S3 ve Lambda hatası

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

Kodu:

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) 

yukarıda sonucudur:

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

anahtar/dosya "file.csv" ise

, neden s3.download_file yöntemini yapar "file.csv.6CEdFe7C" indirmeyi deneyin? Ben fonksiyon tetiklendiğinde, dosya file.csv.xxxxx olduğunu tahmin ediyorum ama 75 satırına ulaştığında, dosya file.csv olarak yeniden adlandırılır? AWS Lambda'da yazılabilir gibi görünüyor.

+0

Döküm okumaya eşit değil! Yani temp klasöründe (veya ramda) dosyanızın, 'self._osutil.open (dosya adı, 'wb') f:' olarak değil, yalnızca rb'etc olarak izinli olması gerekir. Bu yüzden işlemeden önce kaynak dosyaya ihtiyaç var. – dsgdfg

cevap

36

Sadece /tmp yazılabilir.

Dolayısıyla bu işe yarar:

filepath = '/tmp/' + key 
+1

Bir buçuk saat sonra cevabınızı buluyorum ... Neden bunu açıklığa kavuşturmuyorlar? Teşekkürler! – john

+1

Aynı şeyi merak ediyordum. Sebep için bile zordu! Sevindim sevindim dostum. –

+0

@john AWS bu problemi büyük belgelere sahip! –

-2

Accord

http://boto3.readthedocs.io/en/latest/guide/s3-example-download-file.html nex örnek, nasıl kullanılacağını gösterir, ilk parametre bulut adıdır, ikinci indirilecek yerel yoldur. Öte yandan içinde

enter image description here

, amazaon docs, enter image description here

Böylece, dosyaları oluşturmak için 512 MB olduğunu söylüyor. İşte benim için lambda aws benim kod, çekicilik gibi çalışır.

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

havalı, bu senin kodun ne? Cevabınız soruyu çözerse, lütfen bir açıklama ekleyin ** neden ** çalışıyor. Yoksa, lütfen silin. – sjaustirni

+0

Düzeltildi, daha fazla bilgi ayarlamak zorunda kalmam durumunda bana bildirin –

+0

Sadece bir örnek bile olsa, bir görüntüye kod koymayın. Bunu yaparken, lütfen cevabınızdaki yazım hatalarını düzeltin. Genel olarak, cevap daha iyi oldu. :-D – sjaustirni