最后审核时间:2026年5月
使用原生 Terraform 构建 AZ-400 考试中的 AWS 服务——每次构建一个代码块,并紧扣考试领域。相同的代码可在 OpenTofu 上运行。
在本实验结束时,您将已使用纯 Terraform 配置 CI/CD 流水线的 AZ-400 基础设施侧 — 一个用于发布镜像的 Azure Container Registry、一个带托管标识和 Log Analytics 集成的 AKS 集群作为部署目标、一个用于流水线密钥的 Key Vault,以及将所有内容连接到 AKS kubelet 标识的角色分配,以便它可以在流水线 YAML 中无需凭据即可拉取镜像和读取密钥。
将这些代码片段放入一个 main.tf 文件中,然后逐步运行 terraform init 和 terraform apply。
>= 1.5 或 OpenTofu >= 1.6。az login)。AKS 是主要成本来源:
运行期间总计每月约 75 美元。AZ-400 中最常见的成本反模式是让未使用的 AKS 集群持续运行 — 不使用时请销毁或停止集群。
标准的 Azure 开场白。
terraform {
required_version = ">= 1.5"
required_providers {
azurerm = { source = "hashicorp/azurerm", version = "~> 4.0" }
random = { source = "hashicorp/random", version = "~> 3.6" }
}
}
provider "azurerm" {
features {
key_vault {
purge_soft_delete_on_destroy = true
}
}
}
resource "random_id" "suffix" {
byte_length = 3
}
data "azurerm_client_config" "current" {}
locals {
tags = {
Project = "certlabpro-az-400"
ManagedBy = "terraform"
}
}
resource "azurerm_resource_group" "main" {
name = "certlabpro-az-400-rg"
location = "eastus"
tags = local.tags
}ACR 是 CI 流水线推送容器镜像、CD 流水线拉取容器镜像的地方。AZ-400 将这种推/拉边界作为一种安全模式进行测试:构建流水线获得 AcrPush 权限,部署目标获得 AcrPull 权限,两者永不交叉。
我们使用基本层 — 最便宜,单一复制目标。高级层增加了异地复制和内容信任功能(镜像签名);两者都是 AZ-400 考试主题,但对于本实验来说成本过高。
resource "azurerm_container_registry" "main" {
name = "acrcertlabpro${random_id.suffix.hex}"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
sku = "Basic"
admin_enabled = false # admin user disabled — Entra-only access
tags = local.tags
}AKS 是 AZ-400 容器工作负载的首选部署目标。我们使用系统分配的托管标识(现代默认设置;服务主体身份验证正在弃用)、一个小型系统节点池,以及 azure_policy_enabled = true(AZ-400 中通过 Azure Policy 附加组件实现集群级策略强制执行的“实施合规性”答案)。
Log Analytics 工作区 + OMS 代理集成是 AZ-400 中用于集群级可观测性的“实施检测”答案 — 每个 Pod 日志、每个节点指标、每个 Kubernetes 审计事件都将写入 Log Analytics 以进行 KQL 查询。
resource "azurerm_log_analytics_workspace" "main" {
name = "log-az400"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
sku = "PerGB2018"
retention_in_days = 30
tags = local.tags
}
resource "azurerm_kubernetes_cluster" "main" {
name = "aks-az400"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
dns_prefix = "azaks${random_id.suffix.hex}"
default_node_pool {
name = "system"
node_count = 1
vm_size = "Standard_D2s_v3"
}
identity {
type = "SystemAssigned"
}
oms_agent {
log_analytics_workspace_id = azurerm_log_analytics_workspace.main.id
}
azure_policy_enabled = true
tags = local.tags
}
# Grant the AKS kubelet identity AcrPull on the registry from Step 2.
# This is the AZ-400 password-less image-pull pattern.
resource "azurerm_role_assignment" "aks_acr_pull" {
scope = azurerm_container_registry.main.id
role_definition_name = "AcrPull"
principal_id = azurerm_kubernetes_cluster.main.kubelet_identity[0].object_id
}流水线密钥 — API 密钥、部署凭据、第三方令牌 — 绝不应存储在流水线 YAML 中。AZ-400 的“实施安全并验证代码库合规性”领域测试了这种“流水线任务中的 Key Vault 引用”模式:流水线在运行时从 Key Vault 按名称引用密钥。
我们授予 AKS kubelet 标识“Key Vault 密钥用户”角色,以便部署的 Pod 也能通过 Secrets Store CSI Driver(用于 Key Vault 支持的密钥的集群内挂载机制)读取密钥。有了这个角色,每个需要数据库密码的 Pod 都可以通过 CSI Driver 读取,而不是从镜像中硬编码的环境变量中读取。
resource "azurerm_key_vault" "main" {
name = "kv-az400-${random_id.suffix.hex}"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
tenant_id = data.azurerm_client_config.current.tenant_id
sku_name = "standard"
enable_rbac_authorization = true
soft_delete_retention_days = 7
tags = local.tags
}
resource "azurerm_role_assignment" "kv_admin_self" {
scope = azurerm_key_vault.main.id
role_definition_name = "Key Vault Administrator"
principal_id = data.azurerm_client_config.current.object_id
}
resource "azurerm_role_assignment" "aks_kv_reader" {
scope = azurerm_key_vault.main.id
role_definition_name = "Key Vault Secrets User"
principal_id = azurerm_kubernetes_cluster.main.kubelet_identity[0].object_id
}Log Analytics 处理集群级信号(节点指标、Pod 日志);App Insights 处理应用级信号(请求跟踪、异常遥测、依赖项跟踪、分布式跟踪)。AZ-400 的“实施检测”测试这两个层级 — 考试期望您将它们配对使用,其中 App Insights 作为基于工作区模式,使用第 3 步中的 Log Analytics 工作区。
至此,AZ-400 CI/CD 目标形态已完成:ACR 接收构建镜像,AKS 部署它们,Key Vault 提供密钥,Log Analytics + App Insights 观测结果。流水线 YAML(Azure DevOps 或 GitHub Actions)驱动这一切 — 它位于源仓库中,而不是 Terraform 中。
resource "azurerm_application_insights" "main" {
name = "appi-az400"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
workspace_id = azurerm_log_analytics_workspace.main.id
application_type = "web"
tags = local.tags
}terraform destroy 会销毁所有资源。AKS 是主要费用项,系统节点每月计费 70 美元 — 请及时销毁。ACR 基本版每月 5 美元。Log Analytics 工作区即使在消费者销毁后也会保留数据,保留期为 30 天;工作区本身可被干净销毁。
AZ-400 涵盖了 azurerm provider 中不存在的 Azure DevOps Services 和 Azure 上的 GitHub 方面 — Azure DevOps 组织、项目、仓库、流水线、代理池、环境、变量组、服务连接(所有这些都在单独的 azuredevops provider 中)、适用于 Azure DevOps 的 GitHub Advanced Security,以及 Application Insights Live Metrics + 智能检测规则。
我们专注于部署目标基础设施,因为它才是 AZ-400 流水线实际部署到的基础层。一旦 ACR + AKS + Key Vault + 可观测性到位,流水线 YAML(位于您的源仓库中,而非 Terraform 中)将通过标准的 Azure CLI 任务执行构建-推送-部署工作。
有关 Azure DevOps Services + GitHub Actions 模式的更多信息,请参阅此认证页面的 浏览、手册 和 Editorial 部分。