このトピックでは、Function ComputeのGoランタイムのコンテキストについて説明し、サンプルコードを提供します。
コンテキストとは何ですか?
Function Computeが関数コードを実行すると、コンテキストオブジェクトcontext. context
がハンドラーに渡されます。 このオブジェクトには、呼び出し、サービス、関数、トレース分析、およびランタイム環境に関する情報が含まれます。
コンテキストオブジェクトは、イベントハンドラーとHTTPハンドラーの入力パラメーターとして使用できます。 イベントハンドラーとHTTPハンドラーのコンテキスト入力パラメーターの形式と内容は同じです。 次の表に、コンテキストオブジェクトでサポートされるパラメーターを示します。
表 1. コンテキスト
パラメーター | 説明 |
変数 | |
RequestID | 関数を呼び出すためのリクエストの一意のID。 エラーが発生した場合のトラブルシューティング用のIDを記録できます。 |
Credentials | サービスにリンクされたロールを引き受けることによってFunction Computeが取得する一時的なAccessKeyペア。 一時的なAccessKeyペアは36時間有効です。 コードで |
機能 | 関数の名前、ハンドラー、メモリ、タイムアウト期間など、呼び出された関数の基本情報。 |
サービス | 関数が属するサービスに関する情報 (Log serviceの名前、関連するプロジェクト、Logstore、バージョン、サービスのエイリアスなど) 。 |
リージョン | 関数が呼び出されるリージョンのID。 たとえば、関数が中国 (上海) リージョンで呼び出された場合、リージョンIDはcn-Shanghaiです。 詳細については、「エンドポイント」をご参照ください。 |
AccountId | 関数の呼び出しに使用されるAlibaba CloudアカウントのID。 |
メソッド | |
締め切り | 関数実行のタイムアウト期間。 値はUNIX timestamp形式です。 単位:ミリ秒。 |
完全なデータ構造の詳細については、「context.go」をご参照ください。
サンプルコード
コンテキスト情報を表示するためのサンプルコード
context
パラメーターを関数のハンドラー
に追加します。 Function Computeは、前述のContextテーブルに記載されている変数情報をcontext
パラメーターに渡します。 次に、aliyun/fc-runtime-go-sdk/fccontext
パッケージをインポートし、fccontext.FromContext
メソッドを呼び出してfccontext
を取得します。
package main
import (
"context"
"encoding/json"
"log"
"github.com/aliyun/fc-runtime-go-sdk/fc"
"github.com/aliyun/fc-runtime-go-sdk/fccontext"
)
func main() {
fc.Start(echoContext)
}
func echoContext(ctx context.Context) (string, error) {
fctx, _ := fccontext.FromContext(ctx)
log.Println(fctx.AccountId)
log.Printf("%#v\n", fctx)
res, _ := json.Marshal(fctx)
return string(res), nil
}
関数の残り実行時間を取得するためのサンプルコード
次のサンプルコードは、deadline
パラメーターを使用して関数の残りの実行時間を取得する方法の例を示しています。
package main
import (
"context"
"fmt"
"log"
"time"
"github.com/aliyun/fc-runtime-go-sdk/fc"
)
func LongRunningHandler(ctx context.Context) (string, error) {
deadline, _ := ctx.Deadline()
fmt.Printf("now: %s\ndeadline: %s\n", time.Now().String(), deadline.String())
deadline = deadline.Add(-100 * time.Millisecond)
timeoutChannel := time.After(time.Until(deadline))
for {
select {
case <-timeoutChannel:
return "Finished before timing out.", nil
default:
log.Print("hello!")
time.Sleep(50 * time.Millisecond)
}
}
}
func main() {
fc.Start(LongRunningHandler)
}