2016-06-28 5 views
4

Ich schreibe eine Lambda-Funktion mit einer Absicht, die Anfragen verwendet, um Informationen aus einem Wolfram CloudObject zu ziehen. Hier ist der relevante Teil des Codes:Problem mit Anfragen-Modul in Python für AWS Lambda

from __future__ import print_function 
import requests 

. 
. 
. 

def on_intent(intent_request, session): 
    print("on_intent requestID=" + intent_request['requestID'] + ", sessionID=" + session['sessionId']) 

    intent = intent_request['intent'] 
    intent_name = intent_request['intent']['name'] 

    # Dispatch to skill's intent handlers 

    if intent_name == "GetEvent": 
     return call_wolfram(intent, session) 
    elif intent_name == "AMAZON.HelpIntent": 
     return get_welcome_response() 
    elif intent_name == "AMAZON.CancelIntent" or intent_name == "AMAZON.StopIntent": 
     return handle_session_end_request() 
    else: 
     raise ValueError("Invalid intent") 

. 
. 
. 

# Functions that control skill's behavior 

def call_wolfram(intent, session): 
    url = "https://path-to-cloud-object" 
    query = {'string1': 'VESSEL', 'string2': 'EVENT', 'RelString': 'TRIGGERED'} 
    r = requests.get(url, params=query) 
    session_attributes = {"r_result": r} 
    speech_output = "Congrats, dummy! It worked" 
    card_title = "Query" 
    should_end_session = True 
    return build_response({}, build_speechlet_response(card_title, speech_output, None, should_end_session) 

Der meisten des Restes des Codes folgt die MyColorIs Beispielvorlage von AWS gegeben mit minimalen Änderungen. Wenn die Lambda-Funktion getestet wird, gibt die Fehlermeldung mir eine JSON-Datei mit StackTrace; Ich habe das Problem auf die Zeilen des Codes r = requests.get() und session_attributes = {} eingegrenzt, weil die Ausführung von Lambda, wenn sie auskommentiert, erfolgreich ist. Dies ist mein erstes Projekt mit Python, also bin ich auch neu in der Sprache. Für eine gute Maßnahme, hier ist die Fehlermeldung, die ich nach dem Lambda erhalten ausführt:

http://docs.python-requests.org/en/master/user/advanced/

Es gibt zwei Möglichkeiten:


{ 
    "stackTrace": [ 
    [ 
    "/var/task/query_lambda.py", 
    27, 
    "lambda_handler", 
    "return on_intent(event['request'], event['session'])" 
    ], 
    [ 
    "/var/task/query_lambda.py", 
    65, 
    "on_intent", 
    "return call_wolfram(intent, session)" 
    ], 
    [ 
    "/var/task/query_lambda.py", 
    113, 
    "call_wolfram", 
    "r = requests.get(url, params=query)" 
    ], 
    [ 
    "/var/task/requests/api.py", 
    71, 
    "get", 
    "return request('get', url, params=params, **kwargs)" 
    ], 
    [ 
    "/var/task/requests/api.py", 
    57, 
    "request", 
    "return session.request(method=method, url=url, **kwargs)" 
    ], 
    [ 
    "/var/task/requests/sessions.py", 
    475, 
    "request", 
    "resp = self.send(prep, **send_kwargs)" 
    ], 
    [ 
    "/var/task/requests/sessions.py", 
    585, 
    "send", 
    "r = adapter.send(request, **kwargs)" 
    ], 
    [ 
    "/var/task/requests/adapters.py", 
    477, 
    "send", 
    "raise SSLError(e, request=request)" 
    ] 
    ], 
    "errorType": "SSLError", 
    "errorMessage": "[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)" 
} 
+0

Dies ist ein SSL-Zertifikatfehler. versuche, 'certifi' mit pip zu aktualisieren, um sicherzustellen, dass die Zertifikate aktuell sind (in einer Konsole, 'pip install certifi --upgrade') –

+0

@CorleyBrigman Ich habe 'sudo -H pip install certifi --upgrade' und wurde der Anforderung war bereits auf dem neuesten Stand. –

+0

muss die URL 'https' sein? Wenn dies der Fall ist, können Sie in derselben Umgebung, in der Sie die Anfrage stellen, von einem Webbrowser aus darauf zugreifen? Sie müssen möglicherweise ein benutzerdefiniertes Zertifikat oder etwas installieren ... –

Antwort

1

Sie mehr über Anträge der Verwendung von Zertifikaten hier lesen Um dieses Problem zu umgehen:

  • Finden Sie das Zertifikat, das Sie vermissen, und erhalten Sie es ins über das System, das versagt.
  • Ignorieren die Zertifikate zusammen, indem verify=False zu requests.get:

    r = requests.get(url, params=query, verify=False)

Das zweite Verfahren ist schneller, aber weniger sicher ist; das kann für Ihre beabsichtigte Verwendung wichtig sein oder nicht.

+0

Danke, das behebt das Problem vorläufig, während ich gewartet habe Wolfram um mit ihrer Zwischenstufe CA zurück zu mir zu kommen –

4

Die Lambda-Umgebung enthält das Zertifikatmodul nicht, es sei denn, Sie laden es mit Ihrer Funktion hoch.

Ich würde dies tun:

cd <directory with your lambda> 
pip install certifi -t . 
zip ../lambda * 

dann die ../lambda.zip auf Amazon hochladen.

+0

Heil her, das war ein super Tipp, danke! In meinem Fall packte ich nur '* .py' ein und übersprang die' .pem'-Dateien, die dafür notwendig waren, damit sie korrekt funktionierten. – scorpiodawg