跳到內容

使用 Golang 將函數從 AWS Lambda 遷移到 Knative Functions

發布於:2024-06-24 ,  修訂於:2024-06-25

使用 Golang 將函數從 AWS Lambda 遷移到 Knative Functions

作者:Matthias Weßendorf,Red Hat 高級首席軟體工程師

先前的文章中,我們討論了在 Knative Function 中使用 AWS S3 儲存桶的通知。這篇文章將描述從接收 S3 通知的 AWS Lambda 函數遷移到Knative Functions

對於無伺服器函數,常見的使用案例之一是根據事件觸發器執行自訂程式碼,例如來自 AWS S3 服務的通知。使用 AWS Lambda,您可以在 Amazon 的雲端服務上執行這些程式,但在您自己的資料中心執行程式碼則困難得多。

適用於 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 用於自訂應用程式邏輯,以及 main 呼叫一些 AWS Lambda API 以註冊自訂處理常式。handler 的簽名參考了標準的 Context 和來自 AWS Lambda SDK 的 S3Event。為了能夠執行函數,需要兩個廠商特定的依賴項和一個 main 函數。這些與實際程式沒有直接關係,但為了啟動自訂 handler 並註冊以接收事件,這些是必要的技术管道。

適用於 AWS S3 的更簡單的 Knative Function

注意

若要深入瞭解 Knative Functions 以及如何使用 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 Functions 會自動處理建立進程邊界和應用中介軟體。

仔細查看 Handle 函數的簽名,我們會看到標準的 Context API 和一個 Event 類型。這不是廠商特定的匯入。它參考了 CNCF CloudEvents 的 Golang SDK,這是一個以通用方式描述事件資料的規範。

在本範例中,subject 對應到檔案名稱或 S3 物件金鑰,而 source 屬性則包含儲存桶名稱。如果需要處理整個檔案,則可以透過 data 屬性存取。

注意

CNCF CloudEvents 規範允許使用通用且獨立的方法從第三方系統接收事件,同時提供通用的標準化 API。

用於流暢開發和部署的 Knative CLI

Knative Function 專案不僅提供了一種廠商中立的方法來建立無伺服器函數,它還附帶一個方便的 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 Function

$ 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 Functions,可以輕鬆建置雲端廠商中立的函數,以使用來自 AWS S3 等第三方雲端服務的事件通知。Knative CLI 也支援將這些函數作為 Linux 容器部署到您自己的內部部署 Kubernetes 叢集,以及在本機測試函數。

若要深入瞭解 Knative Functions,請瀏覽我們網站上的文件,或加入我們的 CNCF Slack 頻道 #knative-functions

我們使用分析和 Cookie 來了解網站流量。您使用我們網站的資訊會為此目的與 Google 分享。了解更多。