最終確認: 2026年5月
AZ-104 試験の対象となる AWS サービスを、プレーンな Terraform を使用して構築します。1 ブロックずつ、それぞれ試験ドメインに関連付けられています。同じコードが OpenTofu でも動作します。
このラボの終了時には、プレーンなTerraformを使用して、AZ-104の参照ワークロード(リソースグループ、NSGで保護されたプライベートサブネットを持つVNet、システム割り当てマネージドIDを持つLinux VM、そのIDを介してVMが読み取ることができるストレージアカウント、およびVM診断を受信するLog Analyticsワークスペース)をプロビジョニング済みとなります。各ブロックは、5つのAZ-104試験ドメインのいずれかに対応しています。
これらのスニペットを単一のmain.tfファイルに配置し、terraform initを実行した後、terraform applyをステップバイステップで実行してください。
>= 1.5 または OpenTofu >= 1.6。az login)。~/.ssh/id_rsa.pub にあること(またはステップ4でパスを変更してください)。課金対象はVMです:
VMを積極的に使用していない場合は、az vm deallocateで停止してコンピューティングコストを半分に抑えてください。リソースグループ全体を破棄すると、すべての課金が完全に停止します。
標準的なAzureの開始: azurerm ~> 4.0 を固定し、リソースグループを作成し、ローカルのSSH公開鍵をデータソースとして読み取り、ステップ4のVMがそれを使用できるようにします。AZ-104の「IDとガバナンス」ドメインでは、リソースグループを最小のRBACスコープとしてテストします。ここでのタグは、「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 {}
}
resource "random_id" "suffix" {
byte_length = 2
}
locals {
tags = {
Project = "certlabpro-az-104"
ManagedBy = "terraform"
}
}
resource "azurerm_resource_group" "main" {
name = "certlabpro-az-104-rg"
location = "eastus"
tags = local.tags
}すべてのAZ-104ワークロードは仮想ネットワーク内で実行されます。ここでは /16 のVNetを作成し、VM用に1つの /24 サブネットを切り出します。サブネットにアタッチされたNSGは、SSH (ポート22) のインバウンドを許可します。本番環境ではソースCIDRを制限しますが、このラボでは任意のIPから接続できるよう * に開いています。
AZ-104の「ネットワークのデプロイと管理」ドメインでは、この多層セキュリティパターンが繰り返しテストされます。NSGはステートフルであり、サブネット「または」NICに適用されます(ここではAZ-104のベストプラクティスに従いサブネットに適用します)。また、デフォルト拒否 + 明示的許可のルール構造は、Azure NSGがAWSセキュリティグループと異なる点です(Azure NSGには明示的なルール番号がありますが、AWS SGにはありません)。
resource "azurerm_virtual_network" "main" {
name = "certlabpro-az-104-vnet"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
address_space = ["10.0.0.0/16"]
tags = local.tags
}
resource "azurerm_subnet" "app" {
name = "app"
resource_group_name = azurerm_resource_group.main.name
virtual_network_name = azurerm_virtual_network.main.name
address_prefixes = ["10.0.1.0/24"]
}
resource "azurerm_network_security_group" "app" {
name = "certlabpro-az-104-nsg"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
security_rule {
name = "AllowSSH"
priority = 100
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "*"
destination_port_range = "22"
source_address_prefix = "*"
destination_address_prefix = "*"
}
tags = local.tags
}
resource "azurerm_subnet_network_security_group_association" "app" {
subnet_id = azurerm_subnet.app.id
network_security_group_id = azurerm_network_security_group.app.id
}標準的なAZ-104のストレージデフォルト設定: Standardティア、LRS、HTTPSのみ、TLS 1.2最小、パブリックアクセスブロック。ステップ4では、VMのマネージドIDにこのアカウントへの読み取りアクセスを許可します。「Azure IDとガバナンスの管理」ドメインでは、ストレージアカウントキーをアプリケーション構成に保存する代わりに、この「マネージドID → リソース」パターンをパスワードレスの代替としてテストします。
resource "azurerm_storage_account" "data" {
name = "az104data${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
}VMは標準的なAZ-104のコンピューティングアーティファクトです。ここでは Standard_B1s (最小の無料利用枠対象Linux SKU)、Ubuntu 22.04 LTS、SSHキー認証(AZ-104のパスワードアンチパターン回答)、およびシステム割り当てマネージドIDを使用します。
ロール割り当てにより、そのマネージドIDにステップ3のストレージアカウントに対する Storage Blob Data Reader が付与されます。つまり、VMはディスクにキーを保存することなく、自身のIDトークンを使用してストレージREST APIを呼び出すことができます。これはAZ-104の「ストレージの実装と管理」 + 「ID」のクロスオーバー質問です。VMが認証情報なしでストレージにアクセスするにはどうすればよいか? 答えはマネージドID + RBACロール割り当てです。
resource "azurerm_public_ip" "vm" {
name = "certlabpro-az-104-vm-pip"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
allocation_method = "Static"
sku = "Standard"
tags = local.tags
}
resource "azurerm_network_interface" "vm" {
name = "certlabpro-az-104-vm-nic"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
ip_configuration {
name = "ipconfig1"
subnet_id = azurerm_subnet.app.id
private_ip_address_allocation = "Dynamic"
public_ip_address_id = azurerm_public_ip.vm.id
}
tags = local.tags
}
resource "azurerm_linux_virtual_machine" "main" {
name = "certlabpro-az-104-vm"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
size = "Standard_B1s"
admin_username = "azureuser"
disable_password_authentication = true
network_interface_ids = [azurerm_network_interface.vm.id]
admin_ssh_key {
username = "azureuser"
public_key = file("~/.ssh/id_rsa.pub")
}
os_disk {
caching = "ReadWrite"
storage_account_type = "Standard_LRS"
}
source_image_reference {
publisher = "Canonical"
offer = "0001-com-ubuntu-server-jammy"
sku = "22_04-lts-gen2"
version = "latest"
}
identity {
type = "SystemAssigned"
}
tags = local.tags
}
resource "azurerm_role_assignment" "vm_storage_reader" {
scope = azurerm_storage_account.data.id
role_definition_name = "Storage Blob Data Reader"
principal_id = azurerm_linux_virtual_machine.main.identity[0].principal_id
}AZ-104の「Azureリソースの監視と保守」ドメイン(試験の約10〜15%)は、監視可能なすべてのものの宛先としてLog Analyticsに依存しています。ここではワークスペースと、ステップ3のストレージアカウントに対する診断設定を作成します。これにより、すべてのストレージトランザクションがクエリ可能なKQL形式で記録されるようになります。
VMの場合、通常はVM拡張機能経由でAzure Monitor Agent (AMA) をインストールします。これがLog Analytics Agent以降の最新のパスです。このラボではワークスペースを設定します。エージェント自体のインストールは、閲覧 / Editorialで扱われている別のランタイムステップ (azurerm_virtual_machine_extension) です。ワークスペースが存在し、リソースがそこにストリーミングされるというアーキテクチャの形態が、AZ-104の質問で問われる内容です。
resource "azurerm_log_analytics_workspace" "main" {
name = "certlabpro-az-104-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_monitor_diagnostic_setting" "storage" {
name = "diag"
target_resource_id = "${azurerm_storage_account.data.id}/blobServices/default/"
log_analytics_workspace_id = azurerm_log_analytics_workspace.main.id
enabled_log {
category = "StorageRead"
}
enabled_log {
category = "StorageWrite"
}
metric {
category = "AllMetrics"
enabled = true
}
}terraform destroyはすべてを破棄します。2点注意点があります。
az vm deallocateでコンピューティングの課金を停止できます(ストレージは引き続き課金されます)。terraform destroyはすべてを削除します。Static 割り当てであるため、VMの割り当て解除後も存続し、IPアドレス予約を保持します。未使用のパブリックIPに対して料金を支払いたくない場合(約0.005ドル/時間)は、破棄するか、動的割り当てに変換してください。AZ-104は、Azure Backup、Recovery Services Vault、Site Recovery、Azure Files / Azure File Sync、Azure Migrate、Application Gateway、Load Balancer、Azure Bastion、VPN Gateway、ExpressRoute、Azure Firewall、Azure Policy、Azure Blueprints(非推奨)、Entra IDの条件付きアクセス、B2B/B2C、RBACカスタムロール、ARM/Bicepテンプレートなど、広範な運用領域をカバーしています。
私たちは、他のすべてのAZ-104の質問が前提とする基盤であるため、VNet + VM + ストレージ + 監視のベースラインに焦点を当てます。レイヤー7ルーティングのためにApplication Gatewayを追加したり、ハイブリッド接続のためにVPN Gatewayを追加したり、バックアップのためにRecovery Services Vaultを追加したりできます。これらはすべてこのベースに特化した追加機能です。
サービスごとのカバー範囲については、この認定ページにある閲覧、プレイブック、Editorialセクションを参照してください。