Ich erhalte den Fehler unten von meiner Lambda-Funktion, wenn ich eine file.csv in einen S3-Bucket ablege. Die Datei ist nicht groß und ich habe sogar einen 60 Sekunden langen Ruhezustand hinzugefügt, bevor die Datei zum Lesen geöffnet wurde, aber aus irgendeinem Grund hat die Datei das zusätzliche ".6CEdFe7C" hinzugefügt. Warum das?
[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)
Das Ergebnis der obigen Ausführungen ist:
mytestbucket
file.csv
/file.csv
[Errno 30] Read-only file system: u'/file.csv.6CEdFe7C'
Wenn der Schlüssel/die Datei "file.csv" ist, warum versucht die s3.download_file-Methode "file.csv.6CEdFe7C" herunterzuladen? Ich vermute, wenn die Funktion ausgelöst wird, ist die Datei file.csv.xxxxx, aber wenn sie in Zeile 75 steht, wird die Datei in file.csv umbenannt.
Nur /tmp
scheint in AWS Lambda beschreibbar zu sein.
Deshalb würde dies funktionieren:
filepath = '/tmp/' + key
Laut http://boto3.readthedocs.io/de/latest/guide/s3-example-download-file.html
Das Beispiel zeigt, wie der erste Parameter für den Cloud-Namen und der zweite Parameter für den lokalen Pfad zum Herunterladen verwendet werden.
auf der anderen Seite die amazaon docs , sagt
Also, wir haben 512 MB für das Erstellen von Dateien .. Hier ist mein Code für mich in Lambda aws, für mich funktioniert es wie Charme.
.download_file(Key=nombre_archivo,Filename='/tmp/{}'.format(nuevo_nombre))
Ich habe beim Hochladen eines Codes für Lambda directly as a Zip file
festgestellt, dass ich nur in den /tmp
-Ordner schreiben konnte, aber als ich den Code von S3
hochgeladen habe, konnte ich auch in den project root folder
schreiben.