将Go API部署到AWS Lambda和API Gateway上
在这篇文章中,我将描述将用Go编码的API部署到AWS Lambda和Amazon API Gateway的过程,如果你知道如何做,这个过程只需要几分钟。
我们将看到部署Lambda函数以及通过API网关验证请求和API密钥是多么容易。
我将假设你有Go的基本知识和一个AWS账户。如果你对AWS Lambda和API Gateway一无所知,不用担心,你需要知道的都在这里解释。如果你已经对Lambda和API Gateway有了一定的了解,可以随意跳过一些解释。
使用Go创建一个Lambda函数
你可能已经知道,通过AWS Lambda,你可以 "无需配置或管理基础设施即可运行代码。只需编写和上传代码作为.zip文件或容器镜像"。
创建一个Lambda函数是非常容易的。你需要一些代码和一个上传代码的Lambda函数。我们将从代码开始。
你所需要知道的是,你需要导入github.com/aws/aws-lambda-go/lambda ,并创建一个 "处理程序"。关于这个函数可以接受哪些参数,已经有了很好的解释,所以不值得重复:https://docs.aws.amazon.com/lambda/latest/dg/golang-handler.html
让我们创建一个非常简单的函数,它将只获得一个团队名称和一个包含成员的数组,并返回团队的名称和成员的数量。你可以在这里找到代码:https://github.com/antsanchez/go-lambda-apigateway-example
package main
import (
"github.com/aws/aws-lambda-go/lambda"
)
type TeamRequest struct {
Name string `json:"name"`
Members []string `json:"members"`
}
type Response struct {
Name string `json:"name"`
MembersCount int `json:"members_count"`
}
func GetTeamAndMembers(req TeamRequest) (Response, error) {
return Response{
Name: req.Name,
MembersCount: len(req.Members),
}, nil
}
func main() {
lambda.Start(GetTeamAndMembers)
}
一旦函数被创建,你必须编译代码并创建一个ZIP,以便将其上传到AWS Lambda。
$ GOOS=linux go build main.go
% zip function.zip main
现在让我们去AWS控制台,搜索Lambda,然后点击创建一个新函数。挑选你喜欢的名字,选择 "Go",其余的暂时不做改动,然后点击创建。

在下一个屏幕上,确保将处理程序改为 "main",如下图所示。

现在上传ZIP文件夹,就这样,你的函数就可以使用了在切换到API网关之前,让我们测试一下。进入 "测试 "标签,创建一个请求,像这样。

你应该看到这个响应。
{
"name": "Example Team",
"members_count": 3,
}
为Lambda函数创建API Gateway触发器
好了,Lambda函数现在已经存在了,但你怎么才能访问它呢?我们需要创建一个触发器,在这种情况下,一个API网关触发器。这将为我们创建一个API端点,我们可以用它来调用我们的Lambda函数。
点击 "添加触发器"。

然后选择API网关,REST API作为API类型,"开放 "作为目前的安全机制,并点击 "添加"。我们的屏幕现在应该是这样的,这就是我们的API端点。

用API网关验证JSON请求
由于API Gateway的存在,我们可以在请求到达我们的Lambda函数之前对其进行验证。这样一来,我们就不会在坏的请求上执行函数,从而节省一些费用。
点击API网关的链接(不是API端点),打开我们的网关的设置,你会看到类似这样的东西。

现在点击模型和 "创建"。在这里,我们可以添加一个JSON模式来描述请求应该如何完成。深入了解如何定义JSON模式及其可能性超出了本教程的范围,但你可以在这里找到更多的文档:http://json-schema.org/现在你需要知道的是,你需要像这样定义请求的模式。
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Team",
"description": "Team and members request",
"type": "object",
"properties": {
"name": {
"type": "string"
},
"members": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": ["name", "members"]
}
正如你所看到的,我们正在定义一个有两个字段的对象,name 和members 。第一个字段是字符串类型,第二个字段是数组类型,其项目是字符串类型。如果请求没有遵循这个模式,Lambda函数将不会被执行。
application/json粘贴JSON,插入一个名字,并将Content-type ,像这样。

一旦模型被创建,进入 "资源",点击 "行动 "和 "创建方法"。选择你可能喜欢的任何HTTP动词,如POST或GET。一旦创建,选择我们刚刚创建的Lambda函数,并创建该方法。现在点击Method Request ,在Request Validator ,选择Validate body ,在Request Body ,选择我们刚刚创建的模型,如截图所示。

现在,再次点击 "Actions "并部署API。等待几秒钟,现在如果你试图做一个坏的请求,你会得到一个错误。
向亚马逊API网关添加API密钥
我们的API正在工作,并向世界开放。我们可能想通过只接受包含API密钥的请求来限制这一点。
但首先,我们需要创建使用计划。为此,只需进入 "使用计划",点击创建,选择一个名称,以及你想拥有的关于节流和配额的选项。

现在我们可以去 "API密钥",创建一个API密钥,并将其分配给使用计划。当然,我们可以创建许多不同的API Key和使用计划,当然,我们也可以使用AWS CLI或Go的SDK以编程方式完成。
一旦API密钥被创建并分配给一个使用计划,我们只需要在我们的请求中把它作为一个标题传递,名称为x-api-key 。
这就是全部;)