Serverless: Invoke Local para Python no puede encontrar el módulo controlador

Creado en 30 ene. 2017  ·  3Comentarios  ·  Fuente: serverless/serverless

1. Si tiene una pregunta y no una solicitud de error / función, hágalo en http://forum.serverless.com 2. Verifique si ya existe un problema para que no haya duplicados 3. Consulte y siga nuestras Pautas: https://github.com/serverless/serverless/blob/master/CONTRIBUTING.md 4. Complete toda la plantilla para que tengamos una buena descripción general del problema 5. No elimine ninguna sección de la plantilla. Si algo no es aplicable, déjelo en blanco, pero déjelo en el número 6. Siga la plantilla, de lo contrario, tendremos que pedirle que lo actualice.

Este es un (Informe de error)

Descripción

Para informes de errores:

  • ¿Qué salió mal?

Usando serverless v1.6.0 Estoy tratando de ejecutar una función lambda de Python localmente, pero recibo un error de que no se pudo encontrar mi módulo controlador.

Anticipaba que esto funcionaría ya que esta función se implementó en # 2862

Sospecho que esto podría deberse a la estructura de mi carpeta. En mi caso, el código de Python se almacena en src/serverless_lambda.py , uso un entorno virtual activado y setup.py.

El setup.py está configurado de tal manera que Python puede encontrar módulos en la carpeta src/* pero parece que serverless invoke local no puede encontrar el paquete de la misma forma que Python / pip.

(venv) $:serverless-lambda-template gmetzker$ serverless invoke local --function serverlessLambda --data '{"command": "joke"}'
Traceback (most recent call last):
  File "/Users/gmetzker/hli-git/serverless-lambda-template/node_modules/serverless/lib/plugins/aws/invokeLocal/invoke.py", line 56, in <modul
e>

    module = import_module(args.handler_path.replace('/', '.'))
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
ImportError: No module named serverless_lambda

Así es como creo la configuración de mi proyecto:

-- src
    -- __init__.py
    -- serverless_lambda.py
-- serverless.yml
-- setup.py
-- venv
  1. Crea un entorno virtual
virtualenv venv
  1. Activar entorno virtual
source ./venv/bin/activate
  1. Cree setup.py en el directorio raíz para buscar módulos en /src/serverless_lambda
from setuptools import Command, find_packages, setup


setup(
    name='serverless-lambda',
    version="1.0.0",
    author = 'Gary Metzker',
    py_modules='src/serverless_lambda',
    install_requires=[
        'boto3',
        'requests'
    ],
    packages = find_packages('src'),
    package_dir={'':'src'},
    extras_require = {
        'test': ['coverage', 'pytest', 'pytest-cov', 'pytest-json', 'mock'],
    },
    entry_points='''
        [console_scripts]
        serverless-lambda=serverless_lambda:main
    '''

)
  1. Instalar dependencias de pip (forma de origen setup.py )
pip install --editable .
  1. Cree el archivo serverless.yml en la raíz del proyecto.

service: serverlessLambdaTemplate

custom:
  stage: ${opt:stage, self:provider.stage}
  lambdaBaseName: serverless-template-lambda

provider:
  name: aws
  runtime: python2.7
  stage: dev
  region: us-west-2  

package:
  # Use package.sh to create package.zip before deploying.
  artifact: package.zip


functions:
  serverlessLambda:
    name: serverless-template-lambda-${self:custom.stage}
    handler: serverless_lambda.entry_point
  1. Intente ejecutar sin servidor localmente:
serverless invoke local --function serverlessLambda --data '{"command": "joke"}'

La otra cosa a tener en cuenta, cuando implemento mi lambda, normalmente tengo un script package.sh separado que uso para crear el artefacto package.zip . En el script, comprima todos los archivos *.py de src/* en la raíz del zip. Además, los paquetes de sitio del entorno virtual se agregan al zip.

  • ¿Qué esperabas que debería haber pasado?
    Esperaría que sin servidor pudiera usar el mismo contexto de paquete que se especificó en setup.py y se registró en el entorno virtual con pip install --editable . .

Debería poder encontrar src/serverless_lambda.py

  • ¿Cuál fue la configuración que usaste?
    Véase más arriba.

  • ¿Qué seguimiento de pila o mensaje de error de su proveedor vio?

Error

Traceback (most recent call last):
  File "/Users/gmetzker/hli-git/serverless-lambda-template/node_modules/serverless/lib/plugins/aws/invokeLocal/invoke.py", line 56, in <modul
e>

    module = import_module(args.handler_path.replace('/', '.'))
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
ImportError: No module named serverless_lambda

Para propuestas de funciones:

  • ¿Cuál es el caso de uso que debería resolverse? Cuanto más detalle describa esto, más fácil será de entender para nosotros.
  • Ejecutar local para funciones de python lambda
  • Utilice entornos virtuales de Python para un entorno de desarrollo más limpio
  • Almacene el código fuente en una carpeta anidada como /src/lambda_handler.py para que la estructura del directorio sea más limpia y el código fuente esté separado.
  • Use lambda setup.py para instalar limpiamente las dependencias de Python y especificar las ubicaciones de los paquetes y módulos.
  • Utilice package.sh script /src/*.py y archivos de entorno virtual en un lambda.zip. Hago esto por separado para nuestro sistema CI / CD.

    • Si hay una configuración adicional, ¿cómo se vería?

Problemas similares o dependientes:

  • N.º 2862

Datos adicionales

  • Versión de Serverless Framework que está utilizando :
    1.6.0
  • Sistema operativo :
    OSX

  • Seguimiento de pila :

  • Mensajes de error del proveedor :
bug

Comentario más útil

No estoy seguro si esto está relacionado con el problema mencionado anteriormente, pero si alguien viene aquí a través de Google, intente esto:

npm install serverless --save-dev;
./node_modules/serverless/bin/serverless invoke local --function transferContent --data '{"content_type":"scholarship"}'

Todos 3 comentarios

Para el empaquetado para la implementación, es posible que desee verificar los requisitos de python sin servidor. Yo también lo escribí, pero aún necesito una versión estable de 2.0.0.

Cerrar este problema desde # 3346 debería haberlo resuelto (ver: https://github.com/serverless/serverless/pull/3346#issuecomment-285469254).

¡No dude en volver a abrir si el problema persiste!

No estoy seguro si esto está relacionado con el problema mencionado anteriormente, pero si alguien viene aquí a través de Google, intente esto:

npm install serverless --save-dev;
./node_modules/serverless/bin/serverless invoke local --function transferContent --data '{"content_type":"scholarship"}'

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

rdehnhardt picture rdehnhardt  ·  3Comentarios

cspeer picture cspeer  ·  3Comentarios

kevindiamond picture kevindiamond  ·  3Comentarios

chris-hailstorm picture chris-hailstorm  ·  3Comentarios

davepwsmith picture davepwsmith  ·  3Comentarios