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 への移行について説明します。
サーバーレス関数を使用する場合の一般的なユースケースの 1 つは、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)
}
ここには 2 つの関数があります。カスタムアプリケーションロジック用の handler
と、カスタムハンドラーを登録する AWS Lambda API を呼び出す main
です。handler
のシグネチャは、標準の Context
と AWS Lambda SDK からの S3Event
を参照します。関数を実行できるようにするには、2 つのベンダー固有の依存関係と 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
}
この完全なプログラムには、受信イベントの処理に焦点を当てた 1 つの関数のみが含まれていることに注意してください。main
や、ミドルウェアにイベントハンドラーを登録する必要はありません。したがって、インポートも必要ありません。Knative Functions は、プロセスの境界を作成し、ミドルウェアを自動的に適用します。
Handle
関数のシグネチャを詳しく見ると、標準の Context
API と Event
型が表示されます。これはベンダー固有のインポートではありません。CNCF CloudEvents の Golang SDK を参照しています。これは、イベントデータを共通の方法で記述するための仕様です。
この例では、subject
はファイル名または S3 オブジェクトキーにマッピングされ、source
属性にはバケット名が含まれています。ファイル全体を処理する場合、data
属性を介してアクセスできます。
注記
CNCF CloudEvents 仕様により、共通の標準化された API を提供しながら、サードパーティ システムからイベントを受信するための汎用的で独立したアプローチが可能になります。
スムーズな開発とデプロイのための Knative CLI¶
Knative Function プロジェクトは、サーバーレス関数の作成にベンダーニュートラルなアプローチを提供するだけでなく、Linux コンテナイメージの作成と Kubernetes クラスターへのデプロイを支援する便利な CLI も付属しています。これについては、以前のブログ投稿で説明しました。また、次を呼び出すことで、関数をローカルでテストおよび実行することもできます。
$ 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 などのサードパーティ クラウド サービスからのイベント通知を消費するための、クラウドベンダーに依存しない関数を簡単に構築できます。これらの関数を Linux コンテナとして独自のオンプレミス Kubernetes クラスターにデプロイすることも、Knative CLI でサポートされており、関数をローカルでテストすることもできます。
Knative Functions の詳細については、当社の Web サイトのドキュメントを参照するか、CNCF Slack チャネル #knative-functions に参加してください!