了解如何使用 Go 管理库Azure SDK以编程方式预配、配置和管理Azure资源。 常见的控制平面工作流包括创建资源组、管理存储和网络基础结构,以及处理虚拟机(VM)生命周期操作,例如创建、启动、停止、调整大小、更新和删除。 如果希望更高级别地了解管理库如何融入 Azure Go SDK,请从 Azure Go SDK 管理库概述 开始。 本文重点介绍可在多个服务间重复使用的 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 控制平面自动化的常见方案包括:
- 为部署管道预配基础结构
- 管理 VM 生命周期操作,例如创建、更新、删除、启动、停止和调整大小
- 为平台团队构建自定义 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) 构造函数,而在 pkg.go.dev 上你最常见的模式是 NewClientFactory(...).New<ResourceType>Client()。 对于本地开发,DefaultAzureCredential通常会采集您的Azure CLI登录信息。 在 CI/CD 和已部署的工作负载中,可以切换到基于环境的凭据或托管标识,而无需更改客户端代码的其余部分。
有关凭据类型和最佳实践的完整指南,请参阅
客户端包和类型化客户端
管理包在 github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/<service>/arm<service> 下。 安装标识包,并仅安装arm*计划使用的包。 例如,如果只管理 VM 和资源组,则只需要 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 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)
}
大多数 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 包是规范的控制平面示例,因为 VM 管理主要是生命周期工作:创建或更新 VM、启动或停止 VM、调整大小和删除它。 在 Go 中,这些工作流使用资源组示例中所示的相同DefaultAzureCredentialcontext.Context和客户端工厂模式,因此一旦该模式到位,就可以在计算操作中应用该模式,而无需更改身份验证方法。
如果需要快速入门,首先创建一个计算客户端工厂类,然后请求其提供类型化的虚拟机客户端。
clientFactory, err := armcompute.NewClientFactory(subscriptionID, cred, nil)
if err != nil {
return err
}
vmClient := clientFactory.NewVirtualMachinesClient()
有关完整的 VM 示例和特定于操作的指南,请参阅现有的 虚拟机管理示例和 armcompute 包文档。 将这些参考用于完整的请求模型和长时间运行的操作详细信息,而不是复制本文中的大型 VM 模板。
密钥库 (密钥保管库)
armkeyvault 包管理Azure 密钥保管库实例的生命周期。 此包处理密钥基础设施的控制平面。 使用单独的azsecrets、azkeys和azcertificates数据平面包来读取和写入机密、密钥和证书。
使用此包可以预配具有相应 SKU 和安全设置的保管库,例如软删除和清除保护。 还可以管理主体的访问策略、配置网络访问和专用终结点,以及启用诊断日志记录。 可以将保管库预配集成到应用程序载入工作流中。
有关运行时端密钥保管库客户端,请参阅 使用 Go Azure SDK进行数据平面操作。
有关入门指南,请参阅 armkeyvault 包文档。
AKS 群集
armcontainerservice 包在其整个生命周期内管理Azure Kubernetes 服务群集。
使用此包创建具有可配置网络、Kubernetes 版本和托管标识的群集。 可以添加和缩放节点池、升级控制平面和节点版本、启用加载项(如Azure Policy和监视)以及查询操作仪表板的群集运行状况。 所有群集操作都长时间运行,并遵循轮询程序模式。
有关入门指南,请参阅 armcontainerservice 包文档。
RBAC 和授权
armauthorization 包管理Azure Role-Based 访问控制。 使用它可以跨订阅和资源组自动执行最低特权访问策略。
使用它来列出和搜索内置角色,在任何范围内将角色分配给主体(用户、服务主体、托管标识或组),创建具有精细权限的自定义角色定义,并审核分配用于合规性报告和偏差检测。 将角色分配给组而不是个人,并尽可能使用内置角色。
有关快速入门指南,请参阅 armauthorization 包文档。
虚拟网络和网络安全
armnetwork 包管理Azure虚拟网络基础结构。
使用它来创建虚拟网络和子网,使用入站和出站规则配置网络安全组,为 PaaS 服务设置专用终结点,跨区域自动化网络对等,并以编程方式实现中心辐射式拓扑。
有关入门指南,请参阅 armnetwork 包文档。
容器注册表
armcontainerregistry 包管理Azure 容器注册表实例。
使用它来预配具有相应 SKU 和异地复制的注册表、配置身份验证(管理员、服务主体或托管标识)、管理 CI/CD 的 Webhook、启用漏洞扫描,并将保留策略应用于映像。 通常将容器注册表与Azure Kubernetes 服务一起使用。 首先,预配注册表,然后在创建群集期间引用它。
有关入门指南,请参阅 armcontainerregistry 包文档。
存储帐户
armstorage 包管理Azure 存储帐户。
使用它创建具有适当性能层和冗余的存储帐户、管理访问密钥和共享访问签名、配置 Blob 生命周期策略以及设置诊断日志记录。 存储帐户是许多应用程序的常见依赖项,因此自动执行其预配和配置是常见的控制平面方案。
有关入门指南,请参阅 armstorage 包文档。