最后审核时间:2026年5月
使用原生 Terraform 构建 AZ-900 考试中的 AWS 服务——每次构建一个代码块,并紧扣考试领域。相同的代码可在 OpenTofu 上运行。
在本实验结束时,你将使用纯 Terraform 预置最小且真实的第一个 Azure 工作负载——一个资源组、一个具有安全默认设置的存储账户、一个小型 Linux 虚拟机,以及一个在你钱包受损前就通过电子邮件通知你的成本管理预算警报。每个资源都对应一个 AZ-900 考试支柱。
每个资源都是纯 Terraform。没有变量、没有模块、没有远程状态。将这些片段放入单个 main.tf 文件中,运行一次 terraform init,然后逐步运行 terraform apply。
>= 1.5 或 OpenTofu >= 1.6。az login;Terraform 的 azurerm 提供程序会自动获取活动订阅。本实验中的所有资源都符合 Azure 新订阅的免费套餐范围(前 30 天提供 200 美元额度,外加永久免费额度):
如果你在免费套餐外让虚拟机 24/7 运行,每月费用约为 5 美元。实验完成后请销毁所有资源。
每个 Azure Terraform 堆栈都以相同的方式开始:固定 azurerm 提供程序(我们使用 ~> 4.0,这是当前的稳定版本),并声明 features 块。空的 features {} 块是必需的——没有它 azurerm 将无法初始化。这是在 Terraform 编写者层面,针对 AZ-900 预置(Provisioning)最受测试的约定。
random_id 资源是生成全局唯一存储账户名称的标准模式——Azure 存储账户名称必须是 3-24 个字符,小写字母数字,并且在所有 Azure 订阅中都是全局唯一的。random_id 会在名称中添加 4 个十六进制数字以避免冲突。
terraform {
required_version = ">= 1.5"
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 4.0"
}
random = {
source = "hashicorp/random"
version = "~> 3.6"
}
}
}
provider "azurerm" {
features {}
}
resource "random_id" "suffix" {
byte_length = 2
}
locals {
tags = {
Project = "certlabpro-az-900"
ManagedBy = "terraform"
}
}每个 Azure 资源都存在于资源组(Resource Group)中——它是 Azure 的通用组织容器。资源组是免费的、区域性的(资源组本身只包含元数据,但其内容默认限定在其区域内),并且是批量管理的单位:删除一个资源组会删除其中所有内容。
AZ-900 的《云概念》和《Azure 身份、治理、隐私、合规性》领域都强调这一概念——资源组是 RBAC 角色分配、Azure Policy 和成本跟踪的最小作用域单位。为每个资源组打上标签。
resource "azurerm_resource_group" "main" {
name = "certlabpro-az-900-rg"
location = "eastus"
tags = local.tags
}Azure 存储是每个 AZ-900 工作负载都会使用的基础数据服务。我们创建一个标准层 LRS(本地冗余)账户——这是最便宜的复制选项,也是 AZ-900 预期用于非生产性实验工作负载的默认设置。公共网络访问被禁用,强制只允许 HTTPS,并且最低 TLS 版本设置为 1.2(AZ-900 的《安全性》领域明确将这三项作为基本卫生默认设置进行测试)。
account_kind = "StorageV2" 是当前通用 v2 账户;AZ-900 有时会要求你将其与 BlobStorage(较旧的,仅限 Blob)和 FileStorage(高级文件)区分开来。对于任何“通用”问题,StorageV2 都是正确的答案。
resource "azurerm_storage_account" "main" {
name = "certlabpro${random_id.suffix.hex}"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
account_tier = "Standard"
account_replication_type = "LRS"
account_kind = "StorageV2"
https_traffic_only_enabled = true
min_tls_version = "TLS1_2"
public_network_access_enabled = false
allow_nested_items_to_be_public = false
tags = local.tags
}AZ-900 将整个领域(《Azure 定价、SLA 和生命周期》)专门用于计费概念。在该领域中,最常考查的实际产物是预算警报——成本管理在你实际或预测支出超过阈值时通过电子邮件通知你的机制。
我们将预算范围限定在步骤 2 中创建的资源组,这意味着它跟踪本实验中的所有内容(且仅限本实验)。当预算达到 80% 时触发通知——这是一个 AZ-900 反复出现的考题模式:“为什么是 80% 而不是 100%?”——因为在 80% 时你仍有时间采取行动;在 100% 时,资金已经用尽了。
在运行 terraform apply 之前,请将 you@example.com 替换为你的真实地址。
resource "azurerm_consumption_budget_resource_group" "main" {
name = "certlabpro-az-900-budget"
resource_group_id = azurerm_resource_group.main.id
amount = 10
time_grain = "Monthly"
time_period {
start_date = "2026-06-01T00:00:00Z"
}
notification {
enabled = true
threshold = 80
operator = "GreaterThan"
threshold_type = "Actual"
contact_emails = ["you@example.com"]
}
}标准的 terraform destroy 会销毁本实验中的所有内容。一个 Azure 特有的注意事项:当你销毁资源组时,Azure 会作为副作用移除其中所有资源——即使 Terraform 不知道它们。这是 AZ-900 考查的清理原语:如果你不确定资源组中有什么,删除资源组会清除整个子树。在共享订阅上使用时请务必小心。
在较新的订阅中,存储账户默认具有 14 天的软删除保留期;在此期间,命名空间会保持保留。如果你立即重新运行实验,可能会遇到名称冲突——random_id 后缀通常可以避免这种情况,但并非万无一失。
AZ-900 涵盖了广泛的服务范围——Azure 虚拟机(我们在此最低限度的实验中概念性地提及,但并未实际部署虚拟机)、App Service、Azure Functions、AKS、Azure SQL、Cosmos DB、Azure AD/Entra ID、Azure Policy、Azure Blueprints、ARM 模板、Bicep、定价计算器、TCO 计算器、Azure Advisor、Service Health 等等。
我们坚持最小且真实的第一个工作负载,因为考试测试的是广泛的概念流利度,而不是深入的按服务预置能力。上面涉及的四个支柱——资源组(治理)、存储账户(服务 + 安全默认设置)、成本管理(定价)以及隐含的计算目标——是 AZ-900 所有其他概念的基础。
要了解按服务的覆盖范围,请参阅此认证页面上的浏览和 Editorial 部分——它们引用了 AZ-900 范围内的所有命名服务。