すべてのプロダクト
Search
ドキュメントセンター

Function Compute:背景

最終更新日:Sep 02, 2024

このトピックでは、Function ComputeのGoランタイムのコンテキストについて説明し、サンプルコードを提供します。

コンテキストとは何ですか?

Function Computeが関数コードを実行すると、コンテキストオブジェクトcontext. contextがハンドラーに渡されます。 このオブジェクトには、呼び出し、サービス、関数、トレース分析、およびランタイム環境に関する情報が含まれます。

コンテキストオブジェクトは、イベントハンドラーとHTTPハンドラーの入力パラメーターとして使用できます。 イベントハンドラーとHTTPハンドラーのコンテキスト入力パラメーターの形式と内容は同じです。 次の表に、コンテキストオブジェクトでサポートされるパラメーターを示します。

表 1. コンテキスト

パラメーター

説明

変数

RequestID

関数を呼び出すためのリクエストの一意のID。 エラーが発生した場合のトラブルシューティング用のIDを記録できます。

Credentials

サービスにリンクされたロールを引き受けることによってFunction Computeが取得する一時的なAccessKeyペア。 一時的なAccessKeyペアは36時間有効です。 コードで資格情報を使用して、Object Storage Service (OSS) などの関連サービスにアクセスできます。 これにより、AccessKeyペアを関数コードに記述することなく、サービスにアクセスできます。 詳細については、「他のAlibaba Cloudサービスへのアクセス権限付与」をご参照ください。

機能

関数の名前、ハンドラー、メモリ、タイムアウト期間など、呼び出された関数の基本情報。

サービス

関数が属するサービスに関する情報 (Log serviceの名前、関連するプロジェクト、Logstore、バージョン、サービスのエイリアスなど) 。 qualifierパラメーターは、サービスのバージョンまたはエイリアスを指定します。 version_idパラメーターは、サービスのバージョンを指定します。

リージョン

関数が呼び出されるリージョンの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)
}