AWS API Gateway "Неподдерживаемый метод \" undefined \ "" в качестве ответа - PullRequest
0 голосов
/ 27 января 2019

Я устанавливаю функцию AWS Lambda для подключения к моей DynamoDB.Чтобы получить к нему доступ, я также настраиваю API-шлюз.

Кажется, лямбда работает, когда я ее тестирую.Поэтому я считаю, что проблема заключается в настройке шлюза API.

API Gateway setup

Для лямбды я настроил следующее тестовое событие: я настроил тестовое событие, которое выглядит следующим образом:

{
  "httpMethod": "GET"
}

Это тестовое событие дает мне следующий ответ:

Response:
{
  "statusCode": "200",
  "body": "{\"Items\":[{\"id\":1,\"brand\":\"Test brand\",\"title\":\"Test product\"}],\"Count\":1,\"ScannedCount\":1}",
  "headers": {
    "Content-Type": "application/json"
  }
}

Для шлюза API, который я пробовал, с помощью следующего теста: API Gateway test

Я пыталсяавтоматическое создание шлюза API в консоли управления лямбда.Воссоздание лямбды и шлюза API.

Лямбда-функция:

console.log('Loading function');

const doc = require('dynamodb-doc');

const dynamo = new doc.DynamoDB();


/**
 * Demonstrates a simple HTTP endpoint using API Gateway. You have full
 * access to the request and response payload, including headers and
 * status code.
 *
 * To scan a DynamoDB table, make a GET request with the TableName as a
 * query string parameter. To put, update, or delete an item, make a POST,
 * PUT, or DELETE request respectively, passing in the payload to the
 * DynamoDB API as a JSON body.
 */
exports.handler = (event, context, callback) => {
    //console.log('Received event:', JSON.stringify(event, null, 2));

    const done = (err, res) => callback(null, {
        statusCode: err ? '400' : '200',
        body: err ? err.message : JSON.stringify(res),
        headers: {
            'Content-Type': 'application/json',
        },
    });

    switch (event.httpMethod) {
        case 'DELETE':
            dynamo.deleteItem(JSON.parse(event.body), done);
            break;
        case 'GET':
            dynamo.scan({ "TableName": "productdb" }, done);
            //dynamo.scan({"TableName":"productdb"})
            break;
        case 'POST':
            dynamo.putItem(JSON.parse(event.body), done);
            break;
        case 'PUT':
            dynamo.updateItem(JSON.parse(event.body), done);
            break;
        default:
            done(new Error(`Unsupported method "${event.httpMethod}"`));
    }
};

Журналы API-шлюза из теста:

Execution log for request 885e5505-2212-11e9-aee0-7f024016f574
Sun Jan 27 09:04:20 UTC 2019 : Starting execution for request: 885e5505-2212-11e9-aee0-7f024016f574
Sun Jan 27 09:04:20 UTC 2019 : HTTP Method: GET, Resource Path: /
Sun Jan 27 09:04:20 UTC 2019 : Method request path: {}
Sun Jan 27 09:04:20 UTC 2019 : Method request query string: {}
Sun Jan 27 09:04:20 UTC 2019 : Method request headers: {}
Sun Jan 27 09:04:20 UTC 2019 : Method request body before transformations: 
Sun Jan 27 09:04:20 UTC 2019 : Endpoint request URI: https://lambda.eu-central-1.amazonaws.com/2015-03-31/functions/arn:aws:lambda:eu-central-1:304886708348:function:dynamoDBService/invocations
Sun Jan 27 09:04:20 UTC 2019 : Endpoint request headers: {x-amzn-lambda-integration-tag=885e5505-2212-11e9-aee0-7f024016f574, Authorization=*****************************************************************************************************************************************************************************************************************************************************************************************500617, X-Amz-Date=20190127T090420Z, x-amzn-apigateway-api-id=lqhm3agxxf, X-Amz-Source-Arn=arn:aws:execute-api:eu-central-1:304886708348:lqhm3agxxf/test-invoke-stage/GET/, Accept=application/json, User-Agent=AmazonAPIGateway_lqhm3agxxf, X-Amz-Security-Token=FQoGZXIvYXdzEOH//////////wEaDFvawdYGjH/+gSI14yK9AzQFZtlDghAr2NUHIhLGWmeJkKL8sUP3L6fu0h5PtFPN7wA7hgfWMtUNHCWyGykG0g5Zs81zKx5bUGMLCMK2zuVwD4WMgBRmkx40bZYehHdeS8czOxRTbQIqwP1lfZ0d74l4MqG4g8XpigkcLACLEn6buaq37rO4WYOo+J8ecFeSpti+u+V8OON4idxxXEHiYGJEc23OwjVvf3GTr1EUscB+Lsp/nw58oCWQArUA6LLSwcnGYXYcmnPav2Xs8mJgvqnVowxxYre0N8Gca8D9XBN2Y93/qnVTsOI5nWHSUQOnwaoXSZzgBAXKrUV1S5X+UH3zQI9p [TRUNCATED]
Sun Jan 27 09:04:20 UTC 2019 : Endpoint request body after transformations: 
Sun Jan 27 09:04:20 UTC 2019 : Sending request to https://lambda.eu-central-1.amazonaws.com/2015-03-31/functions/arn:aws:lambda:eu-central-1:304886708348:function:dynamoDBService/invocations
Sun Jan 27 09:04:20 UTC 2019 : Received response. Integration latency: 17 ms
Sun Jan 27 09:04:20 UTC 2019 : Endpoint response body before transformations: {"statusCode":"400","body":"Unsupported method \"undefined\"","headers":{"Content-Type":"application/json"}}
Sun Jan 27 09:04:20 UTC 2019 : Endpoint response headers: {Date=Sun, 27 Jan 2019 09:04:20 GMT, Content-Type=application/json, Content-Length=108, Connection=keep-alive, x-amzn-RequestId=6c00229e-caa1-4d37-aeaa-7c1cbd0ddd71, x-amzn-Remapped-Content-Length=0, X-Amz-Executed-Version=$LATEST, X-Amzn-Trace-Id=root=1-5c4d7414-e52b0fba267596b50fdbb102;sampled=0}
Sun Jan 27 09:04:20 UTC 2019 : Method response body after transformations: {"statusCode":"400","body":"Unsupported method \"undefined\"","headers":{"Content-Type":"application/json"}}
Sun Jan 27 09:04:20 UTC 2019 : Method response headers: {X-Amzn-Trace-Id=Root=1-5c4d7414-e52b0fba267596b50fdbb102;Sampled=0, Access-Control-Allow-Origin=*, Content-Type=application/json}
Sun Jan 27 09:04:20 UTC 2019 : Successfully completed execution
Sun Jan 27 09:04:20 UTC 2019 : Method completed with status: 200

Я ожидаю, что результат будет таким же, как тестовое событие в лямбда-выражениях.

1 Ответ

0 голосов
/ 27 января 2019

Когда вы создаете метод API, вам нужно выбрать опцию «Использовать интеграцию Lambda Proxy», чтобы поле httpMethod вместе с другой информацией из шлюза API было доступно в объекте event вваша лямбда-функция.

Из документов :

Вы можете настроить интеграцию Lambda-прокси для любого метода API.Но интеграция с Lambda-прокси более эффективна, если она настроена для метода API с использованием общего прокси-ресурса.Общий прокси-ресурс может быть обозначен специальной шаблонной переменной пути {proxy +}, меткой-ловушкой ЛЮБОГО метода для всех или обоими.Клиент может передать входные данные лямбда-функции бэкэнда во входящем запросе в качестве параметров запроса или применимой полезной нагрузки.Параметры запроса включают заголовки, переменные пути URL, параметры строки запроса и применимую полезную нагрузку.Интегрированная функция Lambda проверяет все входные источники перед обработкой запроса и ответом клиенту значимыми сообщениями об ошибках, если какой-либо из требуемых входных данных отсутствует.

Вы можете найти «Использовать интеграцию Lambda Proxy».здесь, на экране «Создать метод» в вашем экземпляре API Gateway:

enter image description here

Редактировать: Для справки выможет сказать, что метод API-шлюза не использует интеграцию Lambda-прокси, поскольку в «Запросе на интеграцию» типом является «LAMBDA», но при использовании интеграции Lambda-прокси типом является «LAMBDA_PROXY».

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