最終確認: 2026年5月
ANS-C01 試験の対象となる AWS サービスを、プレーンな Terraform を使用して構築します。1 ブロックずつ、それぞれ試験ドメインに関連付けられています。同じコードが OpenTofu でも動作します。
このラボを完了すると、プレーンなTerraformを使用して、標準的なAWSマルチVPCバックボーンがプロビジョニングされます。これは、同じリージョンに配置された2つのデュアルスタック(IPv4 + IPv6)VPCが、明示的なルートテーブル関連付けを持つTransit Gatewayを介して接続され、プライマリVPCにはCloudWatchにバックアップされたVPCフローログが設定されているため、ネットワークを通過するものを実際に確認できます。これは、すべてのANS-C01マルチVPCの質問が前提としているアーキテクチャです。
すべてのリソースはプレーンなTerraformです。スニペットを単一の main.tf にドロップし、terraform init を実行した後、terraform apply をステップバイステップで実行してください。
>= 1.5 または OpenTofu >= 1.6。us-east-1 で AWS CLIの認証が完了していること。このラボのほとんどは安価または無料ですが、Transit Gatewayはそうではありません。
このラボの主な費用はTGWの時間料金です。アタッチメント2つ × $0.05/時間 × 24時間 × 30日間 ≈ 稼働中は月額約$72となります。探索が終わり次第、すぐに破棄してください。TGWは、ANS-C01ラボにおける最大のコストトラップです。
標準的な開始点です。Transit Gatewayはリージョンサービスであり、すべてのアタッチメントはTGWが存在するリージョン内にある必要があります。リージョン間の接続にはTGWピアリングを追加します(v1では対象外)。ここではデフォルトで us-east-1 を使用します。
terraform {
required_version = ">= 1.5"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.60"
}
}
}
provider "aws" {
region = "us-east-1"
default_tags {
tags = {
Project = "certlabpro-ans-c01"
ManagedBy = "terraform"
}
}
}
data "aws_availability_zones" "available" {
state = "available"
}ANS-C01では特にデュアルスタックVPCがテストされます。現在、assign_generated_ipv6_cidr_block = true を設定すると、AWSはすべての新しいVPCにIPv6 /56 をデフォルトで割り当てます。試験の ネットワーク設計 ドメインでは、IPv4 CIDR計画の計算(ピアリングまたはTGWアタッチを希望する場合の非重複 /16)と、IPv6サブネットの導出(各サブネットがVPCの /56 から切り出された /64 を取得)の両方がテストされます。
ここではIPv4 10.0.0.0/16 とAWSが自動生成するIPv6 /56 を割り当てます。この単一のサブネットは、/24 のIPv4ブロックと、VPCの /56 から切り出された /64 のIPv6ブロックを使用します — cidrsubnet はその計算のためのTerraform組み込み関数です。最新のAWSリージョンでは、インターネットゲートウェイはデフォルトでデュアルスタックです。
resource "aws_vpc" "primary" {
cidr_block = "10.0.0.0/16"
assign_generated_ipv6_cidr_block = true
enable_dns_hostnames = true
tags = { Name = "certlabpro-ans-c01-primary" }
}
resource "aws_subnet" "primary_a" {
vpc_id = aws_vpc.primary.id
cidr_block = "10.0.1.0/24"
ipv6_cidr_block = cidrsubnet(aws_vpc.primary.ipv6_cidr_block, 8, 1)
availability_zone = data.aws_availability_zones.available.names[0]
assign_ipv6_address_on_creation = true
tags = { Name = "certlabpro-ans-c01-primary-a" }
}
resource "aws_internet_gateway" "primary" {
vpc_id = aws_vpc.primary.id
}VPC #1の 10.0.0.0/16 と意図的に重複しない 10.1.0.0/16 に2番目のVPCを構築します。ANS-C01ではこの設計ルールが繰り返し強調されます。なぜなら、2つのVPCを接続したい(ピアリング、TGWなど)と思った瞬間に、CIDRの重複がAWS APIレイヤーで禁止されるからです。ローカルでも主張されているCIDRにルーティングすることはできません。
VPC #2にもAWSが自動生成するIPv6 /56 が割り当てられます(各VPCにはグローバルに一意のブロックが与えられるため、デフォルトではIPv6の重複リスクはありません)。サブネットの分割計算はステップ2と同じ形式です。
resource "aws_vpc" "secondary" {
cidr_block = "10.1.0.0/16"
assign_generated_ipv6_cidr_block = true
enable_dns_hostnames = true
tags = { Name = "certlabpro-ans-c01-secondary" }
}
resource "aws_subnet" "secondary_a" {
vpc_id = aws_vpc.secondary.id
cidr_block = "10.1.1.0/24"
ipv6_cidr_block = cidrsubnet(aws_vpc.secondary.ipv6_cidr_block, 8, 1)
availability_zone = data.aws_availability_zones.available.names[0]
assign_ipv6_address_on_creation = true
tags = { Name = "certlabpro-ans-c01-secondary-a" }
}Transit Gatewayはハブです。数千のVPCアタッチメントにスケールし、AWS Resource Access Manager (RAM) を介したクロスアカウント共有をサポートし、N²個のピアリング接続の代わりに単一のルートテーブルで考慮することができます。ANS-C01では、「3つ以上のVPC」や「ネットワークの成長」といった質問で、VPCピアリングよりもこのハブアンドスポークの選択がテストされます。
ここでは、デフォルトのルートテーブル関連付けと伝播を無効にしてTGWを作成します — これは、どのアタッチメントがどのルートテーブルを設定するかを明示的に強制するため、ANS-C01でより多くテストされるパターンです。自動関連付けは便利な設定ですが、手動設定は監査に優しい設定です。
アタッチメントリソースはVPCごとのブリッジです。両方のVPCがアタッチされると、TGWは両方のCIDRを認識しますが、各VPCのメインルートテーブルからTGWを指すルートをまだ追加する必要があります(ステップ5)。
resource "aws_ec2_transit_gateway" "hub" {
description = "certlabpro-ans-c01 hub"
default_route_table_association = "disable"
default_route_table_propagation = "disable"
multicast_support = "disable"
tags = { Name = "certlabpro-ans-c01-tgw" }
}
resource "aws_ec2_transit_gateway_route_table" "main" {
transit_gateway_id = aws_ec2_transit_gateway.hub.id
tags = { Name = "certlabpro-ans-c01-tgw-rt" }
}
resource "aws_ec2_transit_gateway_vpc_attachment" "primary" {
transit_gateway_id = aws_ec2_transit_gateway.hub.id
vpc_id = aws_vpc.primary.id
subnet_ids = [aws_subnet.primary_a.id]
transit_gateway_default_route_table_association = false
transit_gateway_default_route_table_propagation = false
}
resource "aws_ec2_transit_gateway_vpc_attachment" "secondary" {
transit_gateway_id = aws_ec2_transit_gateway.hub.id
vpc_id = aws_vpc.secondary.id
subnet_ids = [aws_subnet.secondary_a.id]
transit_gateway_default_route_table_association = false
transit_gateway_default_route_table_propagation = false
}
resource "aws_ec2_transit_gateway_route_table_association" "primary" {
transit_gateway_attachment_id = aws_ec2_transit_gateway_vpc_attachment.primary.id
transit_gateway_route_table_id = aws_ec2_transit_gateway_route_table.main.id
}
resource "aws_ec2_transit_gateway_route_table_association" "secondary" {
transit_gateway_attachment_id = aws_ec2_transit_gateway_vpc_attachment.secondary.id
transit_gateway_route_table_id = aws_ec2_transit_gateway_route_table.main.id
}
resource "aws_ec2_transit_gateway_route_table_propagation" "primary" {
transit_gateway_attachment_id = aws_ec2_transit_gateway_vpc_attachment.primary.id
transit_gateway_route_table_id = aws_ec2_transit_gateway_route_table.main.id
}
resource "aws_ec2_transit_gateway_route_table_propagation" "secondary" {
transit_gateway_attachment_id = aws_ec2_transit_gateway_vpc_attachment.secondary.id
transit_gateway_route_table_id = aws_ec2_transit_gateway_route_table.main.id
}ステップ4で作成したTGWは両方のVPCを認識していますが、各VPC自身のルートテーブルはまだもう一方のVPCへの到達方法を知りません。VPC #1のルートテーブルは 10.1.0.0/16 のトラフィックをTGWに送信し、その逆も同様です。試験ではこの双方向の要件が繰り返しテストされます — 「両方をTGWにアタッチしたのに、なぜpingできないのか?」という質問は、ほとんどの場合、リターンパスルートの欠如が原因です。
最後に、VPCフローログです。ANS-C01の ネットワークモニタリング ドメインでは、これらのフローログが、実際にネットワークを通過しているパケット(許可、拒否、およびメタデータのみ(5タプル+バイト+パケット+結果))を確認する唯一の方法としてテストされます。プライマリVPCで有効にし、専用のCloudWatchロググループにログを流します。アタッチするIAMロールは、フローログがロググループに書き込むために引き受けるものです。
ルートが設定され、フローログが実行されることで、バックボーンが完成します。明示的な(監査に優しい)ルーティングを持つTGWを介して接続された2つのデュアルスタックVPCと、プライマリ側でのパケットレベルの可視性が得られます。Direct Connect Gateway、TGWピアリング、NAT、PrivateLink、VPCエンドポイントなど、追加のANS-C01パターンはすべてこの基盤にアタッチされます。
resource "aws_route" "primary_to_secondary" {
route_table_id = aws_vpc.primary.main_route_table_id
destination_cidr_block = "10.1.0.0/16"
transit_gateway_id = aws_ec2_transit_gateway.hub.id
depends_on = [aws_ec2_transit_gateway_vpc_attachment.primary]
}
resource "aws_route" "secondary_to_primary" {
route_table_id = aws_vpc.secondary.main_route_table_id
destination_cidr_block = "10.0.0.0/16"
transit_gateway_id = aws_ec2_transit_gateway.hub.id
depends_on = [aws_ec2_transit_gateway_vpc_attachment.secondary]
}
# ── VPC Flow Logs ─────────────────────────────────────────────
resource "aws_cloudwatch_log_group" "vpc_flow" {
name = "/aws/vpc-flow/certlabpro-ans-c01-primary"
retention_in_days = 30
}
resource "aws_iam_role" "vpc_flow" {
name = "certlabpro-ans-c01-vpc-flow"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Principal = { Service = "vpc-flow-logs.amazonaws.com" }
Action = "sts:AssumeRole"
}]
})
}
resource "aws_iam_role_policy" "vpc_flow" {
name = "write-flow-logs"
role = aws_iam_role.vpc_flow.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Action = [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"logs:DescribeLogGroups",
"logs:DescribeLogStreams",
]
Resource = aws_cloudwatch_log_group.vpc_flow.arn
}]
})
}
resource "aws_flow_log" "primary" {
vpc_id = aws_vpc.primary.id
traffic_type = "ALL"
log_destination_type = "cloud-watch-logs"
log_destination = aws_cloudwatch_log_group.vpc_flow.arn
iam_role_arn = aws_iam_role.vpc_flow.arn
max_aggregation_interval = 60
}terraform destroy はこのラボのすべてを削除しますが、順序には注意してください — Transit Gatewayのアタッチメントはデタッチに5〜10分かかり、TGW自体は両方のアタッチメントが完全に削除されるまで削除できません。terraform destroy は依存関係グラフを正しく処理しますが、操作は高速ではありません。削除中に Ctrl-C を押すと、部分的にデタッチされたアタッチメントが残り、コンソール経由でクリーンアップする必要が生じます。
迅速に削除する最大の理由は、TGWの時間料金です — 各アタッチメントが1時間あたり$0.05で、2つのアタッチメントで合計月額$72になります。ラボが実行中であることを忘れると、費用はすぐに膨らみます。
ANS-C01では、このラボでは扱いきれないネットワークサービスがカバーされています — Direct Connect(物理ポートなしではテスト環境を構築できない)、AWS Site-to-Site VPN(顧客側のエンドポイントが必要)、ハイブリッドDNS用のRoute 53 Resolverインバウンド/アウトバウンドエンドポイント、PrivateLink + VPCエンドポイントサービス、AWS Network Firewall、AWS Global Accelerator、Route 53ヘルスチェック + フェイルオーバー、Network Access Analyzer、Reachability Analyzer、Transit Gatewayピアリング(クロスリージョン)、Cloud WAN、AWS App Mesh、およびBGP固有のシナリオ(ルートフィルタリング、prepend、AS-PATH操作)などです。
私たちはマルチVPCバックボーンの形状に固執します。なぜなら、これは試験で最も頻繁にテストされるアーキテクチャだからです — Direct Connectアタッチメント、VPNトンネル、ハイブリッドDNS、PrivateLinkはすべて、この種のTGWハブを基盤としています。ハブアンドスポークを正しく理解してください。スポークの種類はその拡張です。
プロビジョニングされていないサービスについては、この認定ページの閲覧、プレイブック、およびEditorialセクションに概念的な情報が記載されています。Route 53 Resolver + VPNアタッチメント + PrivateLinkを追加する次のラボで、ハイブリッドネットワークのストーリーが完成します。