Function Compute の Go ランタイムは、呼び出しごとに context.Context オブジェクトをハンドラに渡します。このオブジェクトには、呼び出しメタデータ、一時的な認証情報、実行タイミング情報、トレース分析データが含まれています。これらは、他の Alibaba Cloud サービスと連携したり、タイムアウトに適切に対応したりする関数を構築するために必要なすべての情報です。
コンテキストオブジェクトの使用タイミング
ハンドラが以下のことを行う必要がある場合に、コンテキストオブジェクトを使用します。
現在の呼び出し (リクエスト ID、アカウント、リージョン) を識別する
Object Storage Service (OSS) などの他の Alibaba Cloud サービスに、コード内で認証情報をハードコーディングすることなくアクセスする
実行時間を監視し、関数がタイムアウトする前にグレースフルシャットダウンを実装する
ランタイム時に関数またはサービスの構成を検査する
イベントハンドラと HTTP ハンドラはどちらも、同じフィールドを持つ同じコンテキストオブジェクトを受け取ります。
コンテキストフィールド
aliyun/fc-runtime-go-sdk/fccontext パッケージをインポートし、fccontext.FromContext(ctx) を呼び出して、標準 Go context.Context から型付き fccontext オブジェクトを抽出します。
完全なデータ構造については、「context.go」をご参照ください。
変数
| フィールド | 説明 |
|---|---|
RequestID | 呼び出しの一意の ID です。エラーのトラブルシューティングに役立つように、この ID を記録してください。 |
Credentials | サービスリンクロールを引き受けることで取得した一時的な AccessKey ペアで、有効期間は 36 時間です。これを使用すると、関数コードに AccessKey ペアをハードコーディングすることなく、OSS などのサービスを呼び出すことができます。詳細については、「RAM ロールを使用して Alibaba Cloud アカウント間で権限を付与する」をご参照ください。 |
Function | 呼び出された関数に関する基本情報です。名前、ハンドラ、メモリ、タイムアウト期間が含まれます。 |
Service | 関数が属するサービスに関する情報です。名前、Log Service の関連プロジェクトと Logstore、バージョン、エイリアスが含まれます。qualifier フィールドはバージョンまたはエイリアスを指定し、version_id はバージョンを指定します。 |
Region | 関数が呼び出されるリージョンの ID です。例えば、中国 (上海) リージョンの場合は cn-shanghai です。詳細については、「エンドポイント」をご参照ください。 |
AccountId | 関数を呼び出すために使用される Alibaba Cloud アカウントの ID です。 |
メソッド
| メソッド | 説明 |
|---|---|
deadline | 関数の実行がタイムアウトする時点を、ミリ秒単位の UNIX タイムスタンプとして表します。この値を取得するには、ctx.Deadline() を使用します。 |
例
コンテキスト情報の表示
この例は、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
}残りの実行時間の取得
この例は、ctx.Deadline() を使用して、関数がタイムアウトするまでの残りの時間を判断し、操作中に強制終了されるのではなく、デッドラインの 100 ミリ秒前にクリーンに終了する方法を示しています。
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)
}