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

将Go API部署到AWS Lambda和API上

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

将Go API部署到AWS Lambda和API上

现在上传ZIP文件夹,就这样,你的函数就能够运用了在切换到API网关之前,让咱们测验一下。进入 “测验 “标签,创立一个恳求,像这样。

将Go API部署到AWS Lambda和API上

你应该看到这个响应。

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

为Lambda函数创立API Gateway触发器

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

点击 “增加触发器”。

将Go API部署到AWS Lambda和API上

然后挑选API网关,REST API作为API类型,”敞开 “作为目前的安全机制,并点击 “增加”。咱们的屏幕现在应该是这样的,这便是咱们的API端点。

将Go API部署到AWS Lambda和API上

用API网关验证JSON恳求

因为API Gateway的存在,咱们能够在恳求抵达咱们的Lambda函数之前对其进行验证。这样一来,咱们就不会在坏的恳求上履行函数,然后节约一些费用。

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

将Go API部署到AWS Lambda和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"]
}

正如你所看到的,咱们正在界说一个有两个字段的对象,namemembers 。第一个字段是字符串类型,第二个字段是数组类型,其项目是字符串类型。假如恳求没有遵循这个形式,Lambda函数将不会被履行。

application/json粘贴JSON,刺进一个姓名,并将Content-type ,像这样。

将Go API部署到AWS Lambda和API上

一旦模型被创立,进入 “资源”,点击 “举动 “和 “创立办法”。挑选你或许喜爱的任何HTTP动词,如POST或GET。一旦创立,挑选咱们刚刚创立的Lambda函数,并创立该办法。现在点击Method Request ,在Request Validator ,挑选Validate body ,在Request Body ,挑选咱们刚刚创立的模型,如截图所示。

将Go API部署到AWS Lambda和API上

现在,再次点击 “Actions “并布置API。等待几秒钟,现在假如你企图做一个坏的恳求,你会得到一个错误。

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

咱们的API正在工作,并向国际敞开。咱们或许想经过只承受包括API密钥的恳求来限制这一点。

但首要,咱们需求创立运用方案。为此,只需进入 “运用方案”,点击创立,挑选一个称号,以及你想具有的关于节省和配额的选项。

将Go API部署到AWS Lambda和API上

现在咱们能够去 “API密钥”,创立一个API密钥,并将其分配给运用方案。当然,咱们能够创立许多不同的API Key和运用方案,当然,咱们也能够运用AWS CLI或Go的SDK以编程方法完结。

一旦API密钥被创立并分配给一个运用方案,咱们只需求在咱们的恳求中把它作为一个标题传递,称号为x-api-key

这便是悉数;)