2016-11-22 24 views
8

Muszę wykonać wywołanie rest-call w skrypcie python, który jest uruchamiany raz dziennie. Nie mogę spakować pakietu "requests" do mojego pakietu python za pomocą AWS Lambdas. Pojawia się błąd: "Nie można zaimportować modułu" lambda_function ": Brak modułu o nazwie lambda_function"Nie można użyć modułu żądania w systemie AWS Lambda

Zepsułem go do predefiniowanego skryptu hello_world. Mogę go spakować do suwaka i załadować. Wszystko działa poprawnie. Jak tylko włożę do pliku "żądania importu", pojawia się ten błąd.

Oto, co już zrobiłem:

  1. Uprawnienia zip i folderze projektu (łącznie z podfolderami) są ustawione na `chmod 777`. Tak więc uprawnienia nie powinny stanowić problemu.
  2. Sam skrypt znajduje się w folderze głównym. Po otwarciu pliku zip bezpośrednio go widzisz.
  3. zainstalowałem pakiet wnioski do korzeni folderze projektu przy użyciu `sudo pip zainstalować żądań -t PATH_TO_ROOT_FOLDER`

Nazywanie wszystko wygląda tak:

  • plik zip: lambda_function.zip
  • py-file: lambda_function.py
  • obsługi metoda: lambda_handler (event, kontekst)
  • obsługi rozdzielczości w „my bconfig: lambda_function.lambda_handler

Plik chcę uruchomić w końcu wygląda tak:

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' 

Cieszę się na wszelkiego rodzaju pomoc. W tej sprawie korzystałem już z wielu godzin.

+1

w swoim pytaniu, pozycja '-t' opcji w' pip jest komenda install' niepoprawne - muszą to być 'prośby o instalację pip '-t PATH_TO_ROOT_FOLDER'. Czy po prostu popełniłeś błąd, czy tak naprawdę to zrobiłeś? – Leon

+0

@Leon: Dobrze. Właśnie sprawdziłem historię i zrobiłem to tak, jak wspomniałeś o tym tutaj. :) To nie spowodowało problemu. – codepleb

+0

Jakiej wersji Python używasz lokalnie? – Leon

Odpowiedz

8

W końcu rozwiązałem problem: Struktura w moim pliku zip została zerwana. Ważne jest, aby skrypt Pythona i spakowane zależności (jako foldery) znajdowały się w katalogu głównym pliku zip. To rozwiązało mój problem.

To trochę przygnębiające, jeśli po tak długich próbach i niepowodzeniach znajdziesz takie proste błędy.

+0

Czy Twój skrypt zwraca json? Próbuję zrobić coś podobnego, ale wciąż otrzymuję "nie json serialisable". Nie mam jednak "import json" ... kod działa dobrze lokalnie bez "import json", więc nie wiem, dlaczego nie ma go w Lambda. – kafka

+0

@kafka Być może będziesz musiał zaimportować bibliotekę json. Nie wiem jednak, ale AWS używa Pythona 2.7, a nie 3.x. Mój skrypt nie zwraca json. – codepleb

+0

yeah python 2.7 tutaj. Przechodzę do próby z wyraźnym odwołaniem do biblioteki json. Obecnie przepakowywanie. – kafka

2

Wierzę, że masz lambda_function.py na konsoli Lambda. Najpierw musisz utworzyć pakiet wdrażania funkcji Lambda, a następnie użyć konsoli do załadowania pakietu.

  • utworzyć katalog, na przykład project-dir w systemie (na miejscu)
  • tworzyć lambda_function.py w project-dir, skopiuj zawartość lambda_function.py z konsoli lambda i wkleić go w project-dir/lambda_function.py
  • pip install requests -t /path/to/project-dir
  • ZIP zawartość katalogu project-dir, który jest pakietem wdrożeniowym (Zapakuj zawartość katalogu, a nie katalog)

Przejdź do konsoli Lambda, wybierz opcję przesyłania pliku zip w typie wprowadzania kodu i prześlij pakiet wdrożeniowy. Żądania importowania powinny działać bez żadnego błędu.

14

Aby użyć modułu zapytań, wystarczy po prostu zaimportować requests z botocore.vendored. Na przykład:

from botocore.vendored import requests 

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

widać this gist wiedzieć więcej modułów, które mogą być importowane bezpośrednio w AWS lambda