☰
Azure开发实战:从订阅边界到生产落地的关键路径
2026/10/20 8:26:00 网站建设 项目流程

简介:《Azure开发实战精华》是一份面向云开发人员与架构师的实战型电子书资源,适合希望系统掌握微软Azure平台、提升云原生应用构建能力的初中级开发者。内容围绕Azure PaaS生态展开,涵盖Azure App Service的部署与性能优化、Kubernetes与Service Fabric的容器编排和微服务治理、无服务器架构以及Azure Search搜索集成等核心主题,并结合真实案例讲解持续集成与部署的落地方法。资源包内共1个PDF文件,大小约24.71MB,为完整书籍正文,便于在电脑或移动设备上随时查阅学习。目前已有55人学习关注,配套代码与实操指导可帮助读者边学边练,快速将所学应用到实际项目中,为云技能进阶与职业发展提供实用参考。

1. Azure开发实战精华:从订阅边界到生产落地的关键路径

很多团队第一次把业务往 Azure 上搬时,都会经历一个反直觉的阶段:本地跑得好好的服务,一上云就出现权限报错、连接超时、成本失控。问题往往不在代码本身,而在于没有把 Azure 的资源模型、身份体系和网络边界当成开发的一部分来设计。Azure开发实战精华这个方向,讲的不是某个单点服务怎么点按钮,而是把订阅、资源组、托管身份、网络出口、部署流水线这几件事串成一条能复现的工程路径。它适合已经写过业务代码、但对云上资源组织方式还停留在“能跑就行”的开发者,也适合需要把一套环境稳定复制到多套订阅的运维同学。接下来我会按选型理由、最小可跑配置、参数边界和踩坑记录,把这条路径拆开讲清楚。

2. 订阅与资源组怎么切:先定边界再写代码

2.1 为什么资源组不是文件夹

刚接触 Azure 的人容易把资源组理解成“放资源的文件夹”,于是按业务模块随手建一堆。实际用起来会发现,资源组同时承担了生命周期边界、权限边界和成本归集边界。删除一个资源组会连带删除里面所有资源,这个动作不可逆;基于资源组的角色分配又决定了谁能对哪些资源做写操作;成本分析也默认按资源组聚合。把这三件事想清楚,再决定怎么切,比事后迁移省事得多。

我一般的切法是:按“一起部署、一起删除、一起计费”的原则分组。比如一个 Web 应用加它的数据库和存储账户,如果它们总是同生共死,就放同一个资源组;如果数据库是多个应用共享的,就单独放一个资源组,避免删应用时误删数据。命名上带环境前缀,比如dev-order-rg、prod-order-rg,这样在门户里筛选和写脚本时都不容易看错。

2.2 用 CLI 建一套最小环境

下面这段命令演示从登录到建资源组的完整过程,注意订阅要先确认,避免建到错误的地方。

# 登录(会打开浏览器或设备码流程) az login # 列出当前账号能访问的订阅,确认目标订阅 ID az account list --output table # 切换到目标订阅,后续命令都作用在这个订阅上 az account set --subscription "<your-subscription-id>" # 建一个开发用资源组,指定区域 az group create \ --name dev-order-rg \ --location eastasia \ --tags env=dev owner=team-a

逻辑说明:az login建立身份上下文;az account list用来核对订阅,多订阅账号尤其要养成先看的习惯;az account set把后续操作锁定到目标订阅,避免误操作;az group create里的--location是资源组元数据存放区域,--tags用于成本归集和自动化筛选。参数上,区域选择要跟后续资源尽量一致,跨区域调用会产生额外延迟和流量费用。

2.3 权限最小化的落地方式

资源组建好后,不要直接给开发者订阅级 Contributor。常见做法是给资源组级角色,再按需细分。比如只读排查给 Reader,部署给 Contributor,涉及密钥读取的再单独授角色。下面这条命令把某个安全主体授予资源组的 Contributor。

# 获取当前登录用户的对象 ID az ad signed-in-user show --query id -o tsv # 授予资源组级 Contributor,作用范围限定在 dev-order-rg az role assignment create \ --assignee "<object-id>" \ --role "Contributor" \ --scope "/subscriptions/<sub-id>/resourceGroups/dev-order-rg"

逻辑说明:--scope决定了权限的作用范围,写订阅 ID 加资源组名是最常见的边界写法。参数上,--assignee可以是用户、组或服务主体,生产环境建议用组来管理,人员变动时只改组员,不用逐个改角色分配。这样做的代价是初期配置稍麻烦,但能避免“一个人有订阅级权限,误删别人资源”的事故。

3. 托管身份与密钥管理:把连接字符串从代码里赶出去

3.1 为什么优先用托管身份

应用连数据库、存储、Key Vault 时,最省事的做法是把连接字符串写进配置。省事的代价是密钥轮换困难、泄露风险高、多环境配置容易串。托管身份的思路是让 Azure 资源自己拥有一个身份,由平台负责凭证签发和轮换,代码里只写资源地址,不写密钥。系统分配的托管身份随资源生命周期存在,用户分配的可以跨资源复用,选哪种取决于是否需要多个资源共享同一身份。

3.2 给应用配置托管身份并授权访问 Key Vault

下面以应用服务为例,开启系统分配身份,再授予它读取 Key Vault 秘密的权限。

# 开启应用服务的系统分配托管身份,返回 principalId az webapp identity assign \ --name my-order-app \ --resource-group dev-order-rg # 把 Key Vault 的读取秘密权限授予这个身份 az keyvault set-policy \ --name my-order-kv \ --object-id "<principalId>" \ --secret-permissions get list

逻辑说明:identity assign会返回一个principalId,这是后续授权的依据;set-policy把 Key Vault 的访问策略绑定到这个身份上,只给get和list,不给写和删。参数上,如果用的是基于角色的访问控制模式,授权方式会变成角色分配,命令不同,但思路一致:只给需要的最小权限。

3.3 代码里怎么读秘密

托管身份配好后,代码侧不再需要密钥,直接用身份去取。下面是一段 Python 示例,用默认凭证链读取 Key Vault 中的秘密。

from azure.identity import DefaultAzureCredential from azure.keyvault.secrets import SecretClient # DefaultAzureCredential 会按环境变量、托管身份、本地登录等顺序尝试 credential = DefaultAzureCredential() # Key Vault 地址从配置读取,不写死在代码里 vault_url = "https://my-order-kv.vault.azure.net/" client = SecretClient(vault_url=vault_url, credential=credential) # 按名称取秘密,返回值里包含 value secret = client.get_secret("db-connection-string") print(secret.value)

逻辑说明:DefaultAzureCredential的好处是本地开发用开发者登录,部署到 Azure 后自动走托管身份,代码不用改。参数上,vault_url建议从环境变量注入,方便多环境切换。注意本地调试时如果没登录,凭证链会报错,先执行一次az login即可。

4. 网络出口与私有连接:别让默认路由背锅

4.1 默认出站为什么容易出问题

很多应用部署后访问外部接口超时,排查半天发现是出站走了平台默认路径,而目标端做了来源限制。Azure 里出站流量的走向取决于子网是否绑定了 NAT 网关、防火墙或路由表。默认情况下,没有显式配置的子网出站地址是动态的,对端如果按 IP 白名单放行,就会时通时不通。解决办法是给出站一个固定公网 IP,常见做法是绑定 NAT 网关。

4.2 用 NAT 网关固定出站 IP

下面命令演示建公网 IP、建 NAT 网关、再关联到子网。

# 建一个标准 SKU 的公网 IP,用于 NAT 网关 az network public-ip create \ --resource-group dev-order-rg \ --name dev-order-nat-ip \ --sku Standard \ --allocation-method Static # 建 NAT 网关并绑定上面的公网 IP az network nat gateway create \ --resource-group dev-order-rg \ --name dev-order-nat \ --public-ip-addresses dev-order-nat-ip \ --idle-timeout 10 # 把 NAT 网关关联到应用所在子网 az network vnet subnet update \ --resource-group dev-order-rg \ --vnet-name dev-order-vnet \ --name app-subnet \ --nat-gateway dev-order-nat

逻辑说明:--sku Standard和--allocation-method Static保证公网 IP 固定;--idle-timeout控制空闲连接保持时间,默认值偏短时可能影响长连接场景;subnet update把 NAT 网关挂到子网后,该子网所有出站流量都走这个固定 IP。参数上,NAT 网关按小时和流量计费,开发环境如果出站量小,也可以先用负载均衡的出站规则替代,但配置更绕。

4.3 私有终结点解决入站暴露

数据库和存储账户如果走公网入站,即使加了防火墙,也还是有暴露面。私有终结点把服务拉进虚拟网络,走内网地址访问。配置顺序一般是先建私有终结点,再做 DNS 区域关联,否则解析还是公网地址。

# 为存储账户建私有终结点,指定子网和资源类型 az network private-endpoint create \ --resource-group dev-order-rg \ --name dev-order-storage-pe \ --vnet-name dev-order-vnet \ --subnet app-subnet \ --private-connection-resource-id "<storage-resource-id>" \ --group-id blob \ --connection-name dev-order-storage-conn

逻辑说明:--group-id blob表示针对 Blob 子资源建终结点,不同服务取值不同;--private-connection-resource-id是目标资源的完整 ID。建完后要在私有 DNS 区域里加 A 记录,把存储账户域名解析到内网 IP,否则应用还是走公网。这一步经常被漏掉,表现为“终结点建了但连接还是公网”。

5. 部署流水线避坑:从能跑到可回滚

5.1 基础设施即代码的选型

手工在门户点出来的环境,复制第二套时必然出偏差。常见做法是用 Bicep 或 Terraform 把资源定义成代码。Bicep 是 Azure 原生,语法简洁,和资源类型贴合;Terraform 跨云,生态成熟。团队只用 Azure 时我倾向 Bicep,学习成本低,和 CLI 配合顺手。选型不是重点,重点是状态管理和变更审查,任何基础设施改动都走代码评审。

5.2 用 Bicep 定义一个应用服务

下面是一个精简的 Bicep 片段,定义应用服务计划和一个 Web 应用。

// 应用服务计划,决定计算资源和定价层 resource plan 'Microsoft.Web/serverfarms@2022-09-01' = { name: 'dev-order-plan' location: resourceGroup().location sku: { name: 'B1' tier: 'Basic' } } // Web 应用,引用上面的计划 resource app 'Microsoft.Web/sites@2022-09-01' = { name: 'my-order-app' location: resourceGroup().location properties: { serverFarmId: plan.id siteConfig: { // 运行时栈按实际语言调整 linuxFxVersion: 'PYTHON|3.11' } } }

逻辑说明:serverfarms是应用服务计划,sites是具体应用,serverFarmId把两者关联。参数上,sku.name决定规格和价格,开发用 B1 够用,生产按并发调;linuxFxVersion要和实际运行时匹配,写错会导致应用起不来。部署用az deployment group create执行,变更前先what-if看影响。

5.3 部署槽与回滚

生产环境直接覆盖部署风险高,常见做法是用部署槽先预热再切换。下面命令演示把新版本发到 staging 槽,验证后再交换。

# 把代码部署到 staging 槽 az webapp deploy \ --resource-group dev-order-rg \ --name my-order-app \ --slot staging \ --src-path ./dist.zip # 验证通过后,把 staging 和 production 交换 az webapp deployment slot swap \ --resource-group dev-order-rg \ --name my-order-app \ --slot staging \ --target-slot production

逻辑说明:deploy把包发到指定槽,swap做原子切换,出问题时再交换回来即可回滚。参数上,--src-path指向构建产物,建议在流水线里先跑测试再部署。注意槽有自己的配置,部分设置不随交换走,需要单独确认。

6. 常见问题排查:五条血泪记录

现象:应用部署后访问 Key Vault 报 403。原因:托管身份开了,但 Key Vault 访问策略没加,或者加了但对象 ID 写错。解决:用az webapp identity show核对 principalId,再用az keyvault show看策略列表,确认对象 ID 一致。

现象:出站访问第三方接口偶发超时。原因:子网没绑 NAT 网关,出站 IP 不固定,对端白名单时通时不通。解决:按第 4 章绑定 NAT 网关,把固定 IP 提供给对端。

现象:私有终结点建好后连接仍走公网。原因:私有 DNS 区域没关联或 A 记录没建。解决:检查 DNS 区域与虚拟网络的关联,确认域名解析到内网地址。

现象:Bicep 部署报资源已存在。原因:手工建过同名资源,状态和代码不一致。解决:先导入现有资源或删除重建,不要直接覆盖,避免配置漂移。

现象:部署槽交换后配置丢失。原因:部分应用设置标记为槽专属,交换时行为不同。解决:把不随交换走的设置标记为“部署槽设置”,交换前逐项核对。

7. 成本与验证:把账单当成回归测试

云上项目最容易失控的不是功能,是成本。我习惯在资源组上打env和owner标签,然后用成本分析按标签聚合,每周看一次趋势。开发环境设置自动关机,非工作时段停掉计算资源;存储账户按访问频率选层,冷数据放低频层。验证方面,除了功能测试,我会加一条“成本回归”:每次基础设施变更后,对比变更前后的预估费用,涨幅超过阈值就复查。下面这段命令用来查资源组的当月成本,方便快速核对。

# 查询指定资源组当月成本,按资源聚合 az consumption usage list \ --start-date "$(date +%Y-%m-01)" \ --end-date "$(date +%Y-%m-%d)" \ --query "[?contains(instanceId, 'dev-order-rg')].{res:instanceId, cost:pretaxCost}" \ --output table

逻辑说明:--start-date和--end-date限定查询区间,--query过滤出目标资源组并按资源展示。参数上,成本数据有延迟,当天数据可能不全,看趋势比看单日更可靠。这个习惯帮我提前发现过几次因为规格选大、或者忘了关测试资源导致的费用上涨。把成本当成一条持续的验证线,比事后追账单省心得多。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询