es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error de Python pathlib al intentar acceder al archivo del entorno de AWS Lambda durante la ejecución

Estoy utilizando una función Lambda de Python 3.9 con un módulo basado en capas. El módulo requiere que se proporcione una ruta absoluta a un archivo JSON que utiliza para leer/escribir datos durante la ejecución. El acceso ocurre infrecuentemente.

Mi idea era crear el archivo JSON en el entorno Lambda y puedo acceder a él sin problemas utilizando la ruta derivada de:
jsonPath = os.environ['LAMBDA_TASK_ROOT']+"/theFile.json"

Pero el módulo utiliza pathlib y no puedo superar el siguiente error:


Respuesta
{
"errorMessage": "se esperaba un objeto str, bytes o os.PathLike, no NoneType",
"errorType": "TypeError",
"requestId": "dd6f717c-1ede-4906-92cd-de52a441a416",
"stackTrace": [
" Archivo \"/var/task/lambda_function.py\", línea 35, en lambda_handler\n tdSession = TDClient(client_id,redirect_uri,jsonPath)\n",
" Archivo \"/opt/python/td/client.py\", línea 116, en init\n self.credentials_path = pathlib.Path(credentials_path)\n",
" Archivo \"/var/lang/lib/python3.9/pathlib.py\", línea 1082, en new\n self = cls._from_parts(args, init=False)\n",
" Archivo \"/var/lang/lib/python3.9/pathlib.py\", línea 707, en _from_parts\n drv, root, parts = self._parse_args(args)\n",
" Archivo \"/var/lang/lib/python3.9/pathlib.py\", línea 691, en _parse_args\n a = os.fspath(a)\n"
]
}

Parece que se están perdiendo algunos argumentos de ruta, lo que hace que os.fspath() arroje un error. Mi suposición principal es que se debe a proporcionar una ruta relativa.

¿Algún idea sobre cómo puedo hacer que esto funcione? ¿O es un caso en el que necesito usar EFS?

¡Gracias!

Actualización:
Probé esto localmente y tuve el mismo problema tanto con una ruta relativa como con una ruta absoluta. Ahora supongo que podría deberse a cómo se pasa la información de ruta desde el módulo a pathlib. Voy a investigar esto.

Actualización (Respondida):
Encontré el problema y respondo a continuación.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema no está relacionado con la ruta siendo relativa o absoluta, sino más bien con la variable credentials_path siendo de tipo NoneType. Esto podría deberse a que la variable jsonPath no se está pasando correctamente a la clase TDClient.

    Una forma de resolver este problema es verificar si jsonPath tiene un valor antes de pasarlo a la clase TDClient. Por ejemplo:

    if jsonPath:
        tdSession = TDClient(client_id, redirect_uri, jsonPath)
    else:
        # manejar el caso donde jsonPath es None
    

    Otro enfoque es utilizar la clase pathlib.Path para construir la ruta, en lugar de depender de la concatenación de cadenas. Por ejemplo:

    jsonPath = pathlib.Path(os.environ['LAMBDA_TASK_ROOT']) / 'theFile.json'
    

    Esto garantiza que la ruta se cree correctamente, independientemente del sistema operativo y las convenciones de la ruta de archivo.

    En cuanto al uso de EFS, podría ser una opción viable si el archivo JSON necesita ser compartido entre múltiples funciones o instancias de Lambda. Sin embargo, si el acceso al archivo JSON es poco frecuente y está limitado a una sola función de Lambda, crear el archivo dentro del entorno de Lambda y utilizar el enfoque mencionado anteriormente debería ser suficiente.

Comments are closed.