web-dev-qa-db-de.com

Python Schreibgeschütztes Dateisystem Fehler Beim Öffnen einer Datei zum Lesen mit S3 und Lambda

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.

23
user1530318

Nur /tmp scheint in AWS Lambda beschreibbar zu sein.

Deshalb würde dies funktionieren:

filepath = '/tmp/' + key
74
joonas.fi

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.

 enter image description here

auf der anderen Seite die amazaon docs , sagt  enter image description here

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))
2
Te ENe Te

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.

0
Pavlo Kovalchuk