第12章 関数開発リファレンスガイド


12.1. Go 関数の開発

重要

Go を使用した OpenShift Serverless Functions は、テクノロジープレビュー機能のみです。テクノロジープレビュー機能は、Red Hat 製品サポートのサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではない場合があります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビューの機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行いフィードバックを提供していただくことを目的としています。

Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。

Go 関数プロジェクトを作成 したら、指定のテンプレートを変更して、関数にビジネスロジックを追加できます。これには、関数呼び出しと返されるヘッダーとステータスコードの設定が含まれます。

12.1.1. 前提条件

12.1.2. Go 関数テンプレートの構造

Knative (kn) CLI を使用して Go 関数を作成すると、プロジェクトディレクトリーは典型的な Go プロジェクトのようになります。唯一の例外は、イメージの指定に使用される追加の func.yaml 設定ファイルです。

Go 関数にはほとんど制限がありません。唯一の要件として、プロジェクトが function モジュールで定義する必要があり、Handle() 関数をエクスポートする必要があります。

http および event トリガー関数のテンプレート構造はいずれも同じです。

テンプレート構造

fn
├── README.md
├── func.yaml 1
├── go.mod 2
├── go.sum
├── handle.go
└── handle_test.go

1
func.yaml 設定ファイルは、イメージ名とレジストリーを判断するために使用されます。
2
必要な依存関係を go.mod ファイルに追加できます。このファイルには、追加のローカル Go ファイルを含めることができます。デプロイメント用にプロジェクトをビルドすると、これらの依存関係は作成したランタイムコンテナーイメージに含まれます。

依存関係の追加例

$ go get gopkg.in/yaml.v2@v2.4.0

12.1.3. Go 関数の呼び出しについて

Knative (kn) CLI を使用して関数プロジェクトを作成する場合に、CloudEvents に応答するプロジェクト、または単純な HTTP 要求に応答するプロジェクトを生成できます。Go 関数は、HTTP 要求、CloudEvent のいずれかでトリガーされるかどうかによって、異なる方法を使用して呼び出されます。

12.1.3.1. HTTP 要求でトリガーされる関数

受信 HTTP リクエストを受信すると、関数は標準の Go コンテキスト を最初のパラメーターとして使用して呼び出され、その後に http.ResponseWriter および http.Request パラメーターが続きます。標準の Go 手法を使用してリクエストにアクセスし、関数に対応する HTTP レスポンスを設定できます。

HTTP 応答の例

func Handle(ctx context.Context, res http.ResponseWriter, req *http.Request) {
  // Read body
  body, err := ioutil.ReadAll(req.Body)
  defer req.Body.Close()
  if err != nil {
	http.Error(res, err.Error(), 500)
	return
  }
  // Process body and function logic
  // ...
}

12.1.3.2. クラウドイベントでトリガーされた関数

受信クラウドイベントが受信されると、そのイベントは CloudEvents Go SDK によって呼び出されます。この呼び出しでは、Event タイプをパラメーターとして使用します。

サポート対象の関数署名のリストが示すように、Go Context を関数契約のオプションのパラメーターとして使用できます。

サポート対象の関数署名

Handle()
Handle() error
Handle(context.Context)
Handle(context.Context) error
Handle(cloudevents.Event)
Handle(cloudevents.Event) error
Handle(context.Context, cloudevents.Event)
Handle(context.Context, cloudevents.Event) error
Handle(cloudevents.Event) *cloudevents.Event
Handle(cloudevents.Event) (*cloudevents.Event, error)
Handle(context.Context, cloudevents.Event) *cloudevents.Event
Handle(context.Context, cloudevents.Event) (*cloudevents.Event, error)

12.1.3.2.1. CloudEvent トリガーの例

クラウドイベントが受信され、これには data プロパティーに JSON 文字列が含まれます。

{
  "customerId": "0123456",
  "productId": "6543210"
}

このデータにアクセスするには、クラウドイベントデータのプロパティーをマッピングし、受信イベントからデータを取得する構造を定義する必要があります。以下の例では、Purchase 構造を使用します。

type Purchase struct {
  CustomerId string `json:"customerId"`
  ProductId  string `json:"productId"`
}
func Handle(ctx context.Context, event cloudevents.Event) (err error) {

  purchase := &Purchase{}
  if err = event.DataAs(purchase); err != nil {
	fmt.Fprintf(os.Stderr, "failed to parse incoming CloudEvent %s\n", err)
	return
  }
  // ...
}

または、Go encoding/json パッケージを使用して、バイトアレイ形式で直接 JSON としてクラウドイベントにアクセスできます。

func Handle(ctx context.Context, event cloudevents.Event) {
  bytes, err := json.Marshal(event)
  // ...
}

12.1.4. Go 関数の戻り値

HTTP リクエストによってトリガーされる関数は、レスポンスを直接設定できます。Go http.ResponseWriter を使用して、これを行うように関数を設定できます。

HTTP 応答の例

func Handle(ctx context.Context, res http.ResponseWriter, req *http.Request) {
  // Set response
  res.Header().Add("Content-Type", "text/plain")
  res.Header().Add("Content-Length", "3")
  res.WriteHeader(200)
  _, err := fmt.Fprintf(res, "OK\n")
  if err != nil {
	fmt.Fprintf(os.Stderr, "error or response write: %v", err)
  }
}

クラウドイベントによってトリガーされる関数は、何も返さないか、error または CloudEvent を返し、Knative Eventing システムにイベントをプッシュする場合があります。この場合、クラウドイベントに一意の ID、適切な ソース および 種別 を設定する必要があります。データは、定義した構造または マップ から入力できます。

CloudEvent 応答の例

func Handle(ctx context.Context, event cloudevents.Event) (resp *cloudevents.Event, err error) {
  // ...
  response := cloudevents.NewEvent()
  response.SetID("example-uuid-32943bac6fea")
  response.SetSource("purchase/getter")
  response.SetType("purchase")
  // Set the data from Purchase type
  response.SetData(cloudevents.ApplicationJSON, Purchase{
	CustomerId: custId,
	ProductId:  prodId,
  })
  // OR set the data directly from map
  response.SetData(cloudevents.ApplicationJSON, map[string]string{"customerId": custId, "productId": prodId})
  // Validate the response
  resp = &response
  if err = resp.Validate(); err != nil {
	fmt.Printf("invalid event created. %v", err)
  }
  return
}

12.1.5. Go 関数のテスト

Go 機能は、お使いのコンピューターのローカルでテストできます。kn func create を使用した関数の作成時に作成される default プロジェクトには、一部の基本的なテストが含まれる handle_test.go ファイルがあります。これらのテストは、必要に応じて拡張できます。

前提条件

  • OpenShift Serverless Operator および Knative Serving がクラスターにインストールされている。
  • Knative (kn) CLI がインストールされている。
  • kn func create を使用して関数を作成している。

手順

  1. 関数の test フォルダーに移動します。
  2. テストを実行します。

    $ go test

12.1.6. 次のステップ

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.