コンテンツにスキップ

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 に参加してください!

サイトのトラフィックを把握するために、アナリティクスとクッキーを使用しています。お客様のサイト利用に関する情報は、その目的のためにGoogleと共有されます。詳細はこちら。