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

Function Compute:背景

最終更新日:Aug 08, 2024

このトピックでは、Function ComputeでGoランタイムを使用してコードを記述するためのコンテキストと、コンテキストのサンプルコードについて説明します。

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

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

次の表に、コンテキストに含まれるパラメーターを示します。

表 1. コンテキスト

パラメーター

説明

変数

RequestID

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

Credentials

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

Function

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

サービス

関数が属するサービスに関する情報 (Simple Log serviceの名前、関連プロジェクト、Logstore、バージョン、サービスのエイリアスなど) 。 qualifierパラメーターは、関数を呼び出すときに指定されるサービスのバージョンまたはエイリアスを示します。 versionIdパラメーターは、実際に呼び出されるサービスのバージョンを示します。

リージョン

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