使用 Azure SDK for Go 來進行控制平面操作

學習如何使用 Azure SDK for Go 管理函式庫,以程式化方式配置、配置及管理 Azure 資源。 常見的控制平面工作流程包括建立資源群組、管理儲存與網路基礎設施,以及處理虛擬機(VM)生命週期操作,如建立、啟動、停止、調整大小、更新與刪除。 如果你想更深入了解管理函式庫如何融入 Go Azure SDK,可以從 Overview of the Azure SDK for Go 管理庫開始。 本文聚焦於你在各服務間重複使用的 Go 控制平面模式,並連結到當執行階段路徑從資源管理轉向服務資料處理時的資料 平面指引

什麼是 Azure 控制平面?

Azure 控制平面是一組 API,負責控制 Azure 資源的生命週期——包括建立、更新、配置與刪除資源。 你在 Azure 入口網站、Azure CLI 或基礎設施即程式碼工具中執行的每一個操作,最終都會呼叫這些控制平面 API。

Go 的 Azure SDK 透過一組 arm* 套件在 github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/ 下暴露控制平面。 每個套件對應到 Azure 資源提供者,並遵循一致的模式:

  1. 請使用套件來進行 azidentity 驗證。
  2. 為你想管理的資源建立一個具類型的客戶端。
  3. 呼叫用戶端的方法來建立、讀取、更新或刪除資源。
  4. 使用輪詢器處理長期執行的操作。

Go 語言控制層自動化的常見情境包括:

  • 部署管線的基礎建設配置
  • 管理虛擬機生命週期操作,如建立、更新、刪除、啟動、停止及調整大小
  • 為平台團隊打造客製化 CLI 與運算元
  • 實作 GitOps 風格的基礎架構對帳
  • 自動化合規稽核與漂移偵測

驗證

所有管理操作都需要來自 azidentity 套件中的認證憑證。 該套件提供所有環境的憑證類型,包括本地開發、CI/CD 管線,以及在 Azure 中運行的生產工作負載。 所有憑證類型都實作相同的 azcore.TokenCredential 介面,因此你可以在不更改客戶端程式碼的情況下交換它們。

取得憑證後,為該套件建立客戶端工廠,然後請求它提供你需要的類型客戶端:

// Create credential that auto-discovers authentication (Azure CLI, env vars, managed identity)
cred, err := azidentity.NewDefaultAzureCredential(nil)

// Construct a client factory, then the typed client for management operations
clientFactory, err := armresources.NewClientFactory(subscriptionID, cred, nil)
rgClient := clientFactory.NewResourceGroupsClient()

目前 arm* 的套件文件通常會顯示客戶端工廠模式,因為它集中管理相關客戶端的共享設定。 許多套件也會提供直接的 New<ResourceType>Client(subscriptionID, credential, options) 建構子,但 NewClientFactory(...).New<ResourceType>Client() 這個模式是你最常在 pkg.go.dev 上看到的。 在本地開發時,DefaultAzureCredential 通常會接收你的 Azure CLI 登入。 在 CI/CD 和已部署的工作負載中,你可以切換到環境基礎憑證或管理身份,而不需更改其他客戶端程式碼。

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

用戶端套件與類型用戶端

管理方案位於github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/<service>/arm<service>。 安裝身份套件,以及只有你打算使用的 arm* 套件。 例如,如果你只管理虛擬機和資源群組,只需要 armcomputearmresources。 每個套件包含用於該服務資源的客戶端。 例如,armcompute 提供用於虛擬機、磁碟、映像檔及相關運算資源的客戶端。

單一管理套件通常包含多個客戶端,每個客戶端專注於單一資源類型或操作群組。 例如,包含 armcompute 虛擬機、磁碟、映像檔及相關資源的用戶端。 選擇服務套件後,建立一個客戶端工廠,並重複使用它來建立符合你想管理資源的類型客戶端。

clientFactory, err := armcompute.NewClientFactory(subscriptionID, cred, nil)
if err != nil {
	return err
}
vmClient := clientFactory.NewVirtualMachinesClient()

這個套件與客戶端工廠的模式在各 resourcemanager 模組間是一致的。 當你掃描 pkg.go.dev 或請代理人找到合適的客戶時,這是一個很有用的捷徑。

長時間執行的作業

許多管理操作,如建立叢集、刪除資源群組及升級基礎設施,皆為非同步執行。 以Begin為前綴的方法會啟動伺服器端工作並立即回傳輪詢器。 你的程式碼可以決定是等待還是繼續做其他工作:

// Start an asynchronous operation (returns immediately)
poller, err := client.BeginCreateOrUpdate(ctx, resourceGroupName, parameters, nil)
if err != nil {
	return err
}

// Block until the operation completes or fails
result, err := poller.PollUntilDone(ctx, nil)
if err != nil {
	return err
}

成功的 Begin* 通話僅表示Azure接受了請求。 當輪詢器執行時,操作仍可能失敗。 這就是為什麼初次呼叫和 PollUntilDone 都需要錯誤處理。 當你想要最簡單的流程時使用 PollUntilDone 。 使用 poller.Poll 以及 poller.Done 當你需要自訂等待邏輯或進度報告時。

欲了解更多模式細節,請參閱 Azure SDK 中的 常見使用模式 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)
}

大多數 CreateOrUpdate 運算都是冪元運算。 在現有資源上呼叫這些功能時,會更新資源,而不會導致錯誤。

資源配置範例

此範例展示了常見的控制平面模式:認證、建立帶有標籤與逾時的資源,並檢查結果。 使用此模式作為所有管理操作的範本,因為憑證、上下文與訂閱 ID 模式適用於所有 arm* 用戶端。

package main

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

	"github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
	"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
	"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources"
)

func main() {
	// Read subscription ID from environment (avoid hardcoding)
	subscriptionID := os.Getenv("AZURE_SUBSCRIPTION_ID")
	if subscriptionID == "" {
		log.Fatal("AZURE_SUBSCRIPTION_ID not set")
	}

	// 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 for the entire operation (prevents hanging indefinitely)
	ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute)
	defer cancel()

	// Create a client factory for this management package
	clientFactory, err := armresources.NewClientFactory(subscriptionID, cred, nil)
	if err != nil {
		log.Fatalf("failed to create client factory: %v", err)
	}

	// Create the typed client for resource groups
	rgClient := clientFactory.NewResourceGroupsClient()

	// Many ARM models use pointer fields for optional values.
	resp, err := rgClient.CreateOrUpdate(ctx, "example-rg", armresources.ResourceGroup{
		Location: to.Ptr("eastus"),
		Tags: map[string]*string{
			"env":  to.Ptr("dev"),
			"team": to.Ptr("platform"),
		},
	}, nil)
	if err != nil {
		log.Fatalf("failed to create or update resource group: %v", err)
	}

	fmt.Printf("resource group %s ready in %s\n", *resp.Name, *resp.Location)
}

資源群組

armresources套件管理資源群組——Azure中基本的組織容器。 每個 Azure 資源都存在於一個資源群組中,因此這是任何配置工作流程的起點。

用它來建立和更新包含位置和標籤的資源群組,列出訂閱內的群組,並刪除包含的所有資源群組。 資源群組建立是同步且冪等的。 刪除是非同步且永久的。

列出資源群組也引入了一個重要的控制平面模式:許多讀取操作使用分頁器。 當你列舉資源群組或其他大型 ARM 集合時,建立分頁器並迭代直到 pager.More() 返回 false

pager := rgClient.NewListPager(nil)
for pager.More() {
	page, err := pager.NextPage(ctx)
	if err != nil {
		return err
	}

	for _, group := range page.ResourceGroupListResult.Value {
		fmt.Println(*group.Name)
	}
}

資源群組管理程式碼範例

欲了解入門指南,請參閱 armresources 套件文件

虛擬機器

armcompute 套件是一個典型的控制平面範例,因為虛擬機管理主要是生命週期工作:建立或更新虛擬機、啟動或停止、調整大小及刪除。 在 Go 中,這些工作流程使用與資源群組範例中相同的 DefaultAzureCredential、 、 context.Context和 用戶端工廠模式,因此一旦建立該模式,你可以在不改變認證方式的情況下,將其套用於運算操作中。

如果你需要快速起點,先建立計算客戶端工廠,然後請求它提供型別化的虛擬客戶端:

clientFactory, err := armcompute.NewClientFactory(subscriptionID, cred, nil)
if err != nil {
	return err
}
vmClient := clientFactory.NewVirtualMachinesClient()

如需完整 VM 範例及操作專屬指引,請參閱現有的 虛擬機器管理範例 以及 armcompute 套件文件。 請使用這些參考資料來取得完整的請求模型和長期執行的操作細節,而非在本文中重複大型虛擬機範本。

金鑰保存庫

armkeyvault套件負責管理Azure Key Vault實例的生命週期。 此套件負責管理保險庫基礎設施的控制平面。 使用獨立的 azsecretsazkeysazcertificates 資料平面套件來讀寫機密、金鑰和憑證。

使用此套件以適當的 SKU 和安全設定(例如軟刪除和清除保護)配置保管庫。 你也可以管理主體的存取政策、設定網路存取與私有端點,並啟用診斷記錄。 你可以將保險庫配置整合進應用程式導入流程中。

金鑰保存庫管理程式碼範例

有關執行階段的 金鑰保存庫 用戶端,請參閱 使用 Go 的 Azure SDK 執行資料平面操作

欲了解入門指南,請參閱 armkeyvault 套件文件

AKS 叢集

armcontainerservice套件負責管理Azure Kubernetes Service叢集在其整個生命週期中。

使用此套件建立具備可配置網路、Kubernetes 版本及管理身份的叢集。 你可以新增和擴展節點池、升級控制平面和節點版本、啟用像 Azure 原則 和監控這類附加元件,以及查詢營運儀表板的叢集健康狀況。 所有叢集操作皆為長期執行,並遵循輪詢模式。

AKS 管理程式碼範例

如需入門指南,請參閱 armcontainerservice 套件文件

RBAC與授權

armauthorization套件負責管理Azure Role-Based 存取控制。 利用它自動化訂閱與資源群組間的最低權限存取政策。

可利用它列出與搜尋內建角色,將角色指派給任何範圍內的主體(使用者、服務主體、受管理身份或群組),建立具有細緻權限的自訂角色定義,以及審核合規報告與漂移偵測的指派。 將角色分配給群組而非個別,並盡可能使用內建角色。

入門指南請參考 armauthorization 套件文件

虛擬網路與網路安全

armnetwork套件管理Azure虛擬網路基礎設施。

利用它建立虛擬網路與子網、配置包含進出規則的網路安全群組、為 PaaS 服務設置私有端點、自動化跨區域網路對等,並以程式化方式實作樞紐輻射拓撲。

網路管理程式碼範例

欲了解入門指南,請參閱 armnetwork 套件文件

容器註冊表

armcontainerregistry套件管理Azure Container Registry實例。

利用它來使用正確的 SKU 來配置登錄檔並進行地理複寫,設定身份驗證(管理、服務主體或受管身份),管理 CI/CD 的 webhook,開啟漏洞掃描功能,並對映像檔套用保留政策。 你經常會搭配 Azure Kubernetes Service 一起使用容器登錄。 首先,先設定登錄檔,然後在叢集建立時參考它。

容器登錄管理程式碼範例

欲了解入門指南,請參閱 armcontainerregistry 套件文件

儲存帳戶

armstorage套件管理Azure 儲存體帳戶。

用它建立具備適當效能層級與冗餘的儲存帳號、管理存取金鑰與共享存取簽章、設定 blob 生命週期政策,以及設定診斷日誌。 儲存帳號是許多應用程式常見的相依關係,因此自動化其配置與設定是常見的控制平面情境。

Storage 帳戶管理程式碼範例

入門指南請參閱 armstorage 套件文件

下一步