Ошибка при тестировании функции-обработчика AWS Lambda: формат данных для параметров события и контекста - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть следующий код из блога, который получает цену биткойна на сегодня.Я мог получить доступ к этой функции Lambda с консоли AWS Lex и протестировать бота, чтобы узнать цену на сегодня.

"""
Lexbot Lambda handler.
"""
from urllib.request import Request, urlopen
import json

def get_bitcoin_price(date):
    print('get_bitcoin_price, date = ' + str(date))
    request = Request('https://rest.coinapi.io/v1/ohlcv/BITSTAMP_SPOT_BTC_USD/latest?period_id=1DAY&limit=1&time_start={}'.format(date))
    request.add_header('X-CoinAPI-Key', 'E4107FA4-A508-448A-XXX')
    response = json.loads(urlopen(request).read())
    return response[0]['price_close']

def lambda_handler(event, context):
    print('received request: ' + str(event))
    date_input = event['currentIntent']['slots']['Date']
    btc_price = get_bitcoin_price(date_input)
    response = {
        "dialogAction": {
            "type": "Close",
            "fulfillmentState": "Fulfilled",
            "message": {
              "contentType": "SSML",
              "content": "Bitcoin's price was {price} dollars".format(price=btc_price)
            },
        }
    }
    print('result = ' + str(response))
    return response

Но когда я тестирую функцию с консоли AWS Lex, я получаю следующую ошибку:

 Response:
{
  "errorMessage": "'currentIntent'",
  "errorType": "KeyError",
  "stackTrace": [
    [
      "/var/task/lambda_function.py",
      18,
      "lambda_handler",
      "date_input = event['currentIntent']['slots']['Date']"
    ]
  ]
}

Request ID:
"2488187a-2b76-47ba-b884-b8aae7e7a25d"

Function Logs:
START RequestId: 2488187a-2b76-47ba-b884-b8aae7e7a25d Version: $LATEST
received request: {'Date': 'Feb 22'}
'currentIntent': KeyError
Traceback (most recent call last):
  File "/var/task/lambda_function.py", line 18, in lambda_handler
    date_input = event['currentIntent']['slots']['Date']
KeyError: 'currentIntent'

Как проверить функцию в консоли AWS Lambda?Функция 'lambda_handler', каким форматом будет 'событие' и 'контекст'?Кроме того, что было бы здесь «контекстом»?

Что я должен передать как «событие» и «контекст» в моем случае?

1 Ответ

0 голосов
/ 26 февраля 2019

Ваш код не выполняется, потому что объект event заполнен {'Date': 'Feb 22'}, но ваш код ожидает гораздо большего.Таким образом, происходит сбой, когда вы пытаетесь проанализировать этот JSON, пытаясь получить доступ к currentIntent:

date_input = event['currentIntent']['slots']['Date']

Вы не можете передать любой context в вашу Lambda при тестировании с консоли какон автоматически заполняется AWS.Кроме того, контекст используется только в очень специфических случаях, поэтому я бы не беспокоился об этом сейчас.

Однако вы можете передать event в качестве аргумента, и есть много способов сделать это.Самый простой способ сделать это вручную - перейти на Lambda Console AWS, нажать «Тест», и, если вы еще не настроили тестовое событие, появится следующий экран

enter image description here

Теперь в раскрывающемся списке вы можете выбрать свое событие, и AWS заменит его для вас, например:

enter image description here

Теперь вы можете настроить событие так, как вам нужно.

После сохранения и нажатия кнопки «Тест» объект event будет заполнен предоставленным JSON.

Другой вариантэто проверка примеров событий, опубликованных источниками событий , так что вы можете просто получить любое событие JSON и настроить его соответствующим образом.

Я взял для вас пример события Lex, которыйвыглядит следующим образом:

{
  "messageVersion": "1.0",
  "invocationSource": "FulfillmentCodeHook or DialogCodeHook",
  "userId": "user-id specified in the POST request to Amazon Lex.",
  "sessionAttributes": { 
     "key1": "value1",
     "key2": "value2",
  },
  "bot": {
    "name": "bot-name",
    "alias": "bot-alias",
    "version": "bot-version"
  },
  "outputDialogMode": "Text or Voice, based on ContentType request header in runtime API request",
  "currentIntent": {
    "name": "intent-name",
    "slots": {
      "slot-name": "value",
      "slot-name": "value",
      "slot-name": "value"
    },
    "confirmationStatus": "None, Confirmed, or Denied
      (intent confirmation, if configured)"
  }
}

Используйте это как ваше мероприятие, и вы сможете протестировать его соответствующим образом.

...