将Go API部署到AWS Lambda和API上

1,293 阅读3分钟

将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",其余的暂时不做改动,然后点击创建。

create lambda function

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

lambda handler

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

lambda handler

你应该看到这个响应。

{
  "name": "Example Team",
  "members_count": 3,
}

为Lambda函数创建API Gateway触发器

好了,Lambda函数现在已经存在了,但你怎么才能访问它呢?我们需要创建一个触发器,在这种情况下,一个API网关触发器。这将为我们创建一个API端点,我们可以用它来调用我们的Lambda函数。

点击 "添加触发器"。

lambda add trigger

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

API Gateway endpoint

用API网关验证JSON请求

由于API Gateway的存在,我们可以在请求到达我们的Lambda函数之前对其进行验证。这样一来,我们就不会在坏的请求上执行函数,从而节省一些费用。

点击API网关的链接(不是API端点),打开我们的网关的设置,你会看到类似这样的东西。

API Gateway overview

现在点击模型和 "创建"。在这里,我们可以添加一个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"]
}

正如你所看到的,我们正在定义一个有两个字段的对象,namemembers 。第一个字段是字符串类型,第二个字段是数组类型,其项目是字符串类型。如果请求没有遵循这个模式,Lambda函数将不会被执行。

application/json粘贴JSON,插入一个名字,并将Content-type ,像这样。

API Gateway model validation

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

API Gateway validation

现在,再次点击 "Actions "并部署API。等待几秒钟,现在如果你试图做一个坏的请求,你会得到一个错误。

向亚马逊API网关添加API密钥

我们的API正在工作,并向世界开放。我们可能想通过只接受包含API密钥的请求来限制这一点。

但首先,我们需要创建使用计划。为此,只需进入 "使用计划",点击创建,选择一个名称,以及你想拥有的关于节流和配额的选项。

API Gateway usage plan

现在我们可以去 "API密钥",创建一个API密钥,并将其分配给使用计划。当然,我们可以创建许多不同的API Key和使用计划,当然,我们也可以使用AWS CLI或Go的SDK以编程方式完成。

一旦API密钥被创建并分配给一个使用计划,我们只需要在我们的请求中把它作为一个标题传递,名称为x-api-key

这就是全部;)