pass log library home east aws python amazon-s3 lambda io

log - Error del sistema de archivos de solo lectura de Python con S3 y Lambda al abrir un archivo para leer



aws lambda python log (3)

Estoy viendo el siguiente error de mi función lambda cuando suelto un archivo.csv en un contenedor S3. El archivo no es grande e incluso agregué una suspensión de 60 segundos antes de abrir el archivo para leerlo, pero por alguna razón, el archivo tiene el extra ".6CEdFe7C" adjunto. ¿Porqué es eso?

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

Código:

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)

El resultado de lo anterior es:

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

Si la clave / archivo es "file.csv", ¿por qué el método s3.download_file intenta descargar "file.csv.6CEdFe7C"? Supongo que cuando se activa la función, el archivo es file.csv.xxxxx, pero cuando llega a la línea 75, ¿se cambia el nombre del archivo a file.csv?


De acuerdo con http://boto3.readthedocs.io/en/latest/guide/s3-example-download-file.html

El ejemplo muestra cómo usar el primer parámetro para el nombre de la nube y el segundo parámetro para la descarga de la ruta local.

Por otro lado, los documentos amazaon , dice.

Por lo tanto, tenemos 512 MB para crear archivos. Aquí está mi código para mí en aws lambda, para mí funciona como amuleto.

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


Noté que cuando cargué un código para lambda directly as a zip file , pude escribir solo en la carpeta /tmp , pero cuando subí el código de S3 también pude escribir en la project root folder del project root folder .


Sólo /tmp parece que se puede escribir en AWS Lambda.

Por lo tanto esto funcionaría:

filepath = ''/tmp/'' + key