Estou criando um pacote de implantação python AWS Lambda. Estou usando uma solicitação de dependência externa. Instalei a dependência externa usando a documentação AWS http://docs.aws.amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html . Abaixo está o meu código python.
import requests
print('Loading function')
s3 = boto3.client('s3')
def lambda_handler(event, context):
#print("Received event: " + json.dumps(event, indent=2))
# Get the object from the event and show its content type
bucket = event['Records'][0]['s3']['bucket']['name']
key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key']).decode('utf8')
try:
response = s3.get_object(Bucket=bucket, Key=key)
s3.download_file(bucket,key, '/tmp/data.txt')
lines = [line.rstrip('\n') for line in open('/tmp/data.txt')]
for line in lines:
col=line.split(',')
print(col[5],col[6])
print("CONTENT TYPE: " + response['ContentType'])
return response['ContentType']
except Exception as e:
print(e)
print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket))
raise e
Criou o Zip do conteúdo do diretório project-dir e carregou no lambda (Zip o conteúdo do diretório, não o diretório). Quando estou executando a função, recebo o erro mencionado abaixo.
START RequestId: 9e64e2c7-d0c3-11e5-b34e-75c7fb49d058 Version: $LATEST
**Unable to import module 'lambda_function': No module named lambda_function**
END RequestId: 9e64e2c7-d0c3-11e5-b34e-75c7fb49d058
REPORT RequestId: 9e64e2c7-d0c3-11e5-b34e-75c7fb49d058 Duration: 19.63 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 9 MB
Por favor, ajude-me a depurar o erro.
python
amazon-web-services
aws-lambda
Nithin K Anil
fonte
fonte
import lambda_function
que não foi encontrado. Talvez você queirafrom future import lambda_function
? Ou apenas instale lambda_function na linha cmd.Respostas:
O erro ocorreu devido ao nome do arquivo da função lambda. Ao criar a função lambda, ele solicitará o manipulador de função Lambda. Você deve nomeá-lo como seu Python_File_Name.Method_Name . Neste cenário, chamei-o de lambda.lambda_handler (lambda.py é o nome do arquivo).
Encontre abaixo o instantâneo.
fonte
Se você estiver enviando um arquivo zip. Certifique-se de compactar o conteúdo do diretório e não o diretório em si.
fonte
Outra fonte desse problema são as permissões do arquivo compactado. Ele deve ser, pelo menos a nível mundial legível. (min
chmod 444
)Corri o seguinte no arquivo python antes de compactá-lo e funcionou bem.
fonte
0600
que, como você mencionou, não é suficiente. Além disso, o editor de código-fonte Lambda integrado (na página da Web da Amazon) lerá o arquivo sem avisar sobre problemas de permissão.Achei a resposta de Nithin muito útil. Aqui está um guia específico:
Pesquise estes valores:
Com esses valores, você precisaria renomear o manipulador (mostrado na captura de tela) para "cool.lambda_handler". Esta é uma maneira de se livrar da mensagem de erro "Não foi possível importar o módulo 'lambda_function'". Se você fosse renomear o manipulador em seu script python para "sup", seria necessário renomear o manipulador no painel lambda para "cool.sup"
fonte
Existem muitas pegadinhas ao criar pacotes de implantação para AWS Lambda (para Python). Passei horas e horas em sessões de depuração até encontrar uma fórmula que raramente falha.
Criei um script que automatiza todo o processo e, portanto, o torna menos sujeito a erros. Também escrevi um tutorial que explica como tudo funciona. Você pode querer dar uma olhada:
Implantação do Python Lambda sem complicações [Tutorial + Script]
fonte
Aqui está um rápido passo a passo.
Suponha que você tenha uma pasta chamada
deploy
, com seu arquivo lambda chamadolambda_function.py
. Vamos supor que esse arquivo se pareça com isso. (p1
ep2
representam pacotes de terceiros.)import p1 import p2 def lambda_handler(event, context): # more code here return { "status": 200, "body" : "Hello from Lambda!", }
Para cada dependência de terceiros, você precisa
pip install <third-party-package> --target .
de dentro dadeploy
pasta.Depois de fazer isso, veja como sua estrutura deve se parecer.
Finalmente, você precisa de
zip
todo o conteúdo dadeploy
pasta para um arquivo compactado. Em um Mac ou Linux, o comando teria a aparênciazip -r ../deploy.zip *
de dentro dadeploy
pasta. Observe que o-r
sinalizador é para subpastas recursivas.A estrutura do arquivo zip do arquivo deve espelhar a pasta original.
deploy.zip/ ├── lambda_function.py ├── p1/ │ ├── __init__.py │ ├── a.py │ ├── b.py │ └── c.py └── p2/ ├── __init__.py ├── x.py ├── y.py └── z.py
Faça upload do arquivo zip e especifique o
<file_name>.<function_name>
para o Lambda entrar em seu processo, comolambda_function.lambda_handler
no exemplo acima.fonte
zip -r deploy.zip deploy
. Isso criará uma pasta de implantação dentro do arquivo zip.Achei esse caminho difícil depois de tentar todas as soluções acima. Se você estiver usando subdiretórios no arquivo zip, certifique-se de incluir o
__init__.py
arquivo em cada um dos subdiretórios e isso funcionou para mim.fonte
Eu também tive o erro. Acontece que meu arquivo zip inclui a pasta pai do código. Quando eu
unzip
e inspeciono o arquivo zip, olambda_function
arquivo está na pasta pai./lambda
.Use o
zip
comando para corrigir o erro:zip -r ../lambda.zip ./*
fonte
No
lambda_handler
formato deve serlambda_filename.lambda_functionName
. Supondo que você deseja executar alambda_handler
função e ela estálambda_fuction.py
ativada, o formato do manipulador estálambda_function.lambda_handler
.Outro motivo para obter esse erro são as dependências do módulo.
Você
lambda_fuction.py
deve estar no diretório raiz do arquivo zip.fonte
@nithin, a AWS lançou o
layers
conceito deLambda
funções internas . Você pode criar sua camada e lá você pode carregar tanto quanto bibliotecas e então você pode conectar a camada com as funções lambda. Para mais detalhes: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.htmlfonte
Uma perspectiva de 2019:
O AWS Lambda agora oferece suporte a Python 3.7, que muitas pessoas (inclusive eu) optam por usar como o tempo de execução para lambdas em linha.
Então eu tive que importar uma dependência externa e segui o AWS Docs como o OP referido. (instalação local -> zip -> upload).
Eu tive o erro do módulo de importação e percebi que meu PC local tinha Python 2.7 como o Python padrão. Quando invoquei o pip, ele instalou minha dependência para Python 2.7.
Portanto, mudei localmente para a versão Python que corresponde à versão de tempo de execução selecionada no console lambda e reinstalei as dependências externas. Isso resolveu o problema para mim. Por exemplo:
fonte
Eu tive o mesmo problema, este era um exercício como parte de um tutorial no lynda.com, se não estou errado. O erro que cometi foi não selecionar o runtime como Python 3.6, que é uma opção no console de funções lamda.
fonte
O problema aqui que a versão Python usada para construir suas dependências de função Lambda (em sua própria máquina) é diferente da versão Python selecionada para sua função Lambda. Este caso é comum, especialmente se a biblioteca Numpy fizer parte de suas dependências.
Exemplo: a versão python de sua máquina: 3.6 ---> Lambda python versão 3.6
fonte
Você precisa compactar todos os requisitos, use este script
#!/usr/bin/env bash rm package.zip mkdir package pip install -r requirements.txt --target package cat $1 > package/lambda_function.py cd package zip -r9 "../package.zip" . cd .. rm -rf package
usar com:
fonte
Compartilhando minha solução para o mesmo problema, apenas no caso de ajudar alguém.
Problema: recebi o erro: "[ERROR] Runtime.ImportModuleError: Não foi possível importar o módulo 'lambda_function': Nenhum módulo chamado 'StringIO'" ao executar o código do aws-big-data-blog [1] fornecido no artigo da AWS [2].
Solução: Tempo de execução alterado de Python 3.7 para Python 2.7
[1] - https://github.com/bsnively/aws-big-data-blog/blob/master/aws-blog-vpcflowlogs-athena-quicksight/CloudwatchLogsToFirehose/lambdacode.py [2] - https: // aws .amazon.com / blogs / big-data / analisando-vpc-flow-logs-with-amazon-kinesis-firehose-amazon-athena-and-amazon-quicksight /
fonte
Você pode configurar sua função Lambda para obter código e conteúdo adicionais na forma de camadas. Uma camada é um arquivo ZIP que contém bibliotecas, um tempo de execução personalizado ou outras dependências. Com camadas, você pode usar bibliotecas em sua função sem precisar incluí-las em seu pacote de implantação. As camadas permitem que você mantenha seu pacote de implantação pequeno, o que torna o desenvolvimento mais fácil.
Referências:-
fonte
Certifique-se de compactar todas as dependências em uma estrutura de pastas como python / [Suas todas as dependências] para que funcione de acordo com esta documentação.
https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html#configuration-layers-path
fonte
Meu problema era que o arquivo .py e as dependências não estavam no diretório "raiz" do zip. por exemplo, o caminho das bibliotecas e da função lambda .py deve ser:
não
/foo/bar/<name of library>/foo2/bar2
Por exemplo:
drwxr-xr-x 3.0 unx 0 bx stor 20-Apr-17 19:43 boto3/ec2/__pycache__/ -rw-r--r-- 3.0 unx 192 bx defX 20-Apr-17 19:43 boto3/ec2/__pycache__/__init__.cpython-37.pyc -rw-r--r-- 3.0 unx 758 bx defX 20-Apr-17 19:43 boto3/ec2/__pycache__/deletetags.cpython-37.pyc -rw-r--r-- 3.0 unx 965 bx defX 20-Apr-17 19:43 boto3/ec2/__pycache__/createtags.cpython-37.pyc -rw-r--r-- 3.0 unx 7781 tx defN 20-Apr-17 20:33 download-cs-sensors-to-s3.py
fonte
Na verdade, vá para a pasta principal (pacote de implantação) que deseja compactar,
Dentro dessa pasta, selecione todos os arquivos e, em seguida, crie o zip e carregue esse zip
fonte
Adicione abaixo um depois
Import requests
import boto3
O que posso ver que está faltando em seu código.
fonte
Não há necessidade de fazer essa bagunça.
use python-lambda
https://github.com/nficano/python-lambda
com um único comando,
pylambda deploy
ele implantará automaticamente sua funçãofonte