Como soluciono os erros de “permissão negada” ou “não foi possível importar o módulo” ao fazer o upload de um pacote de implantação do Lambda?

5 minuto de leitura
0

Quando faço o upload do meu pacote de implantação do AWS Lambda, recebo um erro de “permissão negada” ou “não foi possível importar o módulo”.

Breve descrição

O Lambda exige permissões globais de leitura em arquivos de código e em qualquer biblioteca dependente em seu pacote de implantação. Se você não configurar seu Pacote de implantação do Lambda com as permissões de segurança corretas, o Lambda retornará um erro quando você tentar fazer o upload do arquivo. Os erros de permissão negada e não foi possível importar o módulo geralmente ocorrem quando aplicativos de integração contínua criam pacotes de implantação.

Para runtimes interpretados, como Python, a permissão correta para os arquivos no pacote de implantação é 644. Para pastas no pacote de implantação, a permissão correta é 755.

Para runtimes compilados, como Go, a permissão correta para arquivos e diretórios executáveis em um pacote de implantação é 755 na notação numérica de permissões Unix.

Observação: como o Lambda usa permissões POSIX, é uma prática recomendada usar um sistema operacional (SO) compatível com POSIX ao criar pacotes de implantação do Lambda. Os sistemas operacionais compatíveis incluem Linux, Unix ou macOS. A igualdade entre o modelo de permissões em seu ambiente de construção e o ambiente de execução do Lambda reduz a chance de problemas de permissões.

Para corrigir um problema de permissão como usuário do Windows, conclua uma das seguintes tarefas para configurar um ambiente Linux:

Resolução

Encontre o arquivo ou a pasta que está causando o erro

Dependendo da linguagem de programação usada para escrever seu código de função do Lambda, a causa do erro pode não estar clara na mensagem de erro.

Por exemplo, uma mensagem de erro da função Node.js lista o nome do arquivo ou da pasta que é a origem do erro. No entanto, uma mensagem de erro da função Python não lista o nome do arquivo ou da pasta que é a origem do erro.

Exemplo de um erro de permissão negada da função do Lambda 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)"  
  ]   
}

Exemplo de um erro da função do Lambda Python incapaz de importar o módulo

“Não foi possível importar o módulo 'index': Nenhum módulo chamado index”

Para corrigir este erro, consulte Como resolvo o erro “Não foi possível importar o módulo” que aparece quando executo o código do Lambda no Python?

Se o seu pacote de implantação do Lambda não for o Amazon Linux 2 ou o Amazon Linux 2023, você deverá combinar a compatibilidade com as versões do Amazon Linux. Para fazer isso, use os parâmetros a seguir ao instalar o pacote. O exemplo a seguir usa um sistema operacional Python 3.12 e bibliotecas NumPy na mesma pasta em que a função do Lambda está:

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

Com base no seu caso de uso, ajuste os seguintes valores: 

  • O valor da plataforma manylinux2014_x86_64 especifica a plataforma do pacote.
  • O valor python-version 3.12 indica que o pacote é compatível com a versão especificada do Python. Ajuste esse valor de acordo com a versão de runtime do Python que você almeja no Lambda.
  • O parâmetro only-binary=:all instrui o pip a baixar somente binários. Isso garante que o pacote seja compatível com o ambiente de runtime do Lambda.

Exemplo de um erro de função do Lambra Python para bibliotecas externas que não têm as permissões necessárias

“Não foi possível importar o módulo 'index': Nenhum módulo chamado requests”

Para verificar as permissões de todos os arquivos e pastas no arquivo .zip do pacote de implantação, execute o comando zipinfo na sua interface de linha de comandos (CLI):

zipinfo lambda-package.zip

Observação: substitua lambda-package.zip pelo nome do arquivo .zip do seu pacote de implantação.

Exemplo de resposta do 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%

Observação: no exemplo anterior, a permissão para example.py é -r-------- ou 400 na notação numérica de permissões Unix. Atualize a permissão do arquivo para 644. Para obter mais informações, consulte Notação das permissões tradicionais do Unix no site da Wikipedia.

Atualize as permissões do seu pacote de implantação

Observação: os comandos a seguir funcionam somente para Linux, Unix e macOS.

  1. Para descompactar os arquivos e pastas dentro do seu pacote de implantação em uma pasta temporária, execute o seguinte comando na sua CLI:

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

    Observação: substitua lambda-package.zip pelo nome do arquivo do pacote de implantação e temp-folder pelo nome da pasta temporária.

  2. Atualize as permissões dos arquivos da biblioteca.
    Observação: para tornar os diretórios executáveis e todos os arquivos e pastas no pacote de implantação descompactado legíveis por qualquer usuário, execute o comando chmod:

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

    Para tornar os arquivos do pacote de implantação descompactado executáveis para runtimes compilados, execute o seguinte comando:

    $ chmod 755 -R
  3. Depois de corrigir as permissões, execute o comando a seguir para reempacotar os arquivos e a pasta em um novo arquivo .zip:

    zip -r new-lambda-package.zip *
  4. Faça o upload do novo pacote de implantação.

AWS OFICIAL
AWS OFICIALAtualizada há 3 meses