Azure Functions Go 開発者向けリファレンス

Important

Azure Functionsの Go サポートは現在パブリック プレビュー段階です。 プレビュー期間中、Go 関数アプリは Flex 従量課金プランでのみサポートされます。

Azure Functionsは、インフラストラクチャをプロビジョニングまたは管理することなく、イベント ドリブン コードを実行するために使用できるサーバーレス コンピューティング サービスです。 Go worker を使用すると、Azure Functions トリガー エコシステムに深く統合して、Go でネイティブにAzure Functionsを記述できます。

このガイドは、次のことに役立ちます。

  • Go プログラミング モデルを理解する
  • プロジェクト コードを作成して構成する
  • トリガーの使用
  • アプリをローカルおよびAzureでデプロイして実行する

開発全般Azure Functions詳細については、Azure Functions 開発者向けリファレンスを参照してください。

作業の開始

ワークフローに合った環境を選択し、Go 向け Azure Functions を使い始めましょう:

前提条件

  • Go 1.24 以降
  • Azure Functions Core Tools バージョン 4.12 以降。 func --versionを実行して、インストールされているバージョンを確認します。
  • Azure CLI バージョン 2.87.0 以降。Azure リソースを作成するか、パッケージをAzureにデプロイする場合。 az versionを実行して、インストールされているバージョンを確認します。

プログラミング モデル

Go ワーカーは、コード優先プログラミング モデルを使用します。 サーバーレス関数とそのトリガーは、慣用 Go ハンドラーを使用して定義します。

入り口ポイント

すべての Go コード プロジェクトは、main()を作成し、関数を登録してワーカーを開始するFunctionApp関数で始まります。

package main

import (
    "fmt"
    "net/http"

    "github.com/azure/azure-functions-golang-worker/sdk"
    "github.com/azure/azure-functions-golang-worker/worker"
)

func main() {
    app := sdk.FunctionApp()

    app.HTTP("hello", hello,
        sdk.WithMethods("GET", "POST"),
        sdk.WithAuth("anonymous"),
    )

    worker.Start(app)
}

func hello(w http.ResponseWriter, r *http.Request) {
    name := r.URL.Query().Get("name")
    if name == "" {
        name = "world"
    }
    fmt.Fprintf(w, "Hello, %s!", name)
}

関数の登録

機能オプション パターンで fluent Builder API を使用して関数を登録します。 各トリガーの種類には、 App オブジェクトに対する登録メソッドがあります。

// HTTP trigger
app.HTTP("myHttpFunc", handler,
    sdk.WithMethods("GET", "POST"),
    sdk.WithAuth("anonymous"),
)

// Timer trigger
app.Timer("myTimerFunc", handler,
    sdk.WithSchedule("0 */5 * * * *"),
)

// Azure Cosmos DB trigger
app.CosmosDB("myCosmosFunc", handler,
    sdk.WithDatabase("mydb"),
    sdk.WithContainer("mycontainer"),
    sdk.WithConnection("CosmosDBConnection"),
)

// Azure Service Bus trigger
app.ServiceBusQueue("myServiceBusFunc", handler,
    sdk.WithQueueName("myqueue"),
    sdk.WithConnection("ServiceBusConnection"),
)

// Event Hubs trigger
app.EventHub("myEventHubFunc", handler,
    sdk.WithEventHubName("myeventhub"),
    sdk.WithConnection("EventHubConnection"),
)

// Event Grid trigger
app.EventGrid("myEventGridFunc", handler)

// Blob trigger (extension model)
app.Blob("myBlobFunc", handler,
    sdk.WithPath("mycontainer/{name}"),
    sdk.WithConnection("AzureWebJobsStorage"),
)

プロジェクト構造

Azure Functions用の Go コード プロジェクトは、標準の Go モジュールです。 func init --worker-runtime goを実行すると、次のファイルが生成されます。

my-function-app/
├── host.json              # Host configuration
├── local.settings.json    # Local settings (connection strings, app settings)
├── go.mod                 # Go module file
├── go.sum                 # Go module checksums
└── main.go                # Entry point with function registrations

host.json

host.json ファイルには、ホスト レベルの構成オプションが含まれています。 詳細については、 host.json リファレンスを参照してください

local.settings.json

local.settings.json ファイルには、ローカル開発時に使用されるアプリ設定と接続文字列が格納されます。 このファイルはAzureに発行されません。 詳細については、「ローカル設定ファイル」を参照してください。

トリガー

Go ワーカーは、依存関係の要件に基づいてトリガーを 2 つのレベルに整理します。

コア トリガー

コア トリガーは、gRPC 経由でペイロードをインラインで受信します。 Azure Functions ホストはトリガー データを gRPC メッセージにシリアル化し、ワーカーは型指定された Go 構造体に逆シリアル化します。 これらのトリガーには次があります。

  • コンパイル時の安全性を持つ型指定されたハンドラーシグネチャ
  • 外部 Azure SDK への依存関係はありません: 必要なのは encoding/json のみです
  • 境界付きペイロード: 変更フィード ドキュメント、メッセージ、およびイベントは個別のサイズ制限付きオブジェクトです

サポートされているコア トリガー:

Trigger ハンドラー署名 登録メソッド
HTTP func(http.ResponseWriter, *http.Request) app.HTTP()
Timer TimerHandler app.Timer()
Azure Cosmos DB func(context.Context, []bindings.CosmosDocument) error app.CosmosDB()
Azure Service Bus (キュー) ServiceBusHandler app.ServiceBusQueue()
Azure Service Bus (トピック) ServiceBusHandler app.ServiceBusTopic()
Event Hubs EventHubHandler app.EventHub()
Event Grid EventGridHandler app.EventGrid()

拡張機能のトリガー

拡張機能トリガーは、生データではなく、認証されたAzure SDK クライアントを提供します。 ホストはメタデータ (コンテナー名や BLOB パスなど) のみを送信し、worker は特定のリソースをスコープとするクライアントを構築します。 これらのトリガーには次があります。

  • SDK クライアントの挿入: ハンドラーは、すぐに使用できるクライアントを受け取ります
  • 分離された依存関係: Azure SDK パッケージは triggers/<name>/ にあります
  • ストリーミングのサポート: gRPC を介してバッファリングすることなく、大きなペイロードを読み取れます

拡張機能トリガーを使用するには、拡張機能パッケージの空のインポートを追加します。

import _ "github.com/azure/azure-functions-golang-worker/triggers/blob"
Trigger ハンドラーが受信する 登録メソッド
Blob Storage *blob.Client app.Blob()

BLOB トリガーの例

package main

import (
    "context"
    "fmt"
    "io"
    "log"

    "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob"
    "github.com/azure/azure-functions-golang-worker/sdk"
    _ "github.com/azure/azure-functions-golang-worker/triggers/blob"
    "github.com/azure/azure-functions-golang-worker/worker"
)

func main() {
    app := sdk.FunctionApp()
    app.Blob("processBlobTrigger", processBlob,
        sdk.WithPath("samples-workitems/{name}"),
        sdk.WithConnection("AzureWebJobsStorage"),
    )
    worker.Start(app)
}

func processBlob(ctx context.Context, client *blob.Client) error {
    get, err := client.DownloadStream(ctx, nil)
    if err != nil {
        return fmt.Errorf("download error: %w", err)
    }
    data, _ := io.ReadAll(get.Body)
    get.Body.Close()
    log.Printf("Blob size: %d bytes", len(data))
    return nil
}

HTTP トリガー

HTTP トリガー ハンドラーは、標準の Go net/http 型を使用するため、Go 開発者にとってすぐに慣れ親しんでいます。

func myHandler(w http.ResponseWriter, r *http.Request) {
    name := r.URL.Query().Get("name")
    if name == "" {
        name = "world"
    }
    w.Header().Set("Content-Type", "application/json")
    fmt.Fprintf(w, `{"message": "Hello, %s!"}`, name)
}

メソッドと承認レベルを使用して HTTP 関数を登録します。

app.HTTP("myApi", myHandler,
    sdk.WithMethods("GET", "POST"),
    sdk.WithAuth("anonymous"),
)

HTTP ストリーミング

Go ワーカーは、サーバー送信イベントや大規模な応答データの送信などのシナリオで HTTP ストリーミングをサポートしています。

func streamHandler(w http.ResponseWriter, r *http.Request) {
    flusher, ok := w.(http.Flusher)
    if !ok {
        http.Error(w, "streaming not supported", http.StatusInternalServerError)
        return
    }

    w.Header().Set("Content-Type", "text/event-stream")
    for i := 0; i < 10; i++ {
        fmt.Fprintf(w, "data: message %d\n\n", i)
        flusher.Flush()
    }
}

タイマーの発動

タイマー トリガーは、cron 式によって定義されたスケジュールで実行されます。

app.Timer("myScheduledFunc", timerHandler,
    sdk.WithSchedule("0 */5 * * * *"),
)

func timerHandler(ctx context.Context, timer bindings.TimerInfo) error {
    log.Printf("Timer trigger executed at: %s", timer.ScheduleStatus.Next)
    return nil
}

依存関係管理

Go コード プロジェクトでは、依存関係管理に標準の Go モジュールが使用されます。

  1. 新しいモジュールを初期化します。

    go mod init myapp
    
  2. Azure Functions Go worker SDK を追加します。

    go get github.com/azure/azure-functions-golang-worker
    

    BLOB トリガーのサポートでは、 triggers/blobの空のインポートによって依存関係が自動的に含まれます。

  3. 依存関係を整理する:

    go mod tidy
    

ローカルで実行する

Azure Functions Core Tools を使用してプロジェクトをローカルで実行します。

func start

Core Tools が自動的に:

  1. FUNCTIONS_WORKER_RUNTIME = "native"からlocal.settings.jsonを検出します。
  2. go.mod ファイルが存在する場合、ネイティブ ワーカー ランタイムは Go として判定されます。
  3. go build -o bin/app .を実行して、ローカル オペレーティング システムのプロジェクトをコンパイルします。
  4. gRPC 経由でコンパイル済みバイナリと通信するAzure Functions ホストを起動します。
  5. 関数エンドポイント ( http://localhost:7071/api/hello など) を表示します。

local.settings.jsonを使用して、ローカル開発用の環境変数を構成します。

{
    "IsEncrypted": false,
    "Values": {
        "AzureWebJobsStorage": "",
        "FUNCTIONS_WORKER_RUNTIME": "native"
    }
}

Go プロジェクトでは、生成された AzureWebJobsStorage 値が空です。 ローカル開発中にホスト ストレージを必要とするトリガーを使用する場合は、ストレージ アカウント 接続文字列または UseDevelopmentStorage=true に設定します。

デプロイメント

コンパイルとパッケージ化

Azure Functions Core Tools バージョン 4.12 以降は、一般的なローカルおよびAzureデプロイ フローの Go ビルドを処理します。

  • func start は、ローカル Functions ホストを開始する前に、ローカル オペレーティング システムの bin/app としてプロジェクトをビルドします。
  • func azure functionapp publish は、プロジェクトをビルド、パッケージ化し、Azureの既存の関数アプリに配置します。
  • func pack は、Linux x64 用 の bin/app としてプロジェクトをビルドし、配置可能な .zip パッケージを作成します。

Azure用にパッケージ化する場合、生成された .zip ファイルには、Linux Functions ホストで必要なファイルが含まれます。 コンパイル済みのバイナリはローカル プロジェクトに bin/app として格納されますが、Core Tools はデプロイ パッケージのルートに アプリとして配置します。

func pack --no-buildを使用する場合は、パッケージ化する前に Linux x64 バイナリをビルドする必要があります。

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o bin/app .

Core Tools を使用したデプロイ

func azure functionapp publish を使用して、Go プロジェクトをAzureの既存の関数アプリにデプロイします。

func azure functionapp publish <APP_NAME>

<APP_NAME> をお使いの関数アプリの名前に置き換えます。

zip パッケージをデプロイする

発行とは別にデプロイ パッケージを作成する必要がある場合は、 func pack を使用します。

  1. デプロイ可能な zip 成果物を作成します。

    func pack
    
  2. Azure CLIを使用してパッケージをデプロイします。

    az functionapp deployment source config-zip --resource-group <RESOURCE_GROUP> --name <APP_NAME> --src <ZIP_FILE_PATH>
    

func pack によって生成されたパッケージは、Azureで実行する準備ができているため、展開時にリモート ビルドを要求しないでください。

Docker のサポート

Go コード プロジェクトはコンテナーで実行できます。 Docker サポートを使用してプロジェクトを初期化します。

func init --worker-runtime go --docker

このコマンドは、標準のプロジェクト ファイルと共に Dockerfile を生成します。

テレメトリと可観測性

Azure Functions Go ワーカーは、構造化されたログ記録と OpenTelemetry ベースの可観測性をサポートします。 log/slogなどの標準slog.InfoContext パッケージのコンテキスト対応メソッドを使用して、ログを現在の関数呼び出しに関連付けます。 OpenTelemetry を有効にするには、Functions ホストを構成し、Go worker OpenTelemetry ミドルウェアをアプリに登録します。 セットアップ手順については、「 Azure Functionsを参照してください。

既知の制限事項 (プレビュー)

パブリック プレビュー期間中は、次の制限事項が適用されます。

  • func newはサポートされていません。 main.goを直接編集して関数を追加します。
  • Durable Functionsは、パブリック プレビュー中の Go ではサポートされていません。
  • Go 関数アプリは、Azureでのみ Linux 上で実行されます。
  • プレビュー期間中は、トリガーに記載されている トリガー のみがサポートされます。
  • 現在、Core Tools の Go パッケージは Linux x64 アプリを対象としています。

次のステップ