web-dev-qa-db-fra.com

Impossible d'utiliser Requests-Module sur AWS Lambda

Je dois effectuer un appel repos dans un script python qui s'exécute une fois par jour. Je ne peux pas emballer le paquet "demandes" dans mon paquet python à l'aide de AWS Lambdas. Je reçois l'erreur: "Impossible d'importer le module 'fonction_lambda': aucun module nommé fonction_lambda"

Je l'ai décomposé en script prédéfini hello_world. Je peux l'emballer dans un zip et le télécharger. Tout fonctionne. Dès que je mets des "demandes d'importation" dans le fichier, j'obtiens cette erreur.

Voici ce que j'ai déjà fait:

  1. Les autorisations du fichier Zip et du dossier du projet (y compris les sous-dossiers) sont définies sur `chmod 777`. Donc, les autorisations ne devraient pas être un problème.
  2. Le script lui-même est dans le dossier racine. Lorsque vous ouvrez le fichier Zip, vous le voyez directement.
  3. J'ai installé le paquet de requêtes dans le dossier racine du projet à l'aide de `Demandes d'installation Sudo pip -t PATH_TO_ROOT_FOLDER`

La dénomination de tout ressemble à ceci:

  • Fichier zip: lambda_function.Zip
  • py-file: lambda_function.py
  • méthode du gestionnaire: lambda_handler (événement, contexte)
  • gestionnaire-définition dans le "webconfig: lambda_function.lambda_handler

Le fichier que je veux exécuter à la fin ressemble à ceci:

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'

Je suis content de TOUT type d'aide. J'ai déjà utilisé plusieurs heures sur cette question.

45
codepleb

J'ai finalement résolu le problème: la structure de mon fichier Zip était cassée. Il est important que le script python et les dépendances compressées (sous forme de dossiers) se trouvent à la racine du fichier Zip. Cela a résolu mon problème.

C'est un peu déprimant si vous trouvez des erreurs aussi faciles après des heures d'essais et d'échecs.

14
codepleb

Pour utiliser le module de requêtes, vous pouvez simplement importer requests de botocore.vendored. Par exemple:

from botocore.vendored import requests

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

vous pouvez voir this Gist pour en savoir plus sur les modules pouvant être importés directement dans AWS lambda

158
Sining Liu

Je crois que tu as lambda_function.py sur la console Lambda. Vous devez d'abord créer le package de déploiement de la fonction Lambda, puis utiliser la console pour le télécharger.

  • Vous créez un répertoire, par exemple project-dir sur votre système (localement)
  • créer lambda_function.py dans project-dir, copiez le contenu de lambda_function.py depuis la console lambda et collez-le dans project-dir/lambda_function.py
  • pip install requests -t /path/to/project-dir
  • Zip le contenu de la project-dir répertoire, qui est votre package de déploiement (compressez le contenu du répertoire, pas le répertoire)

Accédez à la console Lambda, sélectionnez télécharger le fichier Zip dans le type d'entrée de code et téléchargez votre package de déploiement. Les demandes d'importation doivent fonctionner sans erreur.

6
Pramod Munemanik

Avec cette commande télécharger le package de dossiers

pip install requests -t .

Exécutez cette commande sur votre ordinateur local, puis décompressez votre répertoire de travail, puis chargez-le sur aws.

4
qarly_blue