最終確認: 2026年5月
AZ-400 試験の対象となる AWS サービスを、プレーンな Terraform を使用して構築します。1 ブロックずつ、それぞれ試験ドメインに関連付けられています。同じコードが OpenTofu でも動作します。
このラボの終わりまでに、CI/CDパイプラインのAZ-400インフラストラクチャ側を、プレーンなTerraformでプロビジョニングします。具体的には、イメージを公開するためのAzure Container Registry、マネージドIDとLog Analytics統合を備えたデプロイターゲットとしてのAKSクラスター、パイプラインシークレット用のKey Vault、そしてパイプラインYAMLに認証情報なしでイメージをプルしシークレットを読み取れるようにすべてをAKSのkubelet IDに接続するロール割り当てです。
スニペットを単一の 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 を取得し、両者が直接交わることはありません。
最も安価で単一のレプリケーションターゲットであるBasicティアを使用します。Premiumは地理的レプリケーションとコンテンツ信頼機能(イメージ署名)を追加します。これらは両方とも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で推奨されるデプロイターゲットです。システム割り当てマネージドID(現在のデフォルト。サービスプリンシパル認証は非推奨)、単一の小さなシステムノードプール、および azure_policy_enabled = true(Azure Policyアドオンを介したクラスターレベルのポリシー強制に対するAZ-400の「準拠の実装」の回答)を使用します。
Log Analyticsワークスペース + OMSエージェント統合は、クラスターレベルの可観測性に対するAZ-400の「インストルメンテーションの実装」の回答です — すべてのポッドログ、すべてのノードメトリック、すべてのKubernetes監査イベントがKQLクエリのためにLog Analyticsに送信されます。
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から名前でシークレットを参照します。
デプロイされたポッドがSecrets Store CSI Driver(Key Vaultにバックアップされたシークレットのためのクラスター内マウントメカニズム)を介してシークレットを読み取れるように、AKS kubelet IDにKey Vault Secrets Userを付与します。このロールが設定されると、データベースパスワードを必要とするすべてのポッドは、イメージに埋め込まれた環境変数からではなく、CSIドライバーを介してそれを読み取ります。
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はクラスターレベルのシグナル(ノードメトリック、ポッドログ)を処理し、App Insightsはアプリケーションレベル(リクエストトレース、例外テレメトリ、依存関係追跡、分散トレース)を処理します。AZ-400の「インストルメンテーションの実装」では両方のレイヤーがテストされます — 試験では、ステップ3のLog Analyticsワークスペースを使用し、App Insightsをワークスペースベースモードとしてペアで接続することが求められます。
この最後のピースが配置されると、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 Basicは月額5ドルです。Log Analyticsワークスペースは、コンシューマーが破棄された後も保持期間(ここでは30日)の間データを保持しますが、ワークスペース自体はきれいに破棄されます。
AZ-400は、azurerm プロバイダーには含まれないAzure DevOps ServicesとGitHub-on-Azureの表面をカバーしています — Azure DevOps組織、プロジェクト、リポジトリ、パイプライン、エージェントプール、環境、変数グループ、サービス接続(すべて別の azuredevops プロバイダーにあります)、Azure DevOps用GitHub Advanced Security、およびApplication Insightsのライブメトリック + スマート検出ルールなどです。
このラボでは、AZ-400パイプラインが実際にデプロイされる基盤であるデプロイターゲットインフラストラクチャに焦点を当てます。ACR + AKS + Key Vault + 可観測性が整っていれば、パイプラインYAML(Terraformではなくソースリポジトリにあります)が標準のAzure CLIタスクを介してビルド、プッシュ、デプロイの作業を行います。
Azure DevOps Services + GitHub Actionsパターンの詳細については、この認定ページの閲覧、プレイブック、およびEditorialセクションを参照してください。