Go 中的 Amazon Lambda 函数处理程序 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

Go 中的 Amazon Lambda 函数处理程序

Lambda 函数处理程序是函数代码中处理事件的方法。当调用函数时,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 函数所需的库。在此实例中,它包括:

    • 上下文:Go 中的 Amazon Lambda上下文对象

    • fmt:用于格式化您的函数返回的值的 Go 格式化对象。

    • github.com/aws/aws-lambda-go/lambda:如前所述,您可以用它来实现适用于 Go 的 Lambda 编程模型。

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

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

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

    • string, error:返回两个值:成功时的字符串和标准错误信息。有关自定义错误处理的更多信息,请参阅Go 中的 Amazon Lambda 函数错误

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

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

    通过在 func main(){} 代码括号之间添加 lambda.Start(HandleRequest),可以执行您的 Lambda 函数。按照 Go 语言标准,开括号 ({) 必须直接置于 main 函数签名末尾。

命名

在 Go 中配置函数时,处理程序设置的值为可执行文件的名称。例如,如果您将处理程序的值设置为 Handler,Lambda 将在 Handler 可执行文件中调用该 main() 函数。

要在 Lambda 控制台中更改函数处理程序名称,请在 Runtime settings(运行时设置)窗格中,选择 Edit(编辑)。

使用结构化类型的 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!" }

若要导出,事件结构中的字段名称必须大写。有关来自Amazon事件源的处理事件的更多信息,请参阅 aws-lambda-go/events

有效处理程序签名

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

  • 处理程序必须为函数。

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

  • 处理程序可能返回 0 到 2 个参数。如果有一个返回值,则它必须实现 error。如果有两个返回值,则第二个值必须实现 error。有关实现错误处理信息的更多信息,请参阅Go 中的 Amazon 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 函数,该函数在加载您的处理程序时执行。这在 Amazon 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) }