Cloud Enterprise Network (CEN) を使用すると、リージョン内で柔軟な接続性、隔離、トラフィックの自動転送ポリシーを定義できます。本トピックでは、CEN を使用して複数の隔離された VPC が同一の共有サービスにアクセスできるようにする方法について説明します。
背景情報
本トピックでは、以下のシナリオを例に説明します。ある企業が中国 (杭州) リージョンに 3 つの VPC をデプロイしています。VPC3 には共有サービスがホストされています。この企業は、VPC1 および VPC2 が VPC3 の共有サービスにアクセスできるようにしつつ、VPC1 と VPC2 間の通信を防止したいと考えています。
ネットワーク計画
この目的を達成するために、カスタムルートテーブル、ルートテーブルの関連付け、ルート伝播などの CEN 機能を使用できます。次の図は、計画されたネットワークおよびルーティングアーキテクチャを示しています。
VPC3 をトランジットルーターにアタッチする際、トランジットルーターのデフォルトルートテーブルとの関連付けおよびシステムルートをトランジットルーターのデフォルトルートテーブルに伝播の高度な機能を有効化します。
これらの機能を有効化すると、トランジットルーターのデフォルトルートテーブルが VPC3 のシステムルートを自動的に学習します。その後、VPC3 はこのルートテーブルを使用してトラフィックを転送します。
VPC1 および VPC2 をトランジットルーターにアタッチする際は、システムルートをトランジットルーターのデフォルトルートテーブルに伝播の高度な機能のみを有効化します。その後、VPC1 および VPC2 をトランジットルーターのカスタムルートテーブルに関連付け、そのテーブルに VPC3 を指すカスタムルートエントリーを追加します。
この構成により、トランジットルーターのデフォルトルートテーブルが VPC1 および VPC2 のすべてのシステムルートを学習します。VPC1 および VPC2 はカスタムルートテーブルを使用して VPC3 へのトラフィックを転送します。この構成では、VPC1 と VPC2 は互いに通信できません。
VPC1、VPC2、および VPC3 のルートテーブルに、宛先が
0.0.0.0/0のルートエントリを追加します。このルートのネクストホップはトランジットルーターである必要があります。中国 (杭州) リージョンに 3 つの VPC を作成し、指定されたゾーンに vSwitch を作成します。次の表は、VPC の CIDR ブロック計画を示しています。
重要ネットワークを計画する際は、VPC の CIDR ブロックが重複しないようにしてください。
VPC
vSwitch
vSwitch ゾーン
CIDR ブロック
ECS IP アドレス
VPC1
プライマリ CIDR ブロック:192.168.0.0/16
vSwitch1
ゾーン A
192.168.0.0/24
ECS1 IP アドレス:
192.168.0.224
vSwitch2
ゾーン B
192.168.1.0/24
VPC2
プライマリ CIDR ブロック:172.16.0.0/16
vSwitch3
ゾーン A
172.16.0.0/24
ECS2 IP アドレス:
172.16.0.222
vSwitch4
ゾーン B
172.16.1.0/24
VPC3
プライマリ CIDR ブロック:10.0.0.0/16
vSwitch5
ゾーン A
10.0.0.0/24
ECS3 IP アドレス:
10.0.0.112
vSwitch6
ゾーン B
10.0.1.0/24
操作手順
コンソールまたは Terraform を使用してリソースを構成できます。ニーズに最も適した方法を選択してください。
コンソール
ステップ 1:CEN インスタンスの作成
ネットワークインスタンスを接続する前に、CEN インスタンスを作成する必要があります。
CEN コンソールにログインします。
インスタンスページで、CEN インスタンスの作成をクリックします。
CEN インスタンスの作成ダイアログボックスで、CEN インスタンスを構成し、OK をクリックします。
名前:CEN インスタンスの名前を入力します。
説明:CEN インスタンスの説明を入力します。
ステップ 2:VPC アタッチメントの作成
インスタンスページで、作成した CEN インスタンスの ID をクリックします。
基本情報タブで、VPCセクションの
アイコンをクリックします。ピアネットワークインスタンスとの接続ページで、パラメーターを構成し、OK をクリックします。
ネットワークタイプ:Virtual Private Cloud (VPC) がデフォルトで選択されています。
リージョン:ネットワークインスタンスがデプロイされているリージョンを選択します。この例では、中国 (杭州) を選択します。
トランジットルーター:システムが選択したリージョンにトランジットルーターを自動的に作成します。
リソース所有者 UID:ネットワークインスタンスを所有するアカウントのタイプを選択します。この例では、デフォルト値の現在のアカウントを使用します。
課金方法:デフォルト値の従量課金を使用します。
アタッチメント名:アタッチメントの名前を入力します。
ネットワークインスタンス:接続する VPC の ID を選択します。この例では、VPC3 を選択します。
vSwitch:トランジットルーターがサポートするゾーン内の vSwitch を選択します。
Enterprise Edition トランジットルーターが単一ゾーンのみをサポートするリージョンにデプロイされている場合、そのゾーン内の vSwitch を選択します。
複数ゾーンをサポートするリージョンにデプロイされている場合、ゾーンディザスタリカバリのために異なるゾーンに少なくとも 2 つの vSwitch を選択します。これにより、VPC とトランジットルーター間のデータ伝送が途切れなく継続されます。
データがより短い距離で伝送されるため、レイテンシを低減し、ネットワークパフォーマンスを向上させるために、各ゾーンに vSwitch を選択することを推奨します。
高度な設定:システムはデフォルトで次の 3 つの高度な機能を選択します。この例の VPC3 では、トランジットルーターのデフォルトルートテーブルとの関連付けおよびシステムルートをトランジットルーターのデフォルトルートテーブルに伝播の機能のみを有効化します。
VPC3 のアタッチメントを作成後、さらに接続を作成をクリックします。
すべての VPC アタッチメントを作成後、リストに戻るをクリックして、インスタンス詳細ページに戻ります。
ステップ 3:VPC1 および VPC2 のカスタムルーティングとの関連付け
インスタンス詳細ページで、作成したトランジットルーターの ID をクリックします。
トランジットルーター詳細ページで、ルートテーブルタブをクリックします。
左側のペインで、ルートテーブルの作成をクリックします。
ルートテーブルの作成ダイアログボックスで、パラメーターを構成し、OK をクリックします。
トランジットルーター:システムが現在のリージョンのトランジットルーターを自動的に選択します。
ルートテーブル名:ルートテーブルの名前を入力します。
ルートテーブルの説明:ルートテーブルの説明を入力します。
マルチリージョン ECMP ルーティング:デフォルト設定を維持します。
ルートテーブルの詳細を表示をクリックして、ルートテーブルタブに戻ります。
ルートテーブルタブで、直前に作成したカスタムルートテーブルを選択します。ルートテーブルの関連付けタブをクリックし、関連付けの作成をクリックします。
関連付けの追加ダイアログボックスで、カスタムルートテーブルに関連付ける VPC アタッチメントを選択し、OK をクリックします。
この例では、VPC1 および VPC2 の両方をカスタムルートテーブルに関連付けます。関連付けを作成後、VPC1 および VPC2 はこのルートテーブルを使用してトラフィックを転送します。
カスタムルートテーブルの詳細ページで、ルートエントリタブをクリックし、ルートエントリの作成をクリックします。
ルートエントリの追加ダイアログボックスで、パラメーターを構成し、OK をクリックします。
ルートテーブル:システムが現在のカスタムルートテーブルを自動的に選択します。
トランジットルーター:システムが現在のリージョンのトランジットルーターを自動的に選択します。
ルートエントリ名:ルートエントリの名前を入力します。
宛先 CIDR ブロック:ルートの宛先 CIDR ブロックを入力します。この例では、
10.0.0.0/16を入力します。ブラックホールルート:このオプションを有効化すると、このルート宛てのすべてのトラフィックが破棄されます。この例では、いいえ を選択します。
ネクストホップ:ルートのネクストホップを選択します。この例では、VPC3 アタッチメントを選択します。
ルートエントリの説明:ルートエントリの説明を入力します。
ステップ 4:VPC へのデフォルトルートの追加
VPC1、VPC2、および VPC3 のルートテーブルに、VPC コンソールで宛先 CIDR ブロックが 0.0.0.0/0 でネクストホップがトランジットルーターアタッチメントを指すルートエントリを追加します。
VPC コンソールにログインします。
左側のナビゲーションウィンドウで、ルートテーブルをクリックします。
上部のナビゲーションバーで、ルートテーブルが配置されているリージョンを選択します。
ルートテーブルページで、対象のルートテーブルの ID をクリックします。
この例では、VPC3 のルートテーブルを選択します。
ルートテーブル詳細ページで、ルートエントリタブのカスタムサブタブをクリックします。その後、ルートエントリの追加をクリックします。
ルートエントリの追加パネルで、ルートエントリを構成し、OK をクリックします。
名前:ルートエントリの名前を入力します。
宛先 CIDR ブロック:宛先 CIDR ブロックを入力します。この例では、
0.0.0.0/0を入力します。ネクストホップタイプ:ネクストホップのタイプを選択します。この例では、トランジットルーター を選択します。
トランジットルーター:ネットワークインスタンスアタッチメントを選択します。この例では、VPC3 アタッチメントを選択します。
パラメーターの詳細については、「カスタムルートテーブルを使用したネットワークトラフィックの管理」をご参照ください。
ステップ 4 から ステップ 6 を繰り返して、VPC1 および VPC2 に対して宛先が
0.0.0.0/0でネクストホップがトランジットルーターアタッチメントを指すデフォルトルートを追加します。構成を完了後、CEN コンソールのトランジットルーター詳細ページで、VPC およびトランジットルーターのルートテーブルのルーティング情報を確認できます。
トランジットルーター詳細ページで、ネットワークラウトをクリックして、VPC1、VPC2、および VPC3 のルートを表示します。
トランジットルーター詳細ページで、ネットワークラウトをクリックします。
ネットワークインスタンスドロップダウンリストから、VPC1、VPC2、または VPC3 のインスタンス ID を選択して、そのルートを表示します。
図 1. VPC1 のルート

図 2. VPC2 のルート

図 3. VPC3 のルート

ルートテーブルタブで、トランジットルーターのシステムルートテーブルが VPC1、VPC2、および VPC3 から学習したルートを確認できます。
トランジットルーター詳細ページで、ルートテーブルをクリックします。
ルートテーブルタブで、ルートテーブル内のルートエントリを表示します。
図 4. システムルートテーブル

図 5. カスタムルートテーブル

ステップ 5:接続性の検証
前述の手順を完了後、VPC1、VPC2、および VPC3 間の接続性をテストします。
開始前に、VPC1、VPC2、および VPC3 の ECS インスタンスに適用されているセキュリティグループルールを確認してください。インスタンス間の通信を許可するルールになっていることを確認します。詳細については、「セキュリティグループルールの表示」をご参照ください。
VPC1 の ECS インスタンスにログインします。詳細については、「ECS インスタンスへの接続」をご参照ください。
ping コマンドを実行して、VPC3 の ECS インスタンスへの接続性をテストします。
正常な応答が返された場合、VPC1 と VPC3 が通信できることを確認できます。

VPC2 の ECS インスタンスにログインします。ping コマンドを実行して、VPC3 の ECS インスタンスへの接続性をテストします。
正常な応答が返された場合、VPC2 と VPC3 が通信できることを確認できます。

VPC1 の ECS インスタンスにログインします。ping コマンドを実行して、VPC2 の ECS インスタンスへの接続性をテストします。
応答がない場合、VPC1 と VPC2 が通信できないことを確認できます。

Terraform
Terraform を使用して、このシナリオの環境を構築できます。Terraform のインストールおよび構成方法の詳細については、Terraform のインストールをご参照ください。
次の手順は、Linux ホスト上で Terraform v1.9.8 を実行する方法を示しています。開始前に、認証が完了していることを確認してください。
このチュートリアルで作成されるリソースには料金が発生する可能性があります。予期しない課金を回避するため、テスト完了後はリソースをリリースしてください。
ステップ 1:リソースの作成
次の Terraform コードは、このシナリオ用です:
variable "pname" {
description = "The prefix name for the resources"
type = string
default = "tf-CenSharedVpc"
}
variable "default_region" {
description = "Default region"
type = string
default = "cn-hangzhou"
}
variable "az_list" {
description = "List of availability zones to use"
type = list(string)
default = ["cn-hangzhou-j", "cn-hangzhou-k"]
}
variable "vpc_cidr_list" {
description = "List of VPC CIDR blocks"
type = list(string)
default = ["192.168.0.0/16", "172.16.0.0/16", "10.0.0.0/16"]
}
variable "vsw_cidr_list" {
description = "List of vSwitch CIDR blocks"
type = list(string)
default = [
"192.168.0.0/24", "192.168.1.0/24",
"172.16.0.0/24", "172.16.1.0/24",
"10.0.0.0/24", "10.0.1.0/24"
]
}
variable "ecs_ip_list" {
description = "List of ECS IP addresses"
type = list(string)
default = ["192.168.0.224", "172.16.0.222", "10.0.0.112"]
}
provider "alicloud" {
region = var.default_region
}
# Create 3 VPCs, 6 vSwitches, and 3 ECS instances
resource "alicloud_vpc" "vpc" {
count = length(var.vpc_cidr_list)
vpc_name = "${var.pname}-vpc${count.index + 1}"
cidr_block = var.vpc_cidr_list[count.index]
}
resource "alicloud_vswitch" "vsw" {
count = length(var.vsw_cidr_list)
vpc_id = alicloud_vpc.vpc[floor(count.index / length(var.az_list))].id
cidr_block = var.vsw_cidr_list[count.index]
zone_id = var.az_list[count.index % length(var.az_list)]
vswitch_name = "${var.pname}-vsw${count.index + 1}"
}
resource "alicloud_instance" "ecs" {
count = length(var.vpc_cidr_list)
instance_name = "${var.pname}-ecs${count.index + 1}"
instance_type = "ecs.e-c1m1.large"
security_groups = [alicloud_security_group.sg[count.index].id]
vswitch_id = alicloud_vswitch.vsw[count.index * length(var.az_list)].id
image_id = "aliyun_3_x64_20G_qboot_alibase_20230727.vhd"
system_disk_category = "cloud_essd"
private_ip = var.ecs_ip_list[count.index]
instance_charge_type = "PostPaid"
}
# Create 3 security groups
resource "alicloud_security_group" "sg" {
count = length(var.vpc_cidr_list)
name = "${var.pname}-${count.index + 1}"
vpc_id = alicloud_vpc.vpc[count.index].id
}
resource "alicloud_security_group_rule" "allow_inbound_ssh" {
count = length(var.vpc_cidr_list)
type = "ingress"
ip_protocol = "tcp"
nic_type = "intranet"
policy = "accept"
port_range = "22/22"
priority = 1
security_group_id = alicloud_security_group.sg[count.index].id
cidr_ip = "0.0.0.0/0"
}
resource "alicloud_security_group_rule" "allow_inbound_icmp" {
count = length(var.vpc_cidr_list)
type = "ingress"
ip_protocol = "icmp"
nic_type = "intranet"
policy = "accept"
port_range = "-1/-1"
priority = 1
security_group_id = alicloud_security_group.sg[count.index].id
cidr_ip = "0.0.0.0/0"
}
# Create a CEN instance and a transit router
resource "alicloud_cen_instance" "cen" {
cen_instance_name = "${var.pname}-cen1"
}
resource "alicloud_cen_transit_router" "tr" {
transit_router_name = "${var.pname}-tr"
cen_id = alicloud_cen_instance.cen.id
}
data "alicloud_cen_transit_router_route_tables" "tr" { # Get the system route table of the transit router
transit_router_id = alicloud_cen_transit_router.tr.transit_router_id
transit_router_route_table_type = "System"
}
# Create 3 VPC attachments
resource "alicloud_cen_transit_router_vpc_attachment" "attach" {
count = length(var.vpc_cidr_list)
cen_id = alicloud_cen_instance.cen.id
transit_router_id = alicloud_cen_transit_router.tr.transit_router_id
vpc_id = alicloud_vpc.vpc[count.index].id
zone_mappings {
zone_id = var.az_list[0]
vswitch_id = alicloud_vswitch.vsw[count.index * length(var.az_list)].id
}
zone_mappings {
zone_id = var.az_list[1]
vswitch_id = alicloud_vswitch.vsw[count.index * length(var.az_list) + 1].id
}
transit_router_vpc_attachment_name = "attach${count.index + 1}"
}
# Create 3 route propagations
resource "alicloud_cen_transit_router_route_table_propagation" "propa" {
count = length(var.vpc_cidr_list)
transit_router_route_table_id = data.alicloud_cen_transit_router_route_tables.tr.tables[0].id
transit_router_attachment_id = alicloud_cen_transit_router_vpc_attachment.attach[count.index].transit_router_attachment_id
}
# Create 1 custom route table
resource "alicloud_cen_transit_router_route_table" "custom_table" { # Create a custom route table for the transit router
transit_router_id = alicloud_cen_transit_router.tr.transit_router_id
transit_router_route_table_name = "custom_table"
}
resource "alicloud_cen_transit_router_route_entry" "tr_entry" {
transit_router_route_table_id = alicloud_cen_transit_router_route_table.custom_table.transit_router_route_table_id
transit_router_route_entry_destination_cidr_block = "10.0.0.0/16"
transit_router_route_entry_next_hop_type = "Attachment"
transit_router_route_entry_name = "entry1_name"
transit_router_route_entry_description = "entry1_desc"
transit_router_route_entry_next_hop_id = alicloud_cen_transit_router_vpc_attachment.attach[2].transit_router_attachment_id
}
# Associate attachments 1 and 2 with the custom route table
resource "alicloud_cen_transit_router_route_table_association" "ass1" {
transit_router_route_table_id = alicloud_cen_transit_router_route_table.custom_table.transit_router_route_table_id
transit_router_attachment_id = alicloud_cen_transit_router_vpc_attachment.attach[0].transit_router_attachment_id
}
resource "alicloud_cen_transit_router_route_table_association" "ass2" {
transit_router_route_table_id = alicloud_cen_transit_router_route_table.custom_table.transit_router_route_table_id
transit_router_attachment_id = alicloud_cen_transit_router_vpc_attachment.attach[1].transit_router_attachment_id
}
# Associate attachment 3 with the system route table
resource "alicloud_cen_transit_router_route_table_association" "ass3" {
transit_router_route_table_id = data.alicloud_cen_transit_router_route_tables.tr.tables[0].id
transit_router_attachment_id = alicloud_cen_transit_router_vpc_attachment.attach[2].transit_router_attachment_id
}
# Create VPC route entries
resource "alicloud_route_entry" "vpc_entry" {
count = length(var.vpc_cidr_list)
route_table_id = alicloud_vpc.vpc[count.index].route_table_id
destination_cidrblock = "0.0.0.0/0"
nexthop_type = "Attachment"
nexthop_id = alicloud_cen_transit_router_vpc_attachment.attach[count.index].transit_router_attachment_id
}
output "ecs1_login_address" {
value = "https://ecs-workbench.aliyun.com/?from=EcsConsole&instanceType=ecs®ionId=${var.default_region}&instanceId=${alicloud_instance.ecs[0].id}"
}
output "ecs2_login_address" {
value = "https://ecs-workbench.aliyun.com/?from=EcsConsole&instanceType=ecs®ionId=${var.default_region}&instanceId=${alicloud_instance.ecs[1].id}"
}
output "ecs3_login_address" {
value = "https://ecs-workbench.aliyun.com/?from=EcsConsole&instanceType=ecs®ionId=${var.default_region}&instanceId=${alicloud_instance.ecs[2].id}"
}ステップ 2:接続性の検証
VPC1、VPC2、および VPC3 間の接続性をテストするには、次の手順を実行します。
VPC1 の ECS1 インスタンス(インスタンス名:
tf-CenSharedVpc-ecs1)にログインします。Terraform の出力で ecs1_login_address を見つけ、このアドレスをブラウザにコピーしてインスタンスにアクセスします。ログイン時に、認証方法として一時的な SSH キーによる認証を選択します。

ping コマンドを実行して、VPC3 の ECS3 インスタンスへの接続性をテストします。
ping 10.0.0.112正常な応答が返された場合、VPC1 と VPC3 が通信できることを確認できます。

VPC2 の ECS2 インスタンス(インスタンス名:
tf-CenSharedVpc-ecs2)にログインします。ping コマンドを実行して、VPC3 の ECS3 インスタンスへの接続性をテストします。ping 10.0.0.112正常な応答が返された場合、VPC2 と VPC3 が通信できることを確認できます。

VPC1 の ECS1 インスタンス(インスタンス名:
tf-CenSharedVpc-ecs1)にログインします。ping コマンドを実行して、VPC2 の ECS2 インスタンスへの接続性をテストします。ping 172.16.0.222応答がない場合、VPC1 と VPC2 が通信できないことを確認できます。

ステップ 3:リソースのリリース
テスト完了後、次のコマンドを実行してリソースをリリースし、不要な課金を防止します。
terraform destroy --auto-approve