Go 中的 Amazon Lambda 函数处理程序
Lambda 函数处理程序是函数代码中处理事件的方法。当调用函数时,Lambda 运行处理程序方法。当该处理程序退出或返回一个响应时,它便可用于处理另一个事件。
在 Gomain()
函数。
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 函数所需的库。在此实例中,它包括:
-
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 函数错误。
下面列出了有效的处理程序签名。TIn
和 TOut
表示类型与 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) }