學習如何使用 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 資源提供者,並遵循一致的模式:
- 請使用套件來進行
azidentity驗證。 - 為你想管理的資源建立一個具類型的客戶端。
- 呼叫用戶端的方法來建立、讀取、更新或刪除資源。
- 使用輪詢器處理長期執行的操作。
Go 語言控制層自動化的常見情境包括:
- 部署管線的基礎建設配置
- 管理虛擬機生命週期操作,如建立、更新、刪除、啟動、停止及調整大小
- 為平台團隊打造客製化 CLI 與運算元
- 實作 GitOps 風格的基礎架構對帳
- 自動化合規稽核與漂移偵測
驗證
所有管理操作都需要來自 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 和已部署的工作負載中,你可以切換到環境基礎憑證或管理身份,而不需更改其他客戶端程式碼。
關於憑證類型與最佳實務的完整指南,請參閱
用戶端套件與類型用戶端
管理方案位於github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/<service>/arm<service>。 安裝身份套件,以及只有你打算使用的 arm* 套件。 例如,如果你只管理虛擬機和資源群組,只需要 armcompute 和 armresources。 每個套件包含用於該服務資源的客戶端。 例如,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 套件文件。
虛擬機器
DefaultAzureCredential、 、 context.Context和 用戶端工廠模式,因此一旦建立該模式,你可以在不改變認證方式的情況下,將其套用於運算操作中。
如果你需要快速起點,先建立計算客戶端工廠,然後請求它提供型別化的虛擬客戶端:
clientFactory, err := armcompute.NewClientFactory(subscriptionID, cred, nil)
if err != nil {
return err
}
vmClient := clientFactory.NewVirtualMachinesClient()
如需完整 VM 範例及操作專屬指引,請參閱現有的 虛擬機器管理範例 以及 armcompute 套件文件。 請使用這些參考資料來取得完整的請求模型和長期執行的操作細節,而非在本文中重複大型虛擬機範本。
金鑰保存庫
armkeyvault套件負責管理Azure Key Vault實例的生命週期。 此套件負責管理保險庫基礎設施的控制平面。 使用獨立的 azsecrets、azkeys 和 azcertificates 資料平面套件來讀寫機密、金鑰和憑證。
使用此套件以適當的 SKU 和安全設定(例如軟刪除和清除保護)配置保管庫。 你也可以管理主體的存取政策、設定網路存取與私有端點,並啟用診斷記錄。 你可以將保險庫配置整合進應用程式導入流程中。
有關執行階段的 金鑰保存庫 用戶端,請參閱 使用 Go 的 Azure SDK 執行資料平面操作。
欲了解入門指南,請參閱 armkeyvault 套件文件。
AKS 叢集
armcontainerservice套件負責管理Azure Kubernetes Service叢集在其整個生命週期中。
使用此套件建立具備可配置網路、Kubernetes 版本及管理身份的叢集。 你可以新增和擴展節點池、升級控制平面和節點版本、啟用像 Azure 原則 和監控這類附加元件,以及查詢營運儀表板的叢集健康狀況。 所有叢集操作皆為長期執行,並遵循輪詢模式。
如需入門指南,請參閱 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 生命週期政策,以及設定診斷日誌。 儲存帳號是許多應用程式常見的相依關係,因此自動化其配置與設定是常見的控制平面情境。
入門指南請參閱 armstorage 套件文件。