使用 Azure SDK for Go 進行資料平面操作

學習如何透過 Azure SDK for Go 用戶端函式庫,程式化地與儲存在 Azure 服務中的資料互動。 關於管理函式庫與用戶端函式庫如何相互銜接的更高層次介紹,請參見 Go 管理函式庫Azure SDK概覽。 本文聚焦於資源已存在後使用的 Go 資料平面模式,並回溯到用於配置與設定工作的 控制平面操作 。

什麼是 Azure 資料平面?

Azure 資料平面是一組用來與 Azure 服務內資料互動的 API,包括上傳 blob、傳送訊息、查詢資料庫以及擷取機密資料。 當控制平面負責配置和配置資源時,資料平面則是你的應用程式在執行時呼叫的。 常見的 Go 工作流程是在一次性的設定或自動化過程中使用控制平面程式碼,然後將數據平面客戶端保留在每天運行的應用程式路徑中。

Go 的 Azure SDK 透過服務專屬套件(如 azblob、azservicebus、azeventhubs、azsecrets 以及 azcosmos 來暴露資料平面。 每個套件連接已配置好的資源,並遵循一致的模式:

  1. 請使用套件來進行 azidentity 驗證。
  2. 透過使用服務端點或連接字串建立類型化客戶端。
  3. 呼叫用戶端的方法來讀取、寫入或處理資料。
  4. 處理分頁結果和錯誤。

Go 資料平面操作的常見情境包括:

  • 從 Blob 儲存體 上傳與下載檔案
  • 與 服務匯流排 或事件集線器發送及接收訊息
  • 在 Cosmos DB 中儲存與查詢文件
  • 從 金鑰保存庫 取得秘密、金鑰與憑證
  • 利用應用程式洞察監控應用程式效能

驗證

資料平面操作支援控制平面操作使用的「azidentity」套件中的相同憑證類型。 所有憑證類型都會實作這個 azcore.TokenCredential 介面,所以你可以在不改客戶端程式碼的情況下交換它們。

資料層客戶端使用服務端點(URL 或命名空間)和認證,而不是訂閱 ID:

// Create credential that auto-discovers authentication
cred, err := azidentity.NewDefaultAzureCredential(nil)

// Blob Storage - pass the storage account URL
blobClient, err := azblob.NewClient("https://mystorageaccount.blob.core.windows.net/", cred, nil)

// Key Vault secrets - pass the vault URL
secretClient, err := azsecrets.NewClient("https://mykeyvault.vault.azure.net/", cred, nil)

// Service Bus - pass the fully qualified namespace
sbClient, err := azservicebus.NewClient("mynamespace.servicebus.windows.net", cred, nil)

部分服務也支援無法使用憑證驗證的環境的連線字串:

// Connection string authentication (when token auth is not available)
client, err := azservicebus.NewClientFromConnectionString(connectionString, nil)

對於在 Azure 運行的生產工作負載,請使用管理身份。 在本地開發時,DefaultAzureCredential 的功能是自動從 az login、環境變數或其他來源中發現憑證。

關於憑證類型與最佳實務的完整指南,請參閱 Authentication with the Azure SDK for Go 以及 azidentity 套件文件。

分頁

許多資料平面操作會回傳可能相當大的集合。 SDK 使用分頁器模式來執行以下操作:

// Create a pager for listing large result sets
pager := client.NewListSecretPropertiesPager(nil)

// Iterate through pages until no more results
for pager.More() {
	page, err := pager.NextPage(ctx)
	if err != nil {
		return err
	}

	for _, item := range page.Value {
		fmt.Println(*item.ID)
	}
}

回傳 *Pager 類型的方法在所有資料平面套件中遵循相同的迭代模式。

欲了解更多關於分頁及其他常見模式的細節,請參閱《Azure SDK for Go 常見使用模式》。

錯誤處理

資料平面操作會回傳結構化錯誤,您可以檢查特定錯誤碼:

import "github.com/Azure/azure-sdk-for-go/sdk/azcore"

// Check if the error is an Azure service error with structured details
var respErr *azcore.ResponseError
if errors.As(err, &respErr) {
	fmt.Printf("Error code: %s\n", respErr.ErrorCode)
	fmt.Printf("Status code: %d\n", respErr.StatusCode)
}

常見的資料平面錯誤碼包括BlobNotFound、MessageLockLostSecretNotFound和RequestEntityTooLarge。 請查看各服務的文件以取得完整的錯誤代碼清單。

上傳一個 blob 範例

此範例顯示了一個適用於生產環境的模式:使用 DefaultAzureCredential 進行驗證,建立 blob 用戶端,設定超時後上傳資料,並進行驗證。 此模式適用於所有資料平面用戶端。 交換服務端點和用戶端類型,以適應 服務匯流排、Event Hubs、Cosmos DB 或 金鑰保存庫。

package main

import (
	"context"
	"fmt"
	"log"
	"time"

	"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)

func main() {
	accountURL := "https://<storage-account-name>.blob.core.windows.net/"
	containerName := "demo"
	blobName := "hello.txt"
	data := []byte("hello from Go")

	// Create credential that auto-discovers authentication
	cred, err := azidentity.NewDefaultAzureCredential(nil)
	if err != nil {
		log.Fatalf("failed to create credential: %v", err)
	}

	// Set a timeout to prevent hanging on network issues
	ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
	defer cancel()

	// Create a client for the storage account
	client, err := azblob.NewClient(accountURL, cred, nil)
	if err != nil {
		log.Fatalf("failed to create blob client: %v", err)
	}

	// Upload data directly from a byte slice
	_, err = client.UploadBuffer(ctx, containerName, blobName, data, nil)
	if err != nil {
		log.Fatalf("failed to upload blob: %v", err)
	}

	fmt.Printf("uploaded %s to container %s\n", blobName, containerName)
}

Blob 儲存空間 (Blob 儲存體)

azblob 套件提供對 Azure Blob 儲存體 的資料平面存取,這是一個可大規模擴展的物件儲存服務。 這個套件是你的應用程式在執行時用來讀寫資料的工具。 使用獨立 armstorage 的控制平面套件來配置儲存帳號和容器。

用它來上傳和下載檔案與文件、列出和管理 blob 與容器、設定元資料與內容屬性、實作大型檔案的平行上傳,以及建立資料處理流程。

go get github.com/Azure/azure-sdk-for-go/sdk/storage/azblob

要開始,請參考 快速入門:適用於 Go 程式語言的 Azure Blob 儲存體 用戶端模組。

關於套件文件,請參見 azblob 套件參考。

Cosmos DB

azcosmos套件提供資料面存取 Azure Cosmos DB,這是一個全球分布式、多模型的資料庫。 利用它來打造需要低延遲讀寫能力的應用程式,無論規模大小皆可適用。

它用來執行文件的 CRUD 操作、對容器執行 SQL 查詢、管理分割策略以提升資料存取效率、處理大型結果集的分頁,以及執行多項目批次操作。

go get github.com/Azure/azure-sdk-for-go/sdk/data/azcosmos

要開始,請參考 快速入門:使用 Azure SDK for Go 來操作 NoSQL 的 Azure Cosmos DB。

關於套件文件,請參閱 azcosmos 套件參考文獻。

事件中樞

azeventhubs 套件提供 Azure 事件中樞 的資料平面存取,這是一個用於高吞吐量事件串流的即時資料擷取服務。

利用它發送帶有批次處理的事件以提升吞吐量效率,透過使用消費者群組接收與處理事件,管理分割區指派與檢查點,利用分割鍵進行排序保證來路由事件,並建立日誌擷取與遙測管線。

go get github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs

要開始,請參考 快速入門:使用 Go 傳送事件到事件中心或從事件中心接收事件。

有關套件文件,請參閱 azeventhubs 套件參考文獻。

金鑰保存庫

azsecrets、azkeys 以及 azcertificates 套件提供 Azure Key Vault 的資料平面存取。 這些套件是你的應用程式在執行時用來擷取秘密和執行密碼運算的。 使用獨立 armkeyvault 的控制平面套件來配置和設定保險庫實例。

利用它們來擷取與設定秘密(資料庫密碼、API 金鑰)、建立與管理用於簽署與加密的密碼學金鑰、管理具備自動續期功能的 TLS/SSL 憑證、追蹤秘密版本並實施輪替策略,以及快取秘密以降低延遲與 API 呼叫。

go get github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets
go get github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys
go get github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azcertificates

要開始使用 金鑰保存庫,請參考 快速入門:Azure Key Vault 的 Go 語言憑證用戶端函式庫。

關於套件文件,請參閱 azsecrets、azkeys,以及 azcertificates套件參考。

服務匯流排

azservicebus 套件提供資料層存取 Azure 服務匯流排——一個完全受管理的訊息中介,用於穩定的非同步通訊。

它可用於點對點通訊的隊列中發送與接收訊息、發布與訂閱主題以進行扇出模式、發送批次以提升吞吐量、排程訊息以供未來傳遞,以及實現長輪詢消費者功能,並實現訊息完成與放棄功能。

go get github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus

要開始使用 Azure 服務匯流排,請參見 快速入門:發送訊息至 Azure 服務匯流排 佇列(Go)。

關於套件文件,請參見 azservicebus 套件參考。

Application Insights

ApplicationInsights-Go模組提供與Azure Insights應用效能監控(APM)服務Azure 應用程式 Insights的遙測整合。

它可以用於追蹤或監控自訂的事件與指標,監控 API 回應時間與錯誤,實現跨服務的分散式追蹤的過程,記錄有上下文屬性的異常,以及透過抽樣來控制遙測數據的量。

go get github.com/microsoft/ApplicationInsights-Go

關於服務文件,請參閱 Application Insights 總覽。

下一步