amazon-web-services - 使用 Go 设置 AWS Lambda,为什么我总是用这个简单的函数得到 "Internal server error"?

标签 amazon-web-services go aws-lambda

我实际上是在使用 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/

相关文章:

Python Flask-如何在将图像上传到 Amazon s3 之前读取图像的大小

html - AWS S3 托管站点的基本 HTTP 身份验证,类似于 .htaccess

Golang map 排序

amazon-web-services - 在 AWS Lambda 上使用 boto3 启动和终止 EMR 集群

python-3.x - 错误号 2 : No such file or directory: SSLError while calling s3. get_object()

amazon-s3 - 使用 Api 网关、Lambda 函数将图像上传到 S3 存储桶

amazon-web-services - 如何使用 Terraform 获取新启动机器的公共(public) IP

amazon-web-services - (AWS) 雅典娜 : Query Results seem too short

go - 覆盖 http.FileServer 中的 Last-Modified header

go - 如何使用带有版本化 Go 模块的 fork 模块(v1.11+,GO111MODULE=on)