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.
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