Настройка AWS Lambda с Go, почему я всегда получаю «Внутреннюю ошибку сервера» с этой простой функцией? - PullRequest
0 голосов
/ 01 ноября 2018

Я буквально использую пример функции из Go документов :

package main

import (
    "context"
    "fmt"

    "github.com/aws/aws-lambda-go/lambda"
)

type MyEvent struct {
    Name string `json:"name"`
}

func HandleRequest(ctx context.Context, name MyEvent) (string, error) {
    return fmt.Sprintf("Hello %s!", name.Name), nil
}

func main() {
    lambda.Start(HandleRequest)
}

Если я использую консоль событий теста и вводю { "name": "John" }, она работает нормально.

Но если я иду в Add Triggers, нажмите API Gateway, затем нажмите Create a new API, установите Security на Open, оставьте все остальное по умолчанию, затем нажмите Add, затем Save.

Если я увижу URL-адрес, который указан внизу как «Конечная точка API:», и щелкните по нему, я получу «Внутренняя ошибка сервера».

Если я сделаю curl -XPOST -d "{ \"name\": \"Paul\" }" https://AWS-URL-ENDPOINT/amazonaws.com/default/mytestfunction

Я получаю "Внутренняя ошибка сервера".

Что я делаю не так?

1 Ответ

0 голосов
/ 01 ноября 2018

Одна из наиболее распространенных причин получения Internal server error заключается в том, что ваша лямбда-функция либо дает сбой, либо не возвращает то, что ожидается от запускающей службы.

В этом случае я подозреваю, что и то и другое.

Когда вы используете прокси-сервер через API-шлюз, полезная нагрузка события - это не только то, что вы добавили в POST. Вы можете узнать больше о форме событий здесь, в том числе о запросе API Gateway: (https://docs.aws.amazon.com/lambda/latest/dg/eventsources.html#eventsources-api-gateway-request).

Ваша лямбда падает, потому что событие, которое вы получаете от API Gateway, не может быть преобразовано в ваш type MyEvent struct, так как у него нет свойства name; фактически тело запроса фактически находится в event.body как строка, которая должна быть декодирована.

Хорошее руководство по событиям, которые вы ожидаете получить для API Gateway с лямбдой, можно найти здесь (https://serverless.com/framework/docs/providers/aws/events/apigateway/)

...