将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
。
这便是悉数;)