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 Queue Storage trigger
app.Queue("myQueueFunc", handler,
sdk.WithQueueName("myqueue"),
sdk.WithConnection("AzureWebJobsStorage"),
)
// Azure Service Bus trigger
app.ServiceBusQueue("myServiceBusFunc", handler,
sdk.WithQueueName("myqueue"),
sdk.WithConnection("ServiceBusConnection"),
)
// Azure SQL trigger
app.SQL("mySqlFunc", handler,
sdk.WithTable("dbo.Products"),
sdk.WithConnection("SqlConnectionString"),
)
// 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 ワーカーには、サポート対象のトリガーを登録するための専用メソッドが用意されています。
型付きトリガー ペイロード
ほとんどのサポートされているトリガーは、gRPCを通じてペイロードをインラインで受信します。 Azure FunctionsのホストはトリガーデータをgRPCメッセージにシリアライズし、ワーカーはそれを型付きのGo値にデシリアライズします。 これらのトリガーには次があります。
- コンパイル時の安全性を持つ型指定されたハンドラーシグネチャ
-
外部 Azure SDK への依存関係はありません: 必要なのは
encoding/jsonのみです - 境界付きペイロード: 変更フィード ドキュメント、メッセージ、およびイベントは個別のサイズ制限付きオブジェクトです
サポートされているトリガー:
| Trigger | ハンドラー署名 | 登録メソッド |
|---|---|---|
| HTTP | func(http.ResponseWriter, *http.Request) |
app.HTTP() |
| Timer | TimerHandler |
app.Timer() |
| Azure Queue Storage | QueueHandler |
app.Queue() |
| 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 SQL | func(context.Context, []bindings.SQLChange) error |
app.SQL() |
Event Hubs や Service Bus は、app.EventHubBatch()、app.ServiceBusQueueBatch()、app.ServiceBusTopicBatch() を通じて厳密に型指定されたバッチ ハンドラーもサポートしています。
SDK 型のバインド
SDKタイプのバインディングは、シリアライズされたトリガーデータの代わりに認証されたAzure SDKクライアントを提供します。 Go では、Blob Storage トリガーが SDK 型のバインディングに対応しています。 ホストはコンテナ名やブロブパスなどのメタデータを送信し、ワーカーは特定のリソースにスコープを持つクライアントを構築します。 SDK型バインディングは以下を提供します:
- SDK クライアントの挿入: ハンドラーは、すぐに使用できるクライアントを受け取ります
-
分離された依存関係: Azure SDK パッケージは
triggers/<name>/にあります - ストリーミングのサポート: gRPC を介してバッファリングすることなく、大きなペイロードを読み取れます
Blob Storage SDKのタイプバインディングを使用するには、Blobトリガーパッケージのブランクインポートを追加してください:
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
}
汎用ホスト トリガー
対応するホスト拡張機能が専用の Go 登録メソッドを持たないトリガーを提供する場合は、app.GenericTrigger() を使用してください。 汎用トリガーは生テキスト、バイトスライス、JSON互換のGo型をサポートします:
app.GenericTrigger("echoTool", echoTool, &bindings.GenericTrigger{
Type: "mcpToolTrigger",
Name: "call",
DataType: "string",
Properties: map[string]any{
"toolName": "echo",
"description": "Echo text using a generic Go trigger",
"toolProperties": `[{"propertyName":"text","propertyType":"string","description":"Text to echo","isRequired":true}]`,
},
})
対応するホスト拡張機能をインストールする必要があります。 汎用トリガー登録はHTTP処理、SDKクライアントインジェクション、Durable Functionsのリプレイ、またはサービス固有のメッセージ完了処理を提供しません。 完全な例については、 ジェネリックトリガーサンプルをご覧ください。
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
}
Durable Functions
Go は middleware/durabletask オーケストレーションやアクティビティを パッケージを通じてサポートしています。 Durableミドルウェアを関数アプリに追加する前に、オーケストレーターやアクティビティを登録してください:
durable := durabletask.Middleware()
durable.Orchestrator("HelloCities", helloCities)
durable.Activity("SayHello", sayHello)
app.Use(durable)
Durable Functions for GoはDurable Task拡張バージョン3.15.0以降が必要です。 エンティティは現在サポートされていません。 完全なアプリケーションについては、Durable Functionsのサンプルをご覧ください。
依存関係管理
Go コード プロジェクトでは、依存関係管理に標準の Go モジュールが使用されます。
新しいモジュールを初期化します。
go mod init myappAzure Functions Go worker SDK を追加します。
go get github.com/azure/azure-functions-golang-workerBLOB トリガーのサポートでは、
triggers/blobの空のインポートによって依存関係が自動的に含まれます。依存関係を整理する:
go mod tidy
ローカルで実行する
Azure Functions Core Tools を使用してプロジェクトをローカルで実行します。
func start
Core Tools が自動的に:
-
FUNCTIONS_WORKER_RUNTIME = "native"からlocal.settings.jsonを検出します。 -
go.modファイルが存在する場合、ネイティブ ワーカー ランタイムは Go として判定されます。 -
go build -o bin/app .を実行して、ローカル オペレーティング システムのプロジェクトをコンパイルします。 - gRPC 経由でコンパイル済みバイナリと通信するAzure Functions ホストを起動します。
- 関数エンドポイント (
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 を使用します。
デプロイ可能な zip 成果物を作成します。
func packAzure 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 ミドルウェアをアプリに登録します。 セットアップ手順については、「
既知の制限
-
func newはサポートされていません。main.goを直接編集して関数を追加します。 - Goの機能アプリはFlex ConsumptionプランでのみLinux上で動作します。
- Triggersに記載された専用トリガーと、対応する汎用ホストトリガーのみがサポートされています。
- 追加の入力バインディングや非HTTP出力バインディングは現在サポートされていません。
- 現在、Core Tools の Go パッケージは Linux x64 アプリを対象としています。