未定义预期的 AWS Lambda 环境变量 [_LAMBDA_SERVER_PORT AWS_LAMBDA_RUNTIME_API]

问题描述 投票:0回答:1

我正在尝试使用 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(最新)

go aws-lambda
1个回答
4
投票

您在 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 代码,并且没有任何问题;这可能意味着您犯了一些配置错误。 我的建议是,您可以使用存储库中的代码来部署内容,然后您可以与之前配置的内容进行比较,以排查发生了什么错误。希望对您有帮助,祝您好运!

© www.soinside.com 2019 - 2024. All rights reserved.