AWS Lambda
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Go 中的 AWS Lambda 函数处理程序

Go 中编写的 Lambda 函数被编写为 Go 可执行文件。在您的 Lambda 函数代码中,您需要包含 github.com/aws/aws-lambda-go/lambda 程序包,该程序包将实现适用于 Go 的 Lambda 编程模型。此外,您需要实现处理程序函数代码和 main() 函数。

package main import ( "fmt" "context" "github.com/aws/aws-lambda-go/lambda" ) type MyEvent struct { Name string `json:"name"` } func HandleRequest(ctx context.Context, name MyEvent) (string, error) { return fmt.Sprintf("Hello %s!", name.Name ), nil } func main() { lambda.Start(HandleRequest) }

请注意以下几点:

  • package main:在 Go 中,包含 func main() 的程序包必须始终名为 main

  • import:请使用此包含您的 Lambda 函数需要的库。在此实例中,它包括:

  • func HandleRequest(ctx context.Context, name MyEvent) (string, error):这是您的 Lambda 处理程序签名且包括将执行的代码。此外,包含的参数表示以下含义:

    • ctx context.Context:为您的 Lambda 函数调用提供运行时信息。ctx 是您声明的变量,以利用通过 Go 中的 AWS Lambda 上下文对象 提供的信息。

    • name MyEvent:变量名称为 name 的输入类型,其值将在 return 语句中返回。

    • string, error:返回标准错误信息。有关自定义错误处理的更多信息,请参阅Go 中的 AWS Lambda 函数错误

    • return fmt.Sprintf("Hello %s!", name), nil:只返回格式化“Hello”问候语和您在处理程序签名中提供的姓名。nil 表示没有错误,函数已成功执行。

  • func main():执行您的 Lambda 函数代码的入口点。该项为必填项。

    通过在 func main(){} 代码括号之间添加 lambda.Start(HandleRequest),您的 Lambda 函数将会执行。

    注意

    按照 Go 语言标准,开括号 ({) 必须直接置于 main 函数签名末尾。

使用结构化类型的 Lambda 函数处理程序

在上述示例中,输入类型是简单的字符串。但是,您也可以将结构化事件传递到您的函数处理程序:

package main import ( "fmt" "github.com/aws/aws-lambda-go/lambda" ) type MyEvent struct { Name string `json:"What is your name?"` Age int `json:"How old are you?"` } type MyResponse struct { Message string `json:"Answer:"` } func HandleLambdaEvent(event MyEvent) (MyResponse, error) { return MyResponse{Message: fmt.Sprintf("%s is %d years old!", event.Name, event.Age)}, nil } func main() { lambda.Start(HandleLambdaEvent) }

然后,您的请求将如下所示:

# request { "What is your name?": "Jim", "How old are you?": 33 }

而响应将如下所示:

# response { "Answer": "Jim is 33 years old!" }

有关来自 AWS 事件源的处理事件的更多信息,请参见 aws-lambda-go/events

有效处理程序签名

在 Go 中构建 Lambda 函数处理程序时,您有多个选项,但您必须遵守以下规则:

  • 处理程序必须为函数。

  • 处理程序可能需要 0 到 2 个参数。如果有两个参数,则第一个参数必须实现 context.Context

  • 处理程序可能返回 0 到 2 个参数。如果有一个返回值,则它必须实现 error。如果有两个返回值,则第二个值必须实现 error。有关实现错误处理信息的更多信息,请参阅Go 中的 AWS Lambda 函数错误

下面列出了有效的处理程序签名。TInTOut 表示类型与 encoding/json 标准库兼容。有关更多信息,请参阅 func Unmarshal,以了解如何反序列化这些类型。

  • func ()
  • func () error
  • func (TIn), error
  • func () (TOut, error)
  • func (context.Context) error
  • func (context.Context, TIn) error
  • func (context.Context) (TOut, error)
  • func (context.Context, TIn) (TOut, error)

使用全局状态

您可以声明并修改独立于 Lambda 函数的处理程序代码的全局变量。此外,您的处理程序可能声明一个 init 函数,该函数在加载您的处理程序时执行。这在 AWS Lambda 中行为方式相同,正如在标准 Go 程序中一样。您的 Lambda 函数的单个实例将不会同时处理多个事件。这意味着,如果您可以安全地更改全局状态,则可以确信这些更改将需要新的执行上下文,且不会从在前一个执行上下文定向的函数调用引入锁定或不稳定的行为。有关更多信息,请参阅下列内容:

package main import ( "log" "github.com/aws/aws-lambda-go/lambda" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/s3" "github.com/aws/aws-sdk-go/aws" ) var invokeCount = 0 var myObjects []*s3.Object func init() { svc := s3.New(session.New()) input := &s3.ListObjectsV2Input{ Bucket: aws.String("examplebucket"), } result, _ := svc.ListObjectsV2(input) myObjects = result.Contents } func LambdaHandler() (int, error) { invokeCount = invokeCount + 1 log.Print(myObjects) return invokeCount, nil } func main() { lambda.Start(LambdaHandler) }