このトピックでは、Function ComputeでGoランタイムを使用してコードを記述するためのコンテキストと、コンテキストのサンプルコードについて説明します。
コンテキストとは何ですか?
Function Computeが関数を実行すると、function Computeはコンテキストオブジェクトcontext. context
を関数の実行に使用するハンドラーに渡します。 コンテキストには、呼び出し、サービス、関数、トレース分析、およびランタイム環境に関する情報が含まれます。
次の表に、コンテキストに含まれるパラメーターを示します。
表 1. コンテキスト
パラメーター | 説明 |
変数 | |
RequestID | 関数を呼び出すために使用されるリクエストの一意のID。 エラーが発生した場合のトラブルシューティング用のIDを記録できます。 |
Credentials | サービスにリンクされたロールを引き受けることによってFunction Computeが取得する一時的なAccessKeyペア。 一時的なAccessKeyペアは36時間有効です。 コードで |
Function | 関数の名前、ハンドラー、メモリ、タイムアウト期間など、呼び出された関数に関する基本情報。 |
サービス | 関数が属するサービスに関する情報 (Simple Log serviceの名前、関連プロジェクト、Logstore、バージョン、サービスのエイリアスなど) 。 |
リージョン | 関数が呼び出されるリージョンのID。 たとえば、関数が中国 (上海) リージョンで呼び出された場合、リージョンIDはcn-Shanghaiです。 詳細については、「サービスエンドポイント」をご参照ください。 |
AccountId | 関数が属するAlibaba CloudアカウントのID。 |
Method | |
deadline | 関数実行のタイムアウト期間。 この値は UNIX タイムスタンプです。 単位:ミリ秒。 |
完全なデータ構造の詳細については、GitHubの「fc-runtime-go-sdk」をご参照ください。
サンプルコード
コンテキスト情報を表示するためのサンプルコード
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)
}