Dernière révision : mai 2026
Configurez les services AWS figurant à l'examen AZ-204 avec Terraform simple — un bloc à la fois, chacun étant lié à un domaine de l'examen. Le même code fonctionne sur OpenTofu.
À la fin de ce laboratoire, vous aurez provisionné, avec du Terraform simple, l'application web PaaS Azure canonique — un plan App Service + une application web Linux avec identité gérée, un compte Cosmos DB pour l'état, un espace de travail Application Insights pour la télémétrie, et un compte de stockage que l'application peut utiliser pour le travail de blob/fichier. Cinq blocs ; l'architecture de référence AZ-204.
Insérez les extraits dans un seul fichier main.tf, exécutez terraform init, puis terraform apply étape par étape.
>= 1.5 ou OpenTofu >= 1.6.az login).az webapp deploy). Ce laboratoire provisionne l'infrastructure de base — le déploiement de code relève du domaine Implémenter DevOps de l'AZ-204 et se situe en dehors de Terraform.L'ensemble de la pile au repos coûte environ 13 $ / mois avec le plan B1. Passez à F1 pour des tests gratuits (supprimez l'identité gérée à l'étape 3) ou détruisez rapidement.
Ouverture Azure standard. Les noms d'applications web App Service doivent être globalement uniques (publiés DNS sous la forme <name>.azurewebsites.net) — random_id évite les collisions.
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
}L'AZ-204 s'attend à ce que vous utilisiez Cosmos DB chaque fois que la question mentionne des millisecondes à l'échelle, distribué mondialement, ou NoSQL avec des requêtes de type SQL. Le mode de capacité sans serveur est le défaut d'optimisation des coûts — paiement par RU, 0 $ à l'arrêt, testé à l'examen comme le bon choix pour les environnements à faible volume / de développement.
Nous créons le compte, une base de données sous celui-ci, et un conteneur avec une clé de partition. Le choix de la clé de partition (ici /userId) est la question Cosmos AZ-204 la plus testée — de mauvaises clés de partition provoquent des partitions actives ; de bonnes clés répartissent la charge uniformément. L'examen teste ce modèle avec des scénarios de cardinalité.
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"]
}Les domaines Implémenter la sécurité Azure et Surveiller, dépanner et optimiser de l'AZ-204 s'appuient tous deux sur Application Insights — le service APM pour les traces distribuées, le suivi des dépendances, la capture d'exceptions et les métriques en temps réel. Les instances modernes d'App Insights nécessitent un espace de travail Log Analytics comme backend de données (le mode basé sur l'espace de travail ; le mode classique est déprécié).
Nous créons les deux et la clé d'instrumentation + la chaîne de connexion sont exposées comme attributs d'App Insights — connectés à l'App Service à l'étape 4 via les paramètres d'application.
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 est l'hébergeur web PaaS de choix pour l'AZ-204. Le Plan App Service est le conteneur de calcul (pensez EC2 sous l'abstraction) ; les applications web qu'il contient partagent le calcul du plan. Nous utilisons un plan Linux B1 et une seule application web avec l'environnement d'exécution Node.js 20 — basculez vers python, dotnet, java, ou php pour correspondre à votre pile.
L'identité gérée attribuée par le système est la solution d'authentification sans mot de passe de l'AZ-204 pour l'application accédant à d'autres services Azure (Key Vault, Stockage, Cosmos DB). Une fois les rôles RBAC accordés sur ces ressources, l'App Service les appelle avec des jetons émis par Entra — aucune chaîne de connexion dans les paramètres d'application.
Le bloc app_settings injecte des variables d'environnement : chaîne de connexion App Insights, point de terminaison Cosmos, et un drapeau. L'application web démarre comme une coquille vide — le code est déployé séparément. Le laboratoire vise à configurer correctement l'infrastructure.
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
}Toute application web PaaS Azure a finalement besoin d'un stockage de blob/fichier — fichiers téléchargés, avatars d'utilisateurs, PDF générés, images traitées. Nous provisionnons le compte avec des valeurs par défaut sécurisées et accordons à l'identité gérée de l'application le rôle Storage Blob Data Contributor afin que l'application puisse lire/écrire des blobs sans chaîne de connexion.
Cela boucle la boucle Développer des solutions de calcul Azure de l'AZ-204 : application + état (Cosmos) + télémétrie (App Insights) + stockage de blob, le tout câblé via l'identité gérée au lieu de secrets. Chaque modèle AZ-204 supplémentaire (file d'attente Service Bus, sujet Event Grid, secrets Key Vault, intégration Logic App) s'attache de la même manière — donnez à l'identité gérée le rôle approprié au bon périmètre.
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 détruit tout. Le Plan App Service B1 est l'élément facturé 24h/24 et 7j/7 (environ 13 $ / mois). Le plan reste dans le groupe de ressources même après la suppression de l'application web si vous effectuez un scale-in incorrect — terraform destroy supprime les deux. Cosmos DB sans serveur et App Insights arrêtent la facturation immédiatement après la destruction.
L'AZ-204 couvre davantage de services de développement que ce laboratoire ne peut contenir — Azure Functions (sans serveur, piloté par les événements), Container Apps, AKS, Service Bus, Event Grid, Event Hubs, Logic Apps, Durable Functions, API Management, Front Door, CDN, Notification Hubs, SignalR, et Azure Key Vault pour le stockage des secrets (un suivi courant de l'AZ-204 après l'identité gérée).
Nous nous en tenons à la base App Service + Cosmos + App Insights + Stockage car c'est la forme d'application web PaaS la plus testée à l'examen — et tout autre modèle AZ-204 (Functions, Service Bus, Key Vault) s'attache à cette base via l'identité gérée + RBAC.
Pour les sujets ci-dessus, consultez les sections Parcourir, Guide et Editorial de cette page de certification.