Последняя проверка: май 2026 г.
Разверните сервисы AWS для экзамена AZ-204 с помощью чистого Terraform: пошаговое руководство с привязкой каждого блока к разделам экзамена. Код также совместим с OpenTofu.
К концу этой лабораторной работы вы подготовите, используя чистый Terraform, каноническое веб-приложение Azure PaaS — план службы приложений (App Service Plan) + веб-приложение Linux с управляемым удостоверением (managed identity), учетную запись Cosmos DB для состояния, рабочую область Application Insights для телеметрии и учетную запись хранения (Storage Account), которую приложение может использовать для работы с BLOB-объектами/файлами. Пять блоков; эталонная архитектура AZ-204.
Разместите фрагменты кода в одном файле main.tf, запустите terraform init, затем terraform apply шаг за шагом.
>= 1.5 или OpenTofu >= 1.6.az login).az webapp deploy). Эта лабораторная работа подготавливает инфраструктурную оболочку — развертывание кода относится к области AZ-204 Implement DevOps и находится вне Terraform.Вся стековая инфраструктура в режиме простоя обойдется примерно в $13 в месяц с планом B1. Переключитесь на F1 для бесплатного тестирования (удалите управляемое удостоверение на шаге 3) или незамедлительно удалите ресурсы.
Стандартное начало для Azure. Имена веб-приложений App Service должны быть глобально уникальными (публикуются в DNS как <name>.azurewebsites.net) — random_id помогает избежать конфликтов.
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 = 3
}
locals {
tags = {
Project = "certlabpro-az-204"
ManagedBy = "terraform"
}
}
resource "azurerm_resource_group" "main" {
name = "certlabpro-az-204-rg"
location = "eastus"
tags = local.tags
}AZ-204 предполагает использование Cosmos DB всякий раз, когда в вопросе упоминается однозначные миллисекунды в масштабе, глобально распределенный или NoSQL с SQL-подобными запросами. Бессерверный режим емкости является стандартным для оптимизации затрат — оплата за RU, $0 в режиме простоя, проверенный на экзамене как правильный выбор для сред с низким объемом данных / разработки.
Мы создаем учетную запись, одну базу данных под ней и один контейнер с ключом секционирования. Выбор ключа секционирования (здесь /userId) является самым часто тестируемым вопросом по Cosmos DB в AZ-204 — плохие ключи секционирования вызывают горячие секции; хорошие равномерно распределяют нагрузку. Экзамен проверяет эту схему с помощью сценариев кардинальности.
resource "azurerm_cosmosdb_account" "main" {
name = "certlabpro-az-204-${random_id.suffix.hex}"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
offer_type = "Standard"
kind = "GlobalDocumentDB"
capabilities {
name = "EnableServerless"
}
consistency_policy {
consistency_level = "Session"
}
geo_location {
location = azurerm_resource_group.main.location
failover_priority = 0
}
tags = local.tags
}
resource "azurerm_cosmosdb_sql_database" "app" {
name = "appdb"
resource_group_name = azurerm_resource_group.main.name
account_name = azurerm_cosmosdb_account.main.name
}
resource "azurerm_cosmosdb_sql_container" "users" {
name = "users"
resource_group_name = azurerm_resource_group.main.name
account_name = azurerm_cosmosdb_account.main.name
database_name = azurerm_cosmosdb_sql_database.app.name
partition_key_paths = ["/userId"]
}Домены AZ-204 Implement Azure Security и Monitor, Troubleshoot, and Optimize опираются на Application Insights — службу APM для распределенных трассировок, отслеживания зависимостей, захвата исключений и живых метрик. Современные экземпляры App Insights требуют рабочую область Log Analytics в качестве своего бэкенда данных (режим на основе рабочей области; классический режим устарел).
Мы создаем оба, а ключ инструментирования + строка подключения выводятся как атрибуты App Insights — подключаются к App Service на шаге 4 через настройки приложения.
resource "azurerm_log_analytics_workspace" "main" {
name = "certlabpro-az-204-logs"
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_application_insights" "main" {
name = "certlabpro-az-204-appi"
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
}App Service является предпочтительным PaaS-веб-хостингом для AZ-204. План службы приложений (App Service Plan) — это вычислительный контейнер (представьте EC2 под абстракцией); веб-приложения внутри него используют общие вычислительные ресурсы плана. Мы используем план Linux B1 и одно веб-приложение с средой выполнения Node.js 20 — замените на python, dotnet, java или php, чтобы соответствовать вашему стеку.
Управляемое удостоверение, назначаемое системой (system-assigned managed identity), является ответом AZ-204 на вопрос о беспарольном доступе приложения к другим службам Azure (Key Vault, Storage, Cosmos DB). После предоставления ролей RBAC для этих ресурсов, App Service вызывает их с помощью токенов, выпущенных Entra — никаких строк подключения в настройках приложения.
Блок app_settings внедряет переменные среды: строку подключения App Insights, конечную точку Cosmos и флаг. Веб-приложение запускается как пустая оболочка — код развертывается отдельно. Цель этой лаборатории — правильно настроить инфраструктуру.
resource "azurerm_service_plan" "main" {
name = "certlabpro-az-204-plan"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
os_type = "Linux"
sku_name = "B1"
tags = local.tags
}
resource "azurerm_linux_web_app" "main" {
name = "certlabpro-az-204-${random_id.suffix.hex}"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_service_plan.main.location
service_plan_id = azurerm_service_plan.main.id
https_only = true
site_config {
always_on = true
application_stack {
node_version = "20-lts"
}
}
identity {
type = "SystemAssigned"
}
app_settings = {
APPLICATIONINSIGHTS_CONNECTION_STRING = azurerm_application_insights.main.connection_string
COSMOS_ENDPOINT = azurerm_cosmosdb_account.main.endpoint
WEBSITES_ENABLE_APP_SERVICE_STORAGE = "false"
}
tags = local.tags
}
# Grant the web app's managed identity Cosmos DB data-plane access
# (Cosmos DB Built-in Data Contributor — the AZ-204 password-less pattern).
resource "azurerm_cosmosdb_sql_role_assignment" "webapp" {
resource_group_name = azurerm_resource_group.main.name
account_name = azurerm_cosmosdb_account.main.name
role_definition_id = "${azurerm_cosmosdb_account.main.id}/sqlRoleDefinitions/00000000-0000-0000-0000-000000000002"
principal_id = azurerm_linux_web_app.main.identity[0].principal_id
scope = azurerm_cosmosdb_account.main.id
}Каждое веб-приложение Azure PaaS в конечном итоге нуждается в хранилище BLOB-объектов/файлов — загруженные файлы, аватары пользователей, сгенерированные PDF, обработанные изображения. Мы подготавливаем учетную запись со стандартными безопасными настройками по умолчанию и предоставляем управляемому удостоверению приложения роль Storage Blob Data Contributor, чтобы приложение могло читать/записывать BLOB-объекты без строки подключения.
Это завершает цикл AZ-204 Develop Azure Compute Solutions: приложение + состояние (Cosmos) + телеметрия (App Insights) + хранилище BLOB-объектов, все подключено через управляемое удостоверение вместо секретов. Каждый дополнительный шаблон AZ-204 (очередь Service Bus, тема Event Grid, секреты Key Vault, интеграция Logic App) подключается таким же образом — предоставьте управляемому удостоверению правильную роль в соответствующей области.
resource "azurerm_storage_account" "app_blobs" {
name = "az204app${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"
allow_nested_items_to_be_public = false
tags = local.tags
}
resource "azurerm_role_assignment" "webapp_blobs" {
scope = azurerm_storage_account.app_blobs.id
role_definition_name = "Storage Blob Data Contributor"
principal_id = azurerm_linux_web_app.main.identity[0].principal_id
}terraform destroy удаляет все. План службы приложений (App Service Plan B1) — это позиция, которая тарифицируется круглосуточно (~$13 в месяц). План остается в группе ресурсов даже после удаления веб-приложения, если вы некорректно масштабировали его — terraform destroy удалит оба. Бессерверный Cosmos DB и App Insights немедленно прекращают тарификацию после удаления.
AZ-204 охватывает больше служб разработчика, которые не помещаются в эту лабораторную работу — Azure Functions (бессерверные функции, управляемые событиями), Container Apps, AKS, Service Bus, Event Grid, Event Hubs, Logic Apps, Durable Functions, API Management, Front Door, CDN, Notification Hubs, SignalR и Azure Key Vault для хранения секретов (распространенное последующее действие в AZ-204 после управляемого удостоверения).
Мы придерживаемся базовой архитектуры App Service + Cosmos + App Insights + Storage, потому что это наиболее часто тестируемая форма веб-приложения PaaS на экзамене — и каждый другой шаблон AZ-204 (Functions, Service Bus, Key Vault) подключается к этой базе через управляемое удостоверение + RBAC.
Для вышеуказанных областей см. разделы Просмотр, Справочник и Editorial на этой странице сертификации.