基于 Go 的 Serverless 函数:AWS Lambda 从 A 到 Z

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

基于 Go 的 Serverless 函数与 AWS Lambda 简介

\n

Serverless 架构已成为构建可扩展且经济高效应用程序的标准。AWS Lambda 是该领域的领导者之一,而 Go (Golang) 凭借其高性能、快速启动和小巧的二进制文件大小,成为编写 serverless 函数的理想语言。在本文中,我们将介绍完整的工作流程:从创建最简单的函数到部署和监控。

\n

为什么选择 Go?与 Node.js 或 Python 不同,Go 被编译为原生二进制文件,这可将冷启动时间缩短至几十毫秒。这对于高负载系统至关重要。

\n\n

主体部分

\n\n

1. 创建和构建 Go 的 Lambda 函数

\n

任何基于 Go 的 Lambda 函数都从导入包 github.com/aws/aws-lambda-go/lambda 开始。我们来看一个最小示例:

\n\n
package main\n\nimport (\n    "github.com/aws/aws-lambda-go/lambda"\n)\n\ntype MyEvent struct {\n    Name string `json:"name"`\n}\n\ntype MyResponse struct {\n    Message string `json:"message"`\n}\n\nfunc HandleRequest(event MyEvent) (MyResponse, error) {\n    return MyResponse{Message: "你好, " + event.Name + "!"}, nil\n}\n\nfunc main() {\n    lambda.Start(HandleRequest)\n}
\n\n

要点:

\n
    \n
  • Handler 是 AWS Lambda 调用的函数。它可以接收和返回任何数据类型(结构体、字符串、接口)。
  • \n
  • 上下文 是可选的第一个参数:func HandleRequest(ctx context.Context, event MyEvent) (MyResponse, error)。允许根据超时取消执行。
  • \n
  • 错误 (error) 向 Lambda 指示执行失败。
  • \n
\n\n

2. 处理来自不同 AWS 服务的事件

\n

Lambda 通常用作 S3、DynamoDB、SQS 和 API Gateway 事件的触发器。Go 通过包 github.com/aws/aws-lambda-go/events 支持所有事件类型。

\n\n

API Gateway 示例(HTTP 请求):

\n
package main\n\nimport (\n    "github.com/aws/aws-lambda-go/lambda"\n    "github.com/aws/aws-lambda-go/events"\n)\n\nfunc handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {\n    return events.APIGatewayProxyResponse{\n        Body:       "Hello, World!",\n        StatusCode: 200,\n        Headers:    map[string]string{"Content-Type": "text/plain"},\n    }, nil\n}\n\nfunc main() {\n    lambda.Start(handler)\n}
\n\n

S3 示例(存储桶中的新对象):

\n
package main\n\nimport (\n    "context"\n    "fmt"\n    "github.com/aws/aws-lambda-go/lambda"\n    "github.com/aws/aws-lambda-go/events"\n)\n\nfunc handler(ctx context.Context, s3Event events.S3Event) error {\n    for _, record := range s3Event.Records {\n        bucket := record.S3.Bucket.Name\n        key := record.S3.Object.Key\n        fmt.Printf("新文件: %s 在存储桶 %s\\n", key, bucket)\n    }\n    return nil\n}\n\nfunc main() {\n    lambda.Start(handler)\n}
\n
    \n
  • 使用 events.S3Event、events.SNSEvent、events.DynamoDBEvent 等。
  • \n
  • 对于自定义事件(例如来自 CloudWatch),使用 json.Unmarshal。
  • \n
\n\n

3. 编译、部署和最佳实践

\n

Go 为 Linux(x86_64 或 arm64 架构)编译。为 Lambda 构建二进制文件:

\n
# 对于 x86_64\nGOOS=linux GOARCH=amd64 go build -o bootstrap main.go\n\n# 对于 ARM (Graviton) — 更便宜且更快\nGOOS=linux GOARCH=arm64 go build -o bootstrap main.go
\n\n

然后打包为 ZIP 并通过 AWS CLI 或控制台上传:

\n
zip function.zip bootstrap\naws lambda create-function \\\n    --function-name my-go-function \\\n    --runtime provided.al2023 \\\n    --role arn:aws:iam::XXXXXXXXXXX                

博客

书籍推荐