Não é possível importar o módulo 'lambda_function': Nenhum módulo denominado *

Oct 12 2020

Estou tentando executar uma função lambda do python que usa pacotes adicionais. No entanto, sempre que faço upload do arquivo .zip para o console lambda, recebo o erro:

{
  "errorMessage": "Unable to import module 'lambda_function': No module named '*'",
  "errorType": "Runtime.ImportModuleError"
}

Eu segui estas instruções: https://docs.aws.amazon.com/lambda/latest/dg/python-package.html#python-package-dependencies que me disse para ter certeza de que meus pacotes estavam em um diretório local para minha função lambda:

~/my-function$ pip install --target ./package Pillow

Não estou usando travesseiro. Este é um exemplo de código do site deles. Também não estou usando um pacote que você já pode acessar no Lambda. É um que eu peguei no github e preciso anexar ao meu aplicativo.

No início, isso não funcionou, então criei um setup.cfgarquivo e adicionei:

[install]
prefix= 

Agora, quando eu uso o pipcomando para instalar no destino, ele funciona (e também adiciona várias outras pastas além do meu pacote, mas presumi que fossem necessárias, então as deixei lá.

Quando entro no diretório, o pacote está lá.

Então encontrei esta resposta: https://stackoverflow.com/a/12493244/5675125 o que sugeria que talvez alguns arquivos ocultos não estivessem sendo incluídos e é assim que devo compactá-los.

Novamente o mesmo erro.

Como faço para que lambda reconheça que meu pacote está lá.

Respostas

1 Marcin Oct 12 2020 at 10:28

Se você precisar de Pillow, a maneira mais fácil de usá-lo em sua função é por meio de um repositório popular com camadas públicas (incluindo travesseiro), como keithrozario / Klayers no github. Para usá-lo, você localizaria o ARN da camada com base em sua região . A lista de ARNs para python 3.8 está aqui .

Por exemplo, para us-east-1a camada adicionada para Python 3.7 seria:

Atualizar

Acabei de criar a camada personalizada com instabote posso confirmar que funciona.

A técnica usada inclui a ferramenta docker descrita no recente blog da AWS :

  • Como faço para criar uma camada Lambda usando um ambiente Lambda simulado com Docker?

Assim, para esta questão, verifiquei da seguinte forma:

  1. Crie uma pasta vazia, por exemplo mylayer.

  2. Vá para a pasta e crie o requirements.txtarquivo com o conteúdo de

instabot
  1. Execute o seguinte comando docker:
docker run -v "$PWD":/var/task "lambci/lambda:build-python3.8" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.8/site-packages/; exit"
  1. Remover numpy

O instabotrequer numpyque é muito grande. Então, nós o removemos manualmente, antes de criar uma camada. Em numpyvez disso, usaremos a camada fornecida pela AWS.

sudo rm -rvf ./python/lib/python3.8/site-packages/numpy*

Se não removermos o numpy, a camada terá> 50 MB.

  1. Crie uma camada como zip:
zip -9 -r mylayer.zip python 
  1. Crie a camada lambda com base no mylayer.zipAWS Console. Não se esqueça de especificar Compatible runtimespara python3.8.

  2. Adicione duas camadas à sua função:

O primeiro é AWSLambda-Python38-SciPy1xfornecido pela AWS com numpy, enquanto o segundo é o que criamos acima. Portanto, sua função usará duas camadas.

  1. Teste a camada em lambda usando a seguinte função lambda:
import json

from instabot import Bot

def lambda_handler(event, context):
    # TODO implement
    
    bot = Bot(base_path='/tmp')
    
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }