Não é possível importar o módulo 'lambda_function': Nenhum módulo denominado *
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
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:
Crie uma pasta vazia, por exemplo
mylayer.Vá para a pasta e crie o
requirements.txtarquivo com o conteúdo de
instabot
- 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"
- 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.
- Crie uma camada como zip:
zip -9 -r mylayer.zip python
Crie a camada lambda com base no
mylayer.zipAWS Console. Não se esqueça de especificarCompatible runtimesparapython3.8.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.
- 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!')
}