原帖于Serverless

以下是您可以立即开始使用 Go 和无服务器框架并将 Lambda 部署到您心仪的内容的方法。

开始使用

首先,您需要安装Serverless Framework和AWS 帐户。

(如果您是第一次使用无服务器框架,我们的首次部署后有一个快速设置指南。我们承诺大约需要 5 分钟。)

使用 Go 模板

该框架将代表您为 Go 配置 AWS。

从 v1.26 开始,框架中已经包含了几个 Go 模板 — aws-go 用于具有两个功能的基本服务,而 aws-go-dep 用于使用dep依赖管理工具的基本服务。让我们试试 aws-go-dep 模板。 您将需要**dep 已安装。**

确保您位于${GOPATH}/src目录中,然后运行:

切换到新的服务目录并编译函数:

包含的 Makefile 中的默认命令将收集您的依赖项并为您的函数构建正确的二进制文件。您现在可以部署:

最后,调用您的函数:

好的!

使用 Go + Lambda 构建 Web API

基本示例很好,但让我们尝试一些更有用的东西。

Lambda + API Gateway 非常适合快速启动端点以检索或摄取数据。因此,我们将构建一个示例端点。

对于来自解释型、动态类型语言的朋友(看看你,Pythonistas 和 Javascript 爱好者!),Golang 方法有点不同。您必须对函数的输入和输出更加有意识。别担心,我们会慢慢来的。 😉

我们将创建一个 HTTP 端点,它在路径 /echo 处接受 POST 请求,记录 POST 正文,并将正文回显给客户端。

首先,让我们修复 serverless.yml 以附加 HTTP 事件:

我们需要在 hello/main.go 中更新我们的函数。

请记住,Golang 是一种已编译的静态类型语言,因此我们需要定义进入我们函数的事件对象。幸运的是,AWS 已经在 Github repo 中提供了多个事件类型。 💥 我们可以使用这些。

更新您的 hello/main.go 以获得以下代码:

我们的 Handler() 函数现在接受一个 APIGatewayProxyRequest 对象并返回一个 APIGatewayProxyResponse 对象。在我们的函数代码中,我们打印请求正文,然后返回带有请求正文的响应。

重新编译并再次部署:

请注意,您现在在服务信息输出中列出了一个端点。

让我们使用 curl 访问您的端点并获得响应:

伟大的!这应该让您开始使用 Web API。随意查看 Golang](https://github.com/aws/aws-lambda-go/tree/master/events)中的[个其他 Lambda 事件。

为什么将 Go 用于您的 Lambda?

Golang 对 Lambda 的支持一直是最受期待的版本之一。当 Werner 宣布即将支持 Golang 时,re:Invent 的人群欣喜若狂。

为什么人们这么关心 Golang?简单:安全+速度的结合。

正如我们在上面看到的,Golang 是一种编译的、静态类型的语言。随着应用程序的增长,这可以帮助捕获简单的错误并保持正确性。这种安全性对于生产环境非常有用。

然而,我们多年来一直在 Lambda 中支持 Java 和 C#。这些都是编译的静态语言。有什么不同?

Java 和 C# 的冷启动时间都非常慢,以多秒为单位。 使用 Go,冷启动时间要短得多。 在我随意的测试中,我看到冷启动在 200-400 毫秒范围内,这更接近 Python 和 Javascript。

速度_和_安全。很不错的一个组合。

所有运行时的网关

最后一点关于 Lambda 上的 Golang 实现非常有趣。

main() 函数是我们的 Golang 二进制文件的入口点_不是_我们的 Lambda 处理程序函数。它是一个封装了我们的处理函数的小型 RPC 服务器:

在的掩护下,看起来 Lambda 在冷启动时启动了您的可执行文件。可执行文件侦听给定端口,通过 JSON 接收输入,并通过 JSON 发送响应。

这为将其他运行时引入 Lambda 开辟了许多可能性。您只需要引入一个实现所需 RPC 接口的可执行文件。