我正在尝试使用 GoLang 创建一个简单的 AWS Lambda 函数,该函数执行 HTTP API 请求 (GET)(API 网关)。我有以下函数和代码片段
在我的 main.go 文件中存在这些函数
package main
import (
"log"
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-lambda-go/lambda"
)
func main(){
lambda.Start(handler)
}
func handler (request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
log.Printf("hello world")
response := events.APIGatewayProxyResponse{
StatusCode: 200,
Body: "hello world",
}
return response, nil
}
type User struct {
Username string `json:"username"`
Password string `json:"password"`
}
type ResponseBody struct {
Message string `json:"username"`
}
使用我的 **main.go ** 文件中的这些方法, 我在 AWS 上创建了一个 HTTP API,并上传了我的 main.go 源代码的内置压缩版本,之后我获得了端点以及路由,但在 Postman 上测试后,我得到了以下响应
{
"message": "Internal Server Error"
}
我双重交叉检查了我的端点和路线,但没有得到与上述不同的其他响应。 我也在 vscode 上尝试了雷霆客户端邮递员替代扩展,但得到了相同的响应(505)
但是,我决定在终端上本地使用 go run main.go
运行我的
main.go源代码,并收到以下错误消息
2023/04/04 15:08:55 expected AWS Lambda environment variables [_LAMBDA_SERVER_PORT AWS_LAMBDA_RUNTIME_API] are not defined exit status 1
我在这里遗漏了什么?请问该怎么办?我被困住了。
顺便说一句,我正在使用 Ubuntu(最新)
您在 AWS 上设置 lambda 和 api 网关以及在本地运行代码时似乎都遇到了问题。我已经设置了一个 git 存储库,我已在本地和远程成功测试了您的代码,您可以在此处查看更多详细信息
让我首先解决第二个问题,因为从问题的标题来看,似乎是最紧迫的。
第 1 部分 - 本地运行
要在本地运行 lambda 函数,您有几种选择,例如使用构建 docker 容器、使用 AWS SAM CLI,或在本地下载 AWS 运行时环境并使用它来执行。在我看来,最后一个选项是最简单且最不繁琐的,因此您可以按照以下方式在本地下载 AWS lambda 运行时环境,如 AWS 文档
中所述mkdir -p ~/.aws-lambda-rie && curl -Lo ~/.aws-lambda-rie/aws-lambda-rie \
https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie \
&& chmod +x ~/.aws-lambda-rie/aws-lambda-rie
(有关平台的安装说明请参阅官方存储库自述文件)
要测试本地运行的 lambda 函数,您可以在终端会话上运行:
~/.aws-lambda-rie/aws-lambda-rie go run main.go
这将启动一个服务器侦听端口 8080。要实际触发 lambda 函数,您最终可以在另一个终端会话上运行:
curl -XPOST "http://localhost:8080/2015-03-31/functions/function/invocations" -d '{"Name": "World"}'
您会发现您的代码运行良好。
第 2 部分 - 在 AWS 中测试
如果您的 lambda 函数没有在
APIGatewayProxyResponse
结构中返回状态代码和主体,那么第一件事可能会给您带来麻烦并使 API 网关返回 500。您的代码不是这种情况。这很可能意味着您配置 lambda 函数或网关时犯了错误。
我已在前面提到的示例存储库 cdk 代码中添加了该代码,该代码使用 CDK 将您的代码部署到 AWS,并配置了所有基本资源和权限。我已经测试了您也部署在 AWS 上的 lambda 代码,并且没有任何问题;这可能意味着您犯了一些配置错误。
我的建议是,您可以使用存储库中的代码来部署内容,然后您可以与之前配置的内容进行比较,以排查发生了什么错误。希望对您有帮助,祝您好运!