Невозможно запустить функцию AWS Lambda с API Gateway - PullRequest
2 голосов
/ 22 марта 2019

Я создал простую лямбда-функцию Python 3.7:

import json
import boto3

s3 = boto3.client("s3")


def lambda_handler(event, context):
    bucket = "nubi-data"
    key = "core/user.json"

    try:
        data = s3.get_object(Bucket=bucket, Key=key)
        json_data = data['Body'].read()

        #return json_data

        return {
            'statusCode': 200,
            "headers": {"Content-Type": "application/json"},
            'body': json.loads(json_data)
            }


    except Exception as e:
        print(e)
        raise e

Эта функция читает файл json из корзины s3. Файл json выглядит так:

{"id": 1, "name": "John", "pwd": "password"}

Функция работает успешно, когда я тестирую из экрана редактора функций в консоли AWS со следующим выводом: enter image description here

Ответ: {"statusCode": 200, "заголовки": { "Content-Type": "application / json"}, "body": { "id": 1, "имя": "Джон", "pwd": "пароль"}}

Запросить идентификатор: "f57de02f-44dd-4854-9df9-9f3a8c90031d"

Журналы функций: START RequestId: f57de02f-44dd-4854-9df9-9f3a8c90031d Версия: $ LATEST END RequestId: f57de02f-44dd-4854-9df9-9f3a8c90031d REPI RequestId: f57de02f-44dd-4854-9df9-9f3a8c90031d Продолжительность: 260,70 мс Продолжительность счета: 300 мс Размер памяти: 128 МБ Макс. Используемая память: 84 МБ

Но когда я тестирую функцию из API Gateway, я получаю сообщение об ошибке
enter image description here

Чт 21 марта 21:04:08 UTC 2019: тело ответа конечной точки до преобразования: {"statusCode": 200, "заголовки": {"Тип содержимого": "application / json"}, "body": {"id": 1, "name": "John", "pwd": "пароль"}} Чт 21 марта 21:04:08 UTC 2019: выполнение не выполнено из-за ошибка конфигурации: неверный ответ лямбда-прокси, четверг 21 марта 21:04:08 UTC 2019: метод завершен со статусом: 502

1 Ответ

1 голос
/ 22 марта 2019

Изменение

'body': json.loads(json_data)

до

'body': json.dumps(json_data)

API-шлюз ожидает строку в качестве вывода, а json.dumps делает именно это. json.loads, с другой стороны, создает JSON из строки. Если вы знаете NodeJS, они эквивалентны JSON.stringify и JSON.parse, соответственно.

Пример

json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])

производит

'["foo", {"bar": ["baz", null, 1.0, 2]}]'

, а

json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')

1025 * производит *

[u'foo ', {u'bar': [u'baz ', None, 1.0, 2]}]

Эта информация доступна в официальных документах

EDIT

Еще одна вещь, которую я и пропустил, это то, что data['Body'].read() возвращает не сам JSON, а буфер. Сначала его нужно декодировать.

json_data = data['Body'].read().decode('utf-8') уже вернет строковый JSON (конечно, только потому, что ваш файл является JSON), поэтому в своем выражении return вы можете просто сделать это следующим образом:

return {
         'statusCode': 200,
         "headers": {"Content-Type": "application/json"},
         'body': json_data
     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...