Azure微软云企业账号:利用Bicep / Terraform 10分钟在Azure上一键部署标准网络环境
在现代云计算运维中,有一个非常经典的“新兵连”式翻车现场:
公司的架构师辛辛苦苦设计了一套符合安全规范的网段方案,交由运维去实施。结果运维登录 Azure 门户网站控制台,面对密密麻麻的表单,一边肉眼核对一边点鼠标。半小时点下来,不小心把主网段的 /16 错打成了 /24,或者把网络安全组(NSG)的入站规则顺序配颠倒了。结果就是:后续部署的虚拟机不是彻底失联,就是把核心数据库直接暴露给了公网,排查原因还得再花掉大半天。
这种纯靠人肉在网页上“指点江山”的运维方式,在业内被称为“手工推土机”。它不仅效率低下,最致命的是完全无法复制。如果你需要把同一套环境在测试、预发、生产环境各自克隆一份,你很难保证自己点上百次鼠标却不出一次错。
为了彻底终结这种低效且高危的作坊式运维,基础设施即代码(IaC,Infrastructure as Code)應運而生。在微软云(Azure)的生态里,有两大统治级的 IaC 编程武器:一个是微软亲儿子 Bicep(现代声明式 DSL 语言),另一个是业界老牌标配 Terraform。
它们的底层逻辑极其硬核:用写代码的方式去“画”你的网络拓扑。 你只需要写一个小小的文本文件,里面定义好你需要什么。然后一行命令推向云端,Azure 的自动化编排大脑就会在 1 分钟内,像素级无差错地为你平地起高楼,瞬间生出一套符合大厂标准的基础网络环境。
今天我们拒绝任何无聊的概念堆砌,直接进入硬核的实战对抗。我们将分别用 Bicep 和 Terraform 这两个流派,手把手带你用一套标准代码,10分钟在云端焊死一套包含“1个VNet(虚拟网络) + 2个独立子网 + 1个高防网络安全组”的标准企业级地基网络。
第一阶段:深度拆解,标准网络的“三维立体模型”
在动手写代码之前,你必须在脑子里把我们要部署的基础网络物理拓扑彻底理清楚。一套及格的企业级 Azure 网络地基,绝不是简单开一个 VNet 就完事了,它必须满足最基础的隔离架构:
- 虚拟网络大底盘(Virtual Network, VNet): 这是你在 Azure 上的专属独立王国,与外界公网物理隔离。我们将其网段规划为标准的大厂内网段:10.0.0.0/16。
- 前后端独立子网(Subnets): 大底盘内部必须横向切出两块阵地,各司其职,物理隔离:Web 前端子网(Subnet-Frontend):划分网段为 10.0.1.0/24,未来专门用来挂载公开的 Web 应用或负载均衡器。DB 后端子网(Subnet-Backend):划分网段为 10.0.2.0/24,未来专门存放核心数据库或敏感的后端业务,断绝外网直接访问。
- 高防看门大爷:网络安全组(Network Security Group, NSG): 这是一道死死卡在子网入口处的分布式防火墙。我们要写死一条安全钢印规则:只允许公网的 443(HTTPS)和 80(HTTP)流量进入前端子网,其余一切牛鬼蛇神直接就地物理拦截。
第二阶段:流派一——微软亲儿子 Bicep 闪电战
如果你是一个纯粹的微软全家桶团队,完全不需要去装第三方的配置工具。Azure 命令行工具(Azure CLI)原生就 100% 懂 Bicep。它没有任何繁琐的状态文件(State File)需要维护,语法干净得像一汪清水。
在本地电脑上,新建一个名为 main.bicep 的文件,把下面这套千锤百炼的高清生产模板直接贴进去:
// 1. 定义全局静态参数,方便未来一键改名
param location string = resourceGroup().location
param vnetName string = 'vnet-core-prod'
param nsgName string = 'nsg-web-firewall'
// 2. 拔地而起:架设看门大爷(网络安全组)
resource nsg 'Microsoft.Network/networkSecurityGroups@2023-11-01' = {
name: nsgName
location: location
properties: {
securityRules: [
{
name: 'Allow-HTTPS-Inbound'
properties: {
priority: 100 // 优先级最高
protocol: 'Tcp'
access: 'Allow'
direction: 'Inbound'
sourceAddressPrefix: '*' // 来自全球任何地方
sourcePortRange: '*'
destinationAddressPrefix: '*'
destinationPortRange: '443' // 精准放行 443 高防端口
}
}
]
}
}
// 3. 乾坤大挪移:创建大底盘虚拟网络,并切出两块子网,同时把大爷捆绑在前端子网上
resource vnet 'Microsoft.Network/virtualNetworks@2023-11-01' = {
name: vnetName
location: location
properties: {
addressSpace: {
addressPrefixes: [
'10.0.0.0/16' // 核心大网段
]
}
subnets: [
{
name: 'Subnet-Frontend'
properties: {
addressPrefix: '10.0.1.0/24' // 前端阵地
networkSecurityGroup: {
id: nsg.id // 将刚才的 NSG 防火墙直接拍在这个子网上
}
}
}
{
name: 'Subnet-Backend'
properties: {
addressPrefix: '10.0.2.0/24' // 后端数据库隐秘阵地
}
}
]
}
}
30 秒一键升空指令(Bicep)
打开你本地终端,登录你的 Azure 账号,并指定一个你建好的资源组(例如 rg-infra-prod),直接敲下这行不可思议的简短指令:
Bash
az deployment group create --resource-group rg-infra-prod --template-file main.bicep
敲完回车,双手离开键盘。你会看到终端里的进度条闪烁。大约 20 秒后,控制台会给你返回一串密密麻麻的 JSON 成功报告。
此时如果你登录 Azure 网页后台去刷新一下,你会发现 VNet 已经整整齐齐地躺在那里,两个子网和 NSG 绑定得滴水不漏,格式和代码里规划的像素点完全一致。
第三阶段:流派二——业界不老松 Terraform 工业级闭环
如果你们公司是多云架构,除了 Azure 还要管 AWS 或阿里云,那么业界公认的工业级白金标准,依然是 HashiCorp 家族的 Terraform。
在本地电脑上,新建一个空目录,在里面建一个名为 main.tf 的文件。Terraform 采用的是经典的 HCL 语法,逻辑稍微厚重,但由于带有强大的状态锁机制,在大团队协同协作中稳如泰山:# 1. 声明接头暗号:我们要调用微软 Azure 的官方驱动(Provider)
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 3.0"
}
}
}
provider "azurerm" {
features {} # 必须显式声明开启特性
}
# 2. 圈地:声明我们要把网络种在哪个已有的资源组里
data "azurerm_resource_group" "core_rg" {
name = "rg-infra-prod"
}
# 3. 铸造盾牌:创建高防网络安全组(NSG)
resource "azurerm_network_security_group" "web_nsg" {
name = "nsg-web-firewall"
location = data.azurerm_resource_group.core_rg.location
resource_group_name = data.azurerm_resource_group.core_rg.name
security_rule {
name = "Allow-HTTPS-Inbound"
priority = 100
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "*"
destination_port_range = "443"
source_address_prefix = "*"
destination_address_prefix = "*"
}
}
# 4. 开辟大底盘:创建虚拟网络(VNet)
resource "azurerm_virtual_network" "core_vnet" {
name = "vnet-core-prod"
location = data.azurerm_resource_group.core_rg.location
resource_group_name = data.azurerm_resource_group.core_rg.name
address_space = ["10.0.0.0/16"]
}
# 5. 精准切分:手动切出前端子网并与 NSG 绑定
resource "azurerm_subnet" "sub_frontend" {
name = "Subnet-Frontend"
resource_group_name = data.azurerm_resource_group.core_rg.name
virtual_network_name = azurerm_virtual_network.core_vnet.name
address_prefixes = ["10.0.1.0/24"]
}
resource "azurerm_subnet_network_security_group_association" "bind_nsg" {
subnet_id = azurerm_subnet.sub_frontend.id
network_security_group_id = azurerm_network_security_group.web_nsg.id
}
# 6. 精准切分:手动切出纯内网后端子网
resource "azurerm_subnet" "sub_backend" {
name = "Subnet-Backend"
resource_group_name = data.azurerm_resource_group.core_rg.name
virtual_network_name = azurerm_virtual_network.core_vnet.name
address_prefixes = ["10.0.2.0/24"]
}
三板斧一键落地指令(Terraform)
打开终端,切换到 main.tf 所在的目录下,依次敲入经典的“泰拉轰三板斧”:
Bash
# 第一斧:初始化,下载微软官方最新网络组件驱动包
terraform init
# 第二斧:彩排演习,让 Terraform 在不花钱的情况下,先给你肉眼盘点一遍等会儿会建出什么东西
terraform plan
# 第三斧:总攻开始,真正向云端发起基础设施冲锋(加 --auto-approve 免去人肉敲 yes 确认)
terraform apply --auto-approve
不到 30 秒,终端就会亮出绿色的 Apply complete! Resources: 4 added。整套标准大厂级隔离网络环境,便完美在 Azure 的云端物理世界里破土落地。
第四阶段:工业级基础设施即代码的避坑血泪史
利用这两套代码,你基本可以傲视所有还在网页上苦苦点鼠标的传统传统网管。但要在真正严苛的商业高并发、DevOps 流水线里活下来,作为首席架构师,你必须立刻给团队焊死以下两条底线避坑规范:
1. 致命的“Terraform 状态文件丢失”惨剧(State Lock)
如果你用的是 Terraform,当你执行完 terraform apply 后,本地目录里会悄悄生出一个名为 terraform.tfstate 的文本文件。
- 灾难隐患:这个文件是 Terraform 记住当前云端网络长什么样的“唯一记忆大脑”。如果别的开发在他们自己的电脑上也去跑这段代码,由于他们本地没有你这个 tfstate 文件,Terraform 就会变成盲人,误以为云端什么都没有,从而在执行 apply 的瞬间,把你在云端建好的生产网络、连带里面的虚拟机,全部无情地连根拔起并物理擦除!
- 大厂标准免死金牌配置:严禁把 tfstate 留存在本地电脑上!必须在 terraform { ... } 块里配置 backend "azurerm" 策略。强行把这个状态记忆文件,锁死锁在 Azure 官方的一个加密 Storage Account(存储账户 Blob) 里,并且开启状态锁(State Locking)。这样,全球任何人在任何角落跑代码,都会去同一个中心大脑里对齐数据,彻底焊死“覆盖与误删”的惨剧。
2. 警惕 Bicep 里“硬编码(Hardcode)”导致的跨地域瘫痪
在写 Bicep 代码时,很多新手为了图省事,会直接在代码里写死 location: 'eastasia'(香港)。
- 原因拆解:如果有一天,公司业务突然要出海美国,你需要把整套一模一样的隔离网络在 eastus(美东机房)也克隆一套。你一执行这行代码,系统会无情地报错,因为你的资源组明明建在美国,代码却强行命令微软把网络网络拉在香港。
- 硬核规避指南:永远利用参数动态抓取地缘。正如我们上面 Bicep 示范模板的写法:param location string = resourceGroup().location。让代码自己去聪明地打听“自己当前被种在哪个资源组里”,资源组在哪,它就自动顺藤摸瓜在哪落地,实现真正意义上的一套模板、全球无缝克隆。
总结
利用 Bicep / Terraform 实行现代化基础设施即代码(IaC)部署,核心的工业级精髓其实简化为十六个字:拓扑落码,版本控制,中心存态,动态地缘。
你彻底告别了过去天天核对参数、提心吊胆怕网段配错、深夜人肉在控制台点上百次鼠标的原始原始运维状态。把所有最核心的数字资产地基,完全固化成一段可以提交到 GitHub 的文本代码。坐在电脑前,优雅地改一个数字,一个回车,剩下的高防和扩容重任,放心地交给光速闪烁的云原生时代。
