使用 Golang 将 AWS Lambda 函数迁移到 Knative 函数 ¶
发布时间:2024-06-24, 修订时间:2024-06-25
使用 Golang 将 AWS Lambda 函数迁移到 Knative 函数¶
作者:Matthias Weßendorf,红帽高级首席软件工程师
在 上一篇文章 中,我们讨论了在 Knative 函数中消费来自 AWS S3 存储桶的通知。本文将介绍从接收 S3 通知 的 AWS Lambda 函数迁移到 Knative 函数 的过程。
对于无服务器函数,常见用例之一是根据事件触发器(例如来自 AWS S3 服务的通知)执行自定义代码。使用 AWS Lambda,您可以在亚马逊的云产品上运行这些程序,但在您自己的数据中心运行这些代码要困难得多。
用于 AWS S3 的 Lambda 函数¶
查看一个 Lambda 示例存储库,它显示了一个接收 AWS S3 事件通知的最小但完整的函数。让我们看一下代码
// main.go
package main
import (
"fmt"
"context"
"github.com/aws/aws-lambda-go/lambda"
"github.com/aws/aws-lambda-go/events"
)
func handler(ctx context.Context, s3Event events.S3Event) {
for _, record := range s3Event.Records {
s3 := record.S3
fmt.Printf("[%s - %s] Bucket = %s, Key = %s \n", record.EventSource, record.EventTime, s3.Bucket.Name, s3.Object.Key)
}
}
func main() {
// Make the handler available for Remote Procedure Call by AWS Lambda
lambda.Start(handler)
}
您在这里看到两个函数:用于自定义应用程序逻辑的 handler
和调用一些 AWS Lambda API 来注册自定义处理程序的 main
。handler
的签名引用了标准 Context
和来自 AWS Lambda SDK 的 S3Event
。为了能够运行该函数,需要两个供应商特定的依赖项和一个 main
函数。这些与实际程序无关,但对于启动自定义 handler
并将其注册为接收事件是必要的技术管道。
用于 AWS S3 的更简单的 Knative 函数¶
注意
要了解有关 Knative 函数以及如何使用 func
CLI 创建、构建和部署项目的更多信息,请查看 文档。
在 上一篇文章 中,我们讨论了如何在使用 Knative Eventing 的内部部署群集中消费来自 AWS Lambda 的通知。让我们再看一下 S3 项目的 main.go
文件
package function
import (
"context"
"fmt"
"github.com/cloudevents/sdk-go/v2/event"
)
// Handle an event.
func Handle(ctx context.Context, ce event.Event) (*event.Event, error) {
fmt.Println("Received S3 event notification")
fmt.Println("CloudEvent Subject attribute: " + ce.Subject())
fmt.Println("CloudEvent Source attribute: " + ce.Source())
// Some processing of the payload of the CloudEvent...
return nil, nil
}
请注意,此完整程序只包含一个函数,该函数专注于处理传入事件。不需要 main
,也不需要使用中间件注册我们的事件处理程序。因此,也不需要导入。Knative 函数会自动处理创建进程边界和应用中间件。
仔细查看 Handle
函数的签名,我们看到了标准 Context
API 和 Event
类型。这不是供应商特定的导入。它引用了 Golang SDK for CNCF CloudEvents,这是一种以通用方式描述事件数据的规范。
在本示例中,subject
映射到文件名称或 S3 对象键,而 source
属性包含存储桶名称。如果需要处理整个文件,则可以通过 data
属性访问它。
注意
CNCF CloudEvents 规范允许从第三方系统接收事件时采用通用且独立的方法,同时提供通用且标准化的 API。
用于顺利开发和部署的 Knative CLI¶
Knative 函数项目不仅提供了一种与云供应商无关的方法来创建无服务器函数,而且还提供了一个方便的 CLI,可以帮助您创建 Linux 容器映像并将其部署到 Kubernetes 集群。这在 上一篇博文 中有所介绍。它还允许您通过调用以下命令在本地测试和运行该函数:
$ func run
该程序的日志如下所示:
Building function image
🙌 Function built: <your-container-registry>/<account>/<image>:<tag>
Initializing CloudEvent function
listening on http port 8080
Running on host port 8080
现在您可以像这样简单地在您的机器上测试 Knative 函数:
$ curl -v -X POST \
-H "content-type: application/json" \
-H "ce-specversion: 1.0" \
-H "ce-source: /my/file/storage" \
-H "ce-type: test.event.type" \
-H "ce-subject: test-file.txt" \
-H "ce-id: $(uuid)" \
http://127.0.0.1:8080
结论¶
使用 Knative 函数,可以轻松构建与云供应商无关的函数,用于消费来自第三方云服务(例如 AWS S3)的事件通知。Knative CLI 还支持将这些函数作为 Linux 容器部署到您自己的内部部署 Kubernetes 集群中,以及在本地测试该函数。
要了解有关 Knative 函数的更多信息,请访问我们网站上的 文档,或加入我们的 CNCF Slack 频道 #knative-functions!