我实际上是在使用 Go docs 中的示例函数:
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"}
它工作正常。
但如果我转到“添加触发器”,单击“API 网关”,然后单击“创建新 API”,将“安全性”设置为“打开”,保留其他所有默认设置,然后单击“添加”,然后单击“保存”。
如果我看到它在底部列为“API 端点:”的 URL 并单击它,我会收到“内部服务器错误”。
如果我这样做 curl -XPOST -d "{\"name\":\"Paul\"}"https://AWS-URL-ENDPOINT/amazonaws.com/default/mytestfunction
我收到“内部服务器错误”。
我做错了什么?
最佳答案
出现内部服务器错误
的最常见原因之一是您的 Lambda 函数崩溃或未返回触发服务预期的内容。
在这种情况下,我怀疑两者都有一点。
当您通过 API 网关代理时,您的事件负载不仅仅是您发布的内容。您可以在此处找到有关事件形状的更多信息,包括 API 网关请求的形状:( https://docs.aws.amazon.com/lambda/latest/dg/eventsources.html#eventsources-api-gateway-request)。
您的 lambda 正在崩溃,因为您从 API 网关获取的事件无法转换为您的 type MyEvent struct
,因为它没有 name
属性;事实上,请求的正文实际上是在 event.body
中作为必须解码的字符串。
您可以在此处找到您期望使用 lambda 响应 API 网关的事件的良好指南 (https://serverless.com/framework/docs/providers/aws/events/apigateway/)
关于amazon-web-services - 使用 Go 设置 AWS Lambda,为什么我总是用这个简单的函数得到 "Internal server error"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53094743/