Ir para o conteúdo

Como resolvo os erros “Cannot find module” ou “Cannot find Package” ao executar o código do Lambda no Node.js?

4 minuto de leitura
0

Eu recebo o erro “Cannot find module” ou “Cannot find Package” quando executo o código do AWS Lambda no Node.js.

Breve descrição

Se seu ambiente do Lambda não conseguir encontrar a biblioteca especificada no código Node.js, você receberá um destes erros. Eles ocorrem porque o Lambda não vem pré-empacotado com todas as bibliotecas do Node.js.

Se um módulo estiver faltando com o CommonJS, você receberá o seguinte erro: Runtime.ImportModuleError: Erro: Não é possível encontrar o módulo.

Se um módulo estiver faltando com o JavaScript ES6, você receberá o seguinte erro: Error [ERR_MODULE_NOT_FOUND]: Cannot find package.

Resolução

Para resolver esses erros, crie um pacote de implantação ou uma camada do Lambda que inclua as bibliotecas que você deseja usar em seu código Node.js.

Para runtimes do Node.js 16 e anteriores, o Lambda não tem suporte às dependências do módulo ES do JavaScript em camadas. Você deve incluir as dependências na implantação. O Lambda tem suporte às dependências do módulo ES do JavaScript para o Node.js 20.

Crie uma camada do Lambda em vez de um pacote de implantação para que você possa reutilizar a camada em várias funções do Lambda. Cada runtime do Lambda adiciona pastas específicas do diretório /opt à variável PATH. Se a camada usar a mesma estrutura de pastas, o código da função do Lambda poderá acessar o conteúdo da camada sem especificar o caminho.

Importante: a biblioteca que você importa para o Node.js deve estar dentro da estrutura de pastas nodejs/node_modules.

Recomenda-se criar a camada do Lambda no mesmo sistema operacional (SO) no qual o runtime do Lambda se baseia. Por exemplo, todas as versões do Node.js são baseadas em imagens de máquina da Amazon (AMIs) do Amazon Linux 2023.

Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solução de problemas da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.

Para criar uma camada Lambda para uma biblioteca Node.js, conclua as seguintes etapas:

  1. Crie uma instância do Amazon Elastic Compute Cloud (Amazon EC2) a partir de uma AMI do Amazon Linux 2.

  2. Crie um perfil do AWS Identity and Access Management (AWS IAM) com permissões para chamar a API publish-layer-version.

  3. Anexe o perfil do IAM à instância do Amazon EC2.
    Observação: sua instância do EC2 agora tem permissões para fazer upload de camadas Lambda para a chamada de API publish-layer-version.

  4. Use o SSH para se conectar à sua instância do EC2.

  5. Instale o Node.js:

    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash$ . ~/.nvm/nvm.sh
    nvm install node
    
  6. Crie uma pasta nodejs:

    mkdir nodejs
    
  7. Instale a biblioteca aws-xray-sdk na pasta nodejs:

    cd nodejs$ npm init  ***answer all queries for initialization that create a package.json file***
    npm install --save aws-xray-sdk
    

    Observação: substitua a biblioteca de exemplo aws-xray-sdk pela biblioteca Node.js que você deseja importar.

  8. Crie um arquivo zip para a biblioteca aws-xray-sdk:

    zip -r layer.zip nodejs
    

    Observação: a biblioteca aws-xray-sdk está no formato de pasta necessário para uma camada do Node.js: nodejs/node_modules.

  9. Para publicar a camada do Lambda, execute o seguinte comando publish-layer-version:

    aws lambda publish-layer-version --layer-name xray --zip-file fileb://layer.zip --compatible-runtimes nodejs12.x --region your-region
    

    Observação: substitua your-region pela sua região da AWS.

Para adicionar módulos ECMAScript 6 (ES6) ou CommonJS em seu código, consulte a sintaxe JavaScript ES6/CommonJS.

Informações relacionadas

Como soluciono os erros de “permission denied” ou “unable to import module” ao fazer o upload de um pacote de implantação do Lambda?

Como faço para criar um pacote de implantação do Lambda para o Node.js?

AWS OFICIALAtualizada há 10 meses