2016-06-28 17 views
4

私は、Wolfram CloudObjectから情報を取得するリクエストを使用するインテントでラムダ関数を書いています。ここでは、コードの関連部分は次のとおりです。Pythonで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) 

コードの残りの大部分は、最小限の変更でAWSによって与えられたMyColorIs例のテンプレートに従います。ラムダ関数がテストされると、エラーメッセージは私にstackTraceを持つjsonファイルを与えます。私はコードr = requests.get()session_attributes = {}の行に問題を絞り込んだ。なぜなら、コメントアウトするとラムダの実行が成功するからだ。これはPythonを使った私の最初のプロジェクトです。だから私は言語にも新しいです。良い測定のために、ここでラムダを実行した後、私は取得エラーメッセージです:


{ 
    "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

これはSSL証明書エラーです。 pipで 'certifi'を更新して、証明書が最新であることを確認してください(コンソールの' pip install certifi --upgrade') –

+0

@CorleyBrigman私は 'sudo -H pip install certifi -upgrade'して、要件は既に​​最新のものでした。 –

+0

URLは 'https'でなければなりませんか?もしそうであれば、あなたはリクエストをしているのと同じ環境のウェブブラウザからそれにアクセスできますか?カスタム証明書などをインストールする必要があるかもしれません... –

答えて

1

あなたがここで証明書の要求の使用についての詳細を読むことができます:

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

2つの方法があります。この問題を回避するには:

  • 見つからない証明書を見つけて失敗したシステム上で背を上げた。
  • が通過することによって完全に証明書を無視verify=Falserequests.getに:

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

第2の方法は迅速であるが、安全性の低いです。あなたの意図した使用のために重要であるかもしれないし、重要でないかもしれない。

+0

ありがとうございました。これは、私が待っている間に問題を修正しましたWolframは中間のCAで私に戻ってきました –

4

ラムダ環境には、関数とともにアップロードする場合を除き、certifiモジュールは含まれていません。

私はこれを行うだろう:

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

はその後、アマゾンへの../lambda.zipをアップロードします。

+0

聖なる地獄、これは素晴らしいお礼でした!私の場合は、 '* .py'のみをパッケージ化し、正しく動作するために必要だった' .pem'ファイルをスキップしていました。 – scorpiodawg

関連する問題