¿Cómo soluciono los errores «permiso denegado» o «no se puede importar el módulo» al cargar un paquete de despliegue de Lambda?

5 minutos de lectura
0

Cuando cargo mi paquete de despliegue de AWS Lambda, aparece el error «permiso denegado» o «no se puede importar el módulo».

Breve descripción

Lambda requiere permisos de lectura globales en los archivos de código y en cualquier biblioteca dependiente de su paquete de despliegue. Si no configura el paquete de despliegue de Lambda con los permisos de seguridad correctos, Lambda devolverá un error al intentar cargar el archivo. Los errores permiso denegado y no se puede importar el módulo suelen producirse cuando las aplicaciones de integración continua crean paquetes de despliegue.

En las versiones ejecutables interpretadas, como Python, el permiso correcto para los archivos del paquete de despliegue es 644. En las carpetas del paquete de despliegue, el permiso correcto es 755.

En las versiones ejecutables compiladas, como Go, el permiso correcto para los archivos y directorios ejecutables en un paquete de despliegue es 755 en notación numérica de permisos de Unix.

Nota: Dado que Lambda usa permisos POSIX, se recomienda usar un sistema operativo (SO) compatible con POSIX al compilar paquetes de despliegue de Lambda. Los sistemas operativos compatibles incluyen Linux, Unix o macOS. La igualdad entre el modelo de permisos de su entorno de compilación y el entorno de versión ejecutable de Lambda reduce la posibilidad de que se produzcan problemas de permisos.

Para solucionar un problema de permisos como usuario de Windows, realice una de las siguientes tareas para configurar un entorno Linux:

Solución

Cómo buscar el archivo o la carpeta que está causando el error

Según el lenguaje de programación que haya utilizado para escribir el código de la función de Lambda, es posible que la causa del error no esté clara en el mensaje de error.

Por ejemplo, un mensaje de error de la función de Node.js muestra el nombre del archivo o la carpeta que es el origen del error. Sin embargo, un mensaje de error de una función de Python no muestra el nombre del archivo o la carpeta que es el origen del error.

Ejemplo de error de denegación de permiso de una función de Lambda de Node.js

{  "errorMessage": "EACCES: permission denied, open '/var/task/index.js'",      "errorType": "Error",  
    "stackTrace": [  
    "Object.fs.openSync (fs.js:641:18)",  
    "Object.fs.readFileSync (fs.js:509:33)",  
    "Object.Module._extensions..js (module.js:578:20)",  
    "Module.load (module.js:487:32)",  
    "tryModuleLoad (module.js:446:12)",  
    "Function.Module._load (module.js:438:3)",  
    "Module.require (module.js:497:17)",  
    "require (internal/module.js:20:19)"  
  ]   
}

Ejemplo de error de una función de Lambda de Python que no puede importar el módulo

«Unable to import module 'index': No module named index»

Para solucionar este error, consulte ¿Cómo puedo solucionar el error «Unable to import module» que se muestra cuando ejecuto código Lambda en Python?

Si su paquete de despliegue de Lambda no es Amazon Linux 2 o Amazon Linux 2023, debe hacer coincidir la compatibilidad con las versiones de Amazon Linux. Para ello, utilice los siguientes parámetros al instalar el paquete. El siguiente ejemplo usa un sistema operativo Python 3.12 y bibliotecas NumPy en la misma carpeta donde está la función de Lambda:

pip3 install --platform manylinux2014_x86_64 --target . --python-version 3.12 --only-binary=:all: numpy

Según su caso de uso, ajuste los siguientes valores: 

  • El valor platform manylinux2014_x86_64 especifica la plataforma del paquete.
  • El valor python-version 3.12 indica que el paquete es compatible con la versión de Python especificada. Ajuste este valor de acuerdo con la versión ejecutable de Python a la que se dirige en Lambda.
  • El parámetro only-binary=:all indica a pip que descargue solo archivos binarios. Esto garantiza que el paquete sea compatible con el entorno de versión ejecutable de Lambda.

Ejemplo de un error de la función de Lambda de Python para bibliotecas externas a las que les faltan los permisos necesarios

«Unable to import module 'index': No module named requests»

Para comprobar los permisos de todos los archivos y carpetas del archivo.zip del paquete de despliegue, ejecute el comando zipinfo en la interfaz de la línea de comandos (CLI):

zipinfo lambda-package.zip

Nota: Sustituya lambda-package.zip por el nombre del archivo.zip del paquete de despliegue.

Ejemplo de respuesta del comando zipinfo

Archive:  lambda-package.zipZip file size: 305 bytes, number of entries: 1-r--------  3.0 unx      188 tx defN 21-Feb-13 20:48 example.py
1 file, 188 bytes uncompressed, 135 bytes compressed:  28.2%

Nota: En el ejemplo anterior, el permiso para example.py es -r-------- o 400 en notación numérica de permisos de Unix. Actualice el permiso del archivo a 644. Para obtener más información, consulte Notation of traditional Unix permissions en el sitio web de Wikipedia.

Actualización de los permisos de su paquete de despliegue

Nota: Los siguientes comandos solo funcionan con Linux, Unix y macOS.

  1. Para desempaquetar los archivos y carpetas del paquete de despliegue en una carpeta temporal, ejecute el siguiente comando en la CLI:

    mkdir temp-folder; unzip lambda-package.zip -d temp-folder ;cd temp-folder;ls -l

    Nota: Sustituya lambda-package.zip por el nombre del archivo del paquete de despliegue y temp-folder por el nombre de la carpeta temporal.

  2. Actualice los permisos de los archivos de la biblioteca.
    Nota: Para que los directorios sean ejecutables y que todos los usuarios puedan leer todos los archivos y carpetas del paquete de despliegue descomprimido, ejecute el comando chmod:

    $ sudo chmod 644 $(find -type f) && chmod 755 $(find -type d)

    Para que los archivos del paquete de despliegue descomprimidos sean ejecutables en versiones ejecutables compiladas, ejecute el siguiente comando:

    $ chmod 755 -R
  3. Tras corregir los permisos, ejecute el siguiente comando para volver a empaquetar los archivos y la carpeta en un nuevo archivo .zip:

    zip -r new-lambda-package.zip *
  4. Cargue el nuevo paquete de despliegue.

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 3 meses