最終確認: 2026年5月
AZ-700 試験の対象となる AWS サービスを、プレーンな Terraform を使用して構築します。1 ブロックずつ、それぞれ試験ドメインに関連付けられています。同じコードが OpenTofu でも動作します。
このラボの終了までに、プレーンなTerraformを使用して、AZ-700リファレンスネットワークをプロビジョニングします。このネットワークは、共有サービスサブネットを持つハブVNet、アプリサブネットを持つスポークVNet、両者間の双方向ピアリング、VNet間名前解決のために両方のVNetにリンクされたプライベートDNSゾーン、およびトラフィック可視化のためのLog AnalyticsへのNSGフローログで構成されます。
これらのスニペットを単一の main.tf にドロップし、terraform init を実行してから、terraform apply をステップバイステップで実行します。
>= 1.5 または OpenTofu >= 1.6。az login)。ほとんど無料ですが、1点注意が必要です。
アイドル状態で月あたり約$1~2。AZ-700のコストトラップはVPN Gateway(月あたり約$60)とExpressRoute(月あたり$200以上)です。これらはここでは省略されています。
標準的なAzureの開始部分です。
terraform {
required_version = ">= 1.5"
required_providers {
azurerm = { source = "hashicorp/azurerm", version = "~> 4.0" }
}
}
provider "azurerm" {
features {}
}
locals {
tags = {
Project = "certlabpro-az-700"
ManagedBy = "terraform"
}
}
resource "azurerm_resource_group" "main" {
name = "certlabpro-az-700-rg"
location = "eastus"
tags = local.tags
}ハブアンドスポークはAZ-700の参照トポロジーです。ハブは共有サービス(ファイアウォール、VPNゲートウェイ、DNSリゾルバー、監視)を一元化し、スポークはハブとピアリングしてそれらにアクセスします。ここでは10.0.0.0/16に1つのサブネットを持つハブを構築します。実際のハブでは、VPN/ExpressRoute Gateway用のGatewaySubnet、Azure Firewall用のAzureFirewallSubnet、そしてDNS Resolverのインバウンド/アウトバウンドエンドポイント用の共有サービスサブネットを持つでしょう。ラボのスコープはトポロジーの形状であり、ゲートウェイサービスはスコープ外(高コスト)です。
resource "azurerm_virtual_network" "hub" {
name = "vnet-hub"
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" "hub_shared" {
name = "shared-services"
resource_group_name = azurerm_resource_group.main.name
virtual_network_name = azurerm_virtual_network.hub.name
address_prefixes = ["10.0.1.0/24"]
}10.1.0.0/16のスポーク — ハブと意図的に重複しないようにしています。アプリサブネットにアタッチされたNSGは、本番環境では特定のソースCIDRへのイングレスを制限しますが、このラボではアーキテクチャをテスト可能にするためにソースに*を使用しています。
AZ-700の「コアネットワーキングインフラストラクチャの実装」では、サブネットごとのNSGとNICごとのNSGという問いが繰り返し出てきます。質問が「サブネット内のすべてのリソースに適用される」と述べている場合、サブネットレベルのNSG(このラボ)が正しい答えであり、NICレベルは上書きとして機能します。
resource "azurerm_virtual_network" "spoke" {
name = "vnet-spoke"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
address_space = ["10.1.0.0/16"]
tags = local.tags
}
resource "azurerm_subnet" "spoke_app" {
name = "app"
resource_group_name = azurerm_resource_group.main.name
virtual_network_name = azurerm_virtual_network.spoke.name
address_prefixes = ["10.1.1.0/24"]
}
resource "azurerm_network_security_group" "spoke_app" {
name = "nsg-spoke-app"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
security_rule {
name = "AllowHttpsFromInternet"
priority = 100
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "*"
destination_port_range = "443"
source_address_prefix = "*"
destination_address_prefix = "*"
}
tags = local.tags
}
resource "azurerm_subnet_network_security_group_association" "spoke_app" {
subnet_id = azurerm_subnet.spoke_app.id
network_security_group_id = azurerm_network_security_group.spoke_app.id
}VNetピアリングは、AZ-700におけるリージョン内の接続プリミティブです。試験でテストされる2つの主要なプロパティは次のとおりです。
allow_forwarded_traffic — ハブが1つのスポークから別のスポークへトラフィックを転送する計画がある場合(ハブ内のファイアウォールを介したトランジット)に必要です。use_remote_gateways / allow_gateway_transit — スポークはハブのVPN/ERゲートウェイを利用するために use_remote_gateways = true を使用します。このラボにはゲートウェイがありませんが、この属性の形状は試験でテストされます。resource "azurerm_virtual_network_peering" "hub_to_spoke" {
name = "hub-to-spoke"
resource_group_name = azurerm_resource_group.main.name
virtual_network_name = azurerm_virtual_network.hub.name
remote_virtual_network_id = azurerm_virtual_network.spoke.id
allow_forwarded_traffic = true
allow_gateway_transit = true
}
resource "azurerm_virtual_network_peering" "spoke_to_hub" {
name = "spoke-to-hub"
resource_group_name = azurerm_resource_group.main.name
virtual_network_name = azurerm_virtual_network.spoke.name
remote_virtual_network_id = azurerm_virtual_network.hub.id
allow_forwarded_traffic = true
# use_remote_gateways = true # uncomment when a gateway exists in the hub
}プライベートDNSゾーンは、AzureのデフォルトDNSに依存しないVNet間の名前解決に対するAZ-700の「名前解決の設計と実装」における解決策です。ここではinternal.contoso.comゾーンを作成し、ハブとスポークの両方のVNetをそれにリンクします。これにより、いずれかのVNet内のリソースがこのゾーン内のレコードをクエリできるようになります。
ハブリンクのregistration_enabled = trueフラグにより、ハブ内のリソースがホスト名を自動登録できます。AZ-700では、この自動登録と手動のAレコード作成が、「VMのクリーンなDNS名をどのように取得するか」という繰り返し出る質問としてテストされます。
resource "azurerm_private_dns_zone" "main" {
name = "internal.contoso.com"
resource_group_name = azurerm_resource_group.main.name
tags = local.tags
}
resource "azurerm_private_dns_zone_virtual_network_link" "hub" {
name = "hub-link"
resource_group_name = azurerm_resource_group.main.name
private_dns_zone_name = azurerm_private_dns_zone.main.name
virtual_network_id = azurerm_virtual_network.hub.id
registration_enabled = true # auto-register hub-resident VMs
tags = local.tags
}
resource "azurerm_private_dns_zone_virtual_network_link" "spoke" {
name = "spoke-link"
resource_group_name = azurerm_resource_group.main.name
private_dns_zone_name = azurerm_private_dns_zone.main.name
virtual_network_id = azurerm_virtual_network.spoke.id
registration_enabled = false # spoke resources query but don't register
tags = local.tags
}terraform destroyはすべてを削除します。いずれかのVNetが破棄されると、ピアリングリソースは自動的にデタッチされます。Terraformは順序を正しく処理します。アクティブなレコードを持つプライベートDNSゾーンは、破棄に時間がかかる場合があります(Azureがすべてのコンシューマーリンクが最初にデタッチされるのを待つため) — 辛抱強くお待ちください。
AZ-700は、このラボでは扱いきれない様々なネットワーキングサービスをカバーしています — VPN Gateway(月あたり約$60、ラボにはコストが高すぎる)、ExpressRoute + ER Gateway、Azure Firewall + Firewall Policy + Premium IDPS(アイドル時約$1/時間)、Application Gateway + WAF、Azure Front Door、Azure Load Balancer(Standard層)、Azure DNSパブリックゾーン、DNS Private Resolver、Azure Bastion、ネットワーク仮想アプライアンス、Virtual WAN、Route Server、カスタムルートテーブル(UDR)、サービスエンドポイント、プライベートエンドポイント + プライベートリンクサービス、およびDDoS Protection Standard。
私たちは、他のすべてのAZ-700パターンがアタッチされる基盤であるハブアンドスポーク + ピアリング + プライベートDNSの形状に限定しています。VPN Gatewayはハブに配置されます。ファイアウォールはハブに配置されます。Application Gatewayはスポークのアプリサブネットを保護します。プライベートエンドポイントはハブを介してルーティングされます。まずトポロジーを正しく理解し、その後パターンごとにレイヤーを重ねていきます。
上記のサービスについては、この認定資格ページの閲覧、プレイブック、およびEditorialセクションを参照してください。