Serverless: Invoke Local forPythonがハンドラモジュールを見つけられない

作成日 2017年01月30日  ·  3コメント  ·  ソース: serverless/serverless

1.バグ/機能のリクエストではなく質問がある場合は、http://forum.serverless.comで質問してください。2。重複がないように、問題がすでに存在するかどうかを確認してください。3。チェックしてガイドラインに従ってください。 https://github.com/serverless/serverless/blob/master/CONTRIBUTING.md 4.テンプレート全体に記入して、問題の概要を把握します。5。テンプレートのどのセクションも削除しないでください。 該当しないものがある場合は、空のままにして、問題6に残してください。テンプレートに従ってください。そうでない場合は、更新するように求められます。

これは(バグレポート)です

説明

バグレポートの場合:

  • 何が悪かったのか?

サーバーレスv1.6.0を使用してPythonラムダ関数をローカルで実行しようとしていますが、ハンドラーモジュールが見つからないというエラーが表示されます。

この機能が#2862で実装されたので、これが機能することを期待していました

これは私のフォルダ構造が原因である可能性があります。 私の場合、Pythonコードはsrc/serverless_lambda.pyに保存されており、アクティブ化された仮想環境とsetup.pyを使用しています。

setup.pyは、Pythonがsrc/*フォルダー内のモジュールを見つけることができるように設定されていますが、 serverless invoke localは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

これが私のプロジェクトのセットアップを作成する方法です:

-- src
    -- __init__.py
    -- serverless_lambda.py
-- serverless.yml
-- setup.py
-- venv
  1. 仮想環境を作成する
virtualenv venv
  1. 仮想環境をアクティブ化する
source ./venv/bin/activate
  1. ルートディレクトリにsetup.pyを作成して、 /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. pipの依存関係をインストールします(ソース形式setup.py
pip install --editable .
  1. プロジェクトルートにserverless.ymlファイルを作成します。

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. サーバーレスをローカルで実行しようとします。
serverless invoke local --function serverlessLambda --data '{"command": "joke"}'

もう1つ注意すべき点は、ラムダをデプロイするとき、通常、アーティファクトpackage.zipを作成するために使用する個別のpackage.shスクリプトがあります。 スクリプトで、すべての*.pyファイルをsrc/*からzipのルートに圧縮します。 さらに、仮想環境サイトパッケージがzipに追加されます。

  • 何が起こったはずだと思いましたか?
    私は、そのサーバレスで指定された同じパッケージのコンテキスト使用することができ期待setup.pyとして仮想環境に登録pip install --editable .

src/serverless_lambda.pyを見つけることができるはずです

  • 使用した構成は何でしたか?
    上記を参照。

  • プロバイダーからのスタックトレースまたはエラーメッセージはどのようなものでしたか?

エラー

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

機能提案の場合:

  • 解決すべきユースケースは何ですか。 あなたがこれをより詳細に説明するほど、私たちにとって理解しやすくなります。
  • Pythonラムダ関数に対してローカルで実行
  • よりクリーンな開発環境のためにPython仮想環境を使用する
  • ソースコードを/src/lambda_handler.pyようなネストされたフォルダに保存して、ディレクトリ構造がよりクリーンになり、ソースコードが分離されるようにします。
  • ラムダsetup.pyを使用して、Pythonの依存関係をクリーンにインストールし、パッケージとモジュールの場所を指定します。
  • 個別のpackage.shスクリプトを使用して、 /src/*.pyファイルと仮想環境ファイルをlambda.zipにバンドルします。 これは、CI / CDシステムに対して個別に行います。

    • 追加の構成がある場合、どのように表示されますか

類似または依存する問題:

  • #2862

追加データ

  • 使用しているサーバーレスフレームワークのバージョン
    1.6.0
  • オペレーティングシステム
    OSX

  • スタックトレース

  • プロバイダーのエラーメッセージ
bug

最も参考になるコメント

これが上記の問題に関連しているかどうかはわかりませんが、誰かがGoogleを通じてここに来た場合は、これを試してください。

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

全てのコメント3件

デプロイ用のパッケージ化については、私も書いたserverless-python-requirementsをチェックアウトすることをお勧めしますが、それでも2.0.0の安定版リリースをプッシュする必要があります。

#3346で解決するはずだったので、この問題を解決しました(https://github.com/serverless/serverless/pull/3346#issuecomment-285469254を参照)。

この問題が引き続き発生する場合は、お気軽に再度開いてください。

これが上記の問題に関連しているかどうかはわかりませんが、誰かがGoogleを通じてここに来た場合は、これを試してください。

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

このページは役に立ちましたか?
0 / 5 - 0 評価