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