Ошибка шлюза API лямбды AWS “Уродливая Лямбда проксирует ответ”

Я пытаюсь настроить привет мировой пример с лямбдой AWS и служу ей через шлюз API. Я нажал "Create a Lambda Function", которые настраивают API gatway и выбрали опцию Blank Function. Я добавил функцию лямбды, найденную на руководстве по началу работы шлюза AWS:

exports.handler = function(event, context, callback) {
  callback(null, {"Hello":"World"});  // SUCCESS with message
};

Проблема - то, что, когда я выполняю ПОЛУЧИТЬ запрос к нему, он возвращает назад 502 ответа { "message": "Internal server error" }. И журналы говорят, что "Выполнение перестало работать из-за ошибки конфигурации: Уродливый ответ прокси Лямбды".

59
задан 30 April 2017 в 18:23

3 ответа

Я попробовал все вышеупомянутое предложение, но оно не работает, в то время как body значение не String

return {
    statusCode: 200,
    headers: {
        "Content-Type": "application/json",
        "Access-Control-Allow-Origin": "*"
    },
    body: JSON.stringify({
        success: true
    }),
    isBase64Encoded: false
};
1
ответ дан 1 November 2019 в 11:26

Для Python3:

import json

def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'headers': {
            'Content-Type': 'application/json',
            'Access-Control-Allow-Origin': '*'
        },
        'body': json.dumps({
            'success': True
        }),
        "isBase64Encoded": False
    }

Примечание эти body не требуется, чтобы быть установленным, это может просто быть пусто:

        'body': ''
0
ответ дан 1 November 2019 в 11:26

Частая причина "Уродливой ошибки" ответа прокси Лямбды headers, которые не являются {String: String, ...} пары ключа/значений.

С тех пор set-cookie заголовки могут и действительно появляться в кратных числах, они представлены в http.request.callback.response как set-cookie ключ, имеющий Array из Strings значение вместо единственный String . В то время как это работает на разработчиков, AWS Шлюз API не понимает это и бросает "Уродливую ошибку" ответа прокси Лямбды.

Мое решение состоит в том, чтобы сделать что-то вроде этого:

function createHeaders(headers) {
  const singleValueHeaders = {}
  const multiValueHeaders = {}
  Object.entries(headers).forEach(([key, value]) => {
    const targetHeaders = Array.isArray(value) ? multiValueHeaders : singleValueHeaders
    Object.assign(targetHeaders, { [key]: value })
  })

  return {
    headers: singleValueHeaders,
    multiValueHeaders,
  }
}

var output = {
  ...{
    "statusCode": response.statusCode,
    "body": responseString
  },
  ...createHeaders(response.headers)
}

Примечание, что ... выше не означает Yada Yada Yada. Это оператор .

распространения ES6
0
ответ дан 1 November 2019 в 11:26

Другие вопросы по тегам:

Похожие вопросы: