AWS Lambda – Go 函数



Go 语言支持是 AWS 最近添加的功能。要使用 Go,您需要在创建 AWS Lambda 函数时从 AWS 控制台中选择该语言。在本章中,让我们详细了解 AWS Lambda 中的 Go 语言函数。

安装 Go

要开始使用,我们需要 Go 语言支持。在本节中,我们将详细介绍以下内容,以开始使用 Go 中的 AWS Lambda。这是 Go 下载的官方网站:https://golang.ac.cn/dl/

Go Programming

现在,根据操作系统下载软件包。按照此处提供的步骤在相应的操作系统上安装 Go。

在 Windows 上安装

请注意,对于 Windows,提供了 32 位和 64 位下载。下载 zip 文件并解压缩其内容,并将其存储在您选择的目录中。

添加控制面板 ---> 系统 ---> 高级系统设置中提供的环境变量。

System Properties

现在,单击环境变量按钮并添加如下所示的目录路径:

Environment Variables Go

您也可以编辑系统变量,如下所示:

Edit System Variable

完成这些步骤后,您应该能够开始使用 Go。打开命令提示符并检查 Go 命令的版本。查看以下屏幕截图以了解相同内容。

Command Prompt

Linux 和 Mac OS 的安装

要在 Linux 和 Mac OS 上安装软件包,请按照以下说明操作:

解压缩软件包并将其存储在/usr/local/go位置。现在,将/usr/local/go/bin添加到 PATH 环境变量。可以使用/etc/profile$HOME/.profile来完成此操作。

为此,您可以使用以下命令

export PATH=$PATH:/usr/local/go/bin

要为 Windows、Linux 和 Mac 添加 AWS 支持,请在您的 git 命令行中使用以下命令:

go.exe get -u github.com/aws/aws-lambda-go/lambda 
go.exe get -u github.com/aws/aws-lambda-go/lambdacontext
go.exe get -u github.com/aws/aws-lambda-go/cmd/build-lambda-zip

要编译 Windows/Linux/Mac 代码,请使用以下命令:

GOOS=linux GOARCH=amd64 go build -o main main.go
%GOPATH%\bin\build-lambda-zip.exe -o main.zip main

使用 GO 的 AWS Lambda 函数

构建时在 Go 中返回的程序会生成一个可执行文件。以下是带有 AWS Lambda 支持的简单 Go 程序。我们需要导入github.com/aws/aws-lambda-go/lambda,因为它具有 Lambda 编程功能。AWS Lambda 的另一个重要需求是处理程序。

Main.go

// main.go
package main

import (
   "github.com/aws/aws-lambda-go/lambda"
)
func hello() (string, error) {
   return "Hello Lambda", nil
}
func main() {
   // Make the handler available for Remote Procedure Call by AWS Lambda
   lambda.Start(hello)
}

请注意,Go程序的执行从 main 开始,其中 lambda.start 与处理程序函数一起被调用。查看以下代码:

func main() {
   // Make the handler available for Remote Procedure Call by AWS Lambda
   lambda.Start(hello)
}

现在,让我们使用 Go 命令执行上述文件,然后压缩可执行文件。

我们一直在使用的文件的结构如下所示:

Structure File

Structure File Output

使用go build,它会创建一个名为 main.exe 的可执行文件。要压缩文件并将其上传到 AWS Lambda,您可以使用以下步骤:

要编译 Windows/Linux/Mac 代码,请使用以下命令:

GOOS=linux GOARCH=amd64 go build -o main main.go
%GOPATH%\bin\build-lambda-zip.exe -o main.zip main

然后,登录到 AWS 控制台并使用Go作为运行时创建 Lambda 函数:

APIws Console Go

创建函数后,上传上面创建的可执行 zip 文件。

带有 Go 的 Lambda 函数处理程序

处理程序是 Go 程序执行开始的地方。从 main 调用到lambda.start,执行将使用处理程序函数调用。请注意,要添加的处理程序将是main

查看此处代码以了解:

func main() {
   // Make the handler available for Remote Procedure Call by AWS Lambda
   lambda.Start(hello)
}

按照以下屏幕截图操作:

Function Code

Execution Role Go

现在,保存函数并进行测试。您可以看到如下所示的执行结果。

Execution Result Go

相应的日志输出将如下所示:

Log Output Go

带有 Go 的 Context 对象

Go 中的 AWS Lambda 为 context 提供以下全局变量和属性。

  • MemoryLimitInMB - 在 aws lambda 中配置的内存限制(以 MB 为单位)。

  • FunctionName - aws lambda 函数的名称。

  • FunctionVersion - 执行的 aws lambda 函数的版本。

  • LogStreamName - CloudWatch 日志流名称。

  • LogGroupName - CloudWatch 组名称。

context 上可用的属性如下所示:

AwsRequestID

这是调用 AWS Lambda 函数时获得的 AWS 请求 ID。

ClientContext

当通过 AWS Mobile SDK 调用时,它包含有关客户端应用程序和设备的详细信息。它可能为 null。客户端上下文提供客户端 ID、应用程序标题、版本名称、版本代码和应用程序包名称等详细信息。

InvokedFunctionArn

调用的函数的 ARN。非限定 ARN 执行 $LATEST 版本,别名执行其指向的函数版本。

Identity

当与 AWS Mobile SDK 一起使用时,它提供有关 Amazon Cognito 身份提供程序的详细信息。

添加到main.go以打印上下文详细信息的更改:

// main.go
package main

import (
   "context"
   "log"
   "github.com/aws/aws-lambda-go/lambda"
   "github.com/aws/aws-lambda-go/lambdacontext"
)

func hello(ctx context.Context) (string, error) {
   lc, _ := lambdacontext.FromContext(ctx);
   log.Print(lc);
   log.Print(lc.AwsRequestID);
   log.Print(lc.InvokedFunctionArn);
   return "Hello Lambda", nil
}

func main() {
   // Make the handler available for Remote Procedure Call by AWS Lambda
   lambda.Start(hello)
}

我们需要导入loglambda context才能与 Go 一起使用。上下文详细信息如下:

func hello(ctx context.Context) (string, error) {
   lc, _ := lambdacontext.FromContext(ctx);
   log.Print(lc);
   log.Print(lc.AwsRequestID);
   log.Print(lc.InvokedFunctionArn);	
   return "Hello Lambda", nil
}

您可以在测试上述代码时观察以下输出:

Execution Result Output

记录数据

使用Go,您可以使用 log 或 fmt 模块记录数据,如下所示:

// main.go
package main

import (
   "log"
   "fmt"
   "github.com/aws/aws-lambda-go/lambda"
)

func hello() (string, error) {
   log.Print("Hello from Lambda Go using log");
   fmt.Print("Hello from Lambda Go using fmt");
   return "Hello Lambda", nil
}

func main() {
   // Make the handler available for Remote Procedure Call by AWS Lambda
   lambda.Start(hello)
}

相同输出如下所示:

Logging Data

在 CloudWatch 中检查日志

您也可以在 CloudWatch 中查看日志。为此,请转到 AWS 服务并选择 CloudWatch,然后单击左侧的日志。现在,在列表中搜索 Lambda 函数以查看日志:

Checking Logs

函数错误

您可以使用以下代码所示的 errors 模块在 AWS Lambda 中创建自定义错误处理:

// main.go
package main
import (
   "errors"
   "github.com/aws/aws-lambda-go/lambda"
)

func hello() error  {
   return errors.New("There is an error in the code!")
}

func main() {
   // Make the handler available for Remote Procedure Call by AWS Lambda
   lambda.Start(hello)
}

上面显示的代码的输出如下所示:

Function Errors
广告