web-dev-qa-db-ja.com

AWS LambdaでRequests-Moduleを使用できません

1日に1回実行されるpythonスクリプト内で再呼び出しを行う必要があります。 AWS Lambdasを使用して「リクエスト」パッケージをpython-packageにパックできません。 「モジュール 'lambda_function'をインポートできません:lambda_functionというモジュールがありません」というエラーが表示されます

事前定義されたhello_worldスクリプトに分解しました。 Zipにパックしてアップロードできます。すべてが機能します。 「インポート要求」をファイルに入れるとすぐに、このエラーが発生します。

私がすでにやったことは次のとおりです。

  1. Zipおよびプロジェクトフォルダー(サブフォルダーを含む)の権限は「chmod 777」に設定されます。そのため、権限は問題になりません。
  2. スクリプト自体はルートフォルダー内にあります。 Zipファイルを開くと、直接表示されます。
  3. `Sudo pip install requests -t PATH_TO_ROOT_FOLDER`を使用して、リクエストパッケージをプロジェクトのルートフォルダーにインストールしました。

すべての名前は次のようになります。

  • Zipファイル:lambda_function.Zip
  • py-file:lambda_function.py
  • ハンドラーメソッド:lambda_handler(event、context)
  • 「webconfig:lambda_function.lambda_handlerのハンドラー定義」

最後に実行したいファイルは次のようになります。

import requests
import json


def lambda_handler(event, context):
    url = 'xxx.elasticbeanstalk.com/users/login'
    headers = {"content-type": "application/json", "Authorization": "Basic Zxxxxxxxxx3NjxxZxxxxzcw==" }
    response = requests.put(url, headers=headers, verify=False)
    return 'hello lambda_handler'

私はどんな種類の助けも嬉しいです。私はすでにこの問題に数時間を費やしました。

45
codepleb

最終的に問題を解決しました。Zipファイルの構造が壊れていました。 pythonスクリプトとパックされた依存関係(フォルダーとして)がZipファイルのルートにあることが重要です。これで問題が解決しました。

何時間もの試行錯誤の後にこのような簡単なエラーを見つけた場合、それは少し憂鬱です。

14
codepleb

リクエストモジュールを使用するには、botocore.vendoredからrequestsをインポートするだけです。例えば:

from botocore.vendored import requests

def lambda_handler(event, context):
   response = requests.get("https://example.com/")
   print response.json()

this Gist を見ると、AWS lambdaに直接インポートできるその他のモジュールがわかります。

158
Sining Liu

Lambdaコンソールにlambda_function.pyがあると思います。最初にLambda関数展開パッケージを作成してから、コンソールを使用してパッケージをアップロードする必要があります。

  • システム上にproject-dirなどのディレクトリを作成します(ローカル)
  • lambda_function.pyproject-dirを作成し、lambda_function.pyの内容をラムダコンソールからコピーして、project-dir/lambda_function.pyに貼り付けます
  • pip install requests -t /path/to/project-dir
  • 展開パッケージであるproject-dirディレクトリのコンテンツを圧縮します(ディレクトリではなくディレクトリのコンテンツを圧縮します)

Lambdaコンソールに移動し、コード入力タイプでZipファイルのアップロードを選択して、展開パッケージをアップロードします。インポート要求はエラーなしで機能するはずです。

6

このコマンドでフォルダーパッケージをダウンロードします

pip install requests -t .

ローカルマシンでこのコマンドを実行し、作業ディレクトリをZipしてからawsにアップロードします。

4
qarly_blue