すべてのプロダクト
Search
ドキュメントセンター

Cloud Enterprise Network:隔離された VPC からの共有サービスへのアクセス

最終更新日:Apr 01, 2026

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 インスタンスを作成する必要があります。

  1. CEN コンソールにログインします。

  2. インスタンスページで、CEN インスタンスの作成をクリックします。

  3. CEN インスタンスの作成ダイアログボックスで、CEN インスタンスを構成し、OK をクリックします。

    • 名前:CEN インスタンスの名前を入力します。

    • 説明:CEN インスタンスの説明を入力します。

ステップ 2:VPC アタッチメントの作成

  1. インスタンスページで、作成した CEN インスタンスの ID をクリックします。

  2. 基本情報タブで、VPCセクションの添加网络实例アイコンをクリックします。

  3. ピアネットワークインスタンスとの接続ページで、パラメーターを構成し、OK をクリックします。

    • ネットワークタイプVirtual Private Cloud (VPC) がデフォルトで選択されています。

    • リージョン:ネットワークインスタンスがデプロイされているリージョンを選択します。この例では、中国 (杭州) を選択します。

    • トランジットルーター:システムが選択したリージョンにトランジットルーターを自動的に作成します。

    • リソース所有者 UID:ネットワークインスタンスを所有するアカウントのタイプを選択します。この例では、デフォルト値の現在のアカウントを使用します。

    • 課金方法:デフォルト値の従量課金を使用します。

    • アタッチメント名:アタッチメントの名前を入力します。

    • ネットワークインスタンス:接続する VPC の ID を選択します。この例では、VPC3 を選択します。

    • vSwitch:トランジットルーターがサポートするゾーン内の vSwitch を選択します。

      • Enterprise Edition トランジットルーターが単一ゾーンのみをサポートするリージョンにデプロイされている場合、そのゾーン内の vSwitch を選択します。

      • 複数ゾーンをサポートするリージョンにデプロイされている場合、ゾーンディザスタリカバリのために異なるゾーンに少なくとも 2 つの vSwitch を選択します。これにより、VPC とトランジットルーター間のデータ伝送が途切れなく継続されます。

      • データがより短い距離で伝送されるため、レイテンシを低減し、ネットワークパフォーマンスを向上させるために、各ゾーンに vSwitch を選択することを推奨します。

    • 高度な設定:システムはデフォルトで次の 3 つの高度な機能を選択します。この例の VPC3 では、トランジットルーターのデフォルトルートテーブルとの関連付けおよびシステムルートをトランジットルーターのデフォルトルートテーブルに伝播の機能のみを有効化します。

    • VPC3 のアタッチメントを作成後、さらに接続を作成をクリックします。

      ステップ3を繰り返して、VPC1 および VPC2 のアタッチメントを作成します。これらのアタッチメントを作成する際は、システムルートをトランジットルーターのデフォルトルートテーブルに伝播の高度な設定のみを選択します。

    • すべての VPC アタッチメントを作成後、リストに戻るをクリックして、インスタンス詳細ページに戻ります。

    ステップ 3:VPC1 および VPC2 のカスタムルーティングとの関連付け

    1. インスタンス詳細ページで、作成したトランジットルーターの ID をクリックします。

    2. トランジットルーター詳細ページで、ルートテーブルタブをクリックします。

    3. 左側のペインで、ルートテーブルの作成をクリックします。

    4. ルートテーブルの作成ダイアログボックスで、パラメーターを構成し、OK をクリックします。

      • トランジットルーター:システムが現在のリージョンのトランジットルーターを自動的に選択します。

      • ルートテーブル名:ルートテーブルの名前を入力します。

      • ルートテーブルの説明:ルートテーブルの説明を入力します。

      • マルチリージョン ECMP ルーティング:デフォルト設定を維持します。

    5. ルートテーブルの詳細を表示をクリックして、ルートテーブルタブに戻ります。

    6. ルートテーブルタブで、直前に作成したカスタムルートテーブルを選択します。ルートテーブルの関連付けタブをクリックし、関連付けの作成をクリックします。

    7. 関連付けの追加ダイアログボックスで、カスタムルートテーブルに関連付ける VPC アタッチメントを選択し、OK をクリックします。

      この例では、VPC1 および VPC2 の両方をカスタムルートテーブルに関連付けます。関連付けを作成後、VPC1 および VPC2 はこのルートテーブルを使用してトラフィックを転送します。

    8. カスタムルートテーブルの詳細ページで、ルートエントリタブをクリックし、ルートエントリの作成をクリックします。

    9. ルートエントリの追加ダイアログボックスで、パラメーターを構成し、OK をクリックします。

      • ルートテーブル:システムが現在のカスタムルートテーブルを自動的に選択します。

      • トランジットルーター:システムが現在のリージョンのトランジットルーターを自動的に選択します。

      • ルートエントリ名:ルートエントリの名前を入力します。

      • 宛先 CIDR ブロック:ルートの宛先 CIDR ブロックを入力します。この例では、10.0.0.0/16 を入力します。

      • ブラックホールルート:このオプションを有効化すると、このルート宛てのすべてのトラフィックが破棄されます。この例では、いいえ を選択します。

      • ネクストホップ:ルートのネクストホップを選択します。この例では、VPC3 アタッチメントを選択します。

      • ルートエントリの説明:ルートエントリの説明を入力します。

    ステップ 4:VPC へのデフォルトルートの追加

    VPC1、VPC2、および VPC3 のルートテーブルに、VPC コンソールで宛先 CIDR ブロックが 0.0.0.0/0 でネクストホップがトランジットルーターアタッチメントを指すルートエントリを追加します。

    1. VPC コンソールにログインします。

    2. 左側のナビゲーションウィンドウで、ルートテーブルをクリックします。

    3. 上部のナビゲーションバーで、ルートテーブルが配置されているリージョンを選択します。

    4. ルートテーブルページで、対象のルートテーブルの ID をクリックします。

      この例では、VPC3 のルートテーブルを選択します。

    5. ルートテーブル詳細ページで、ルートエントリタブのカスタムサブタブをクリックします。その後、ルートエントリの追加をクリックします。

    6. ルートエントリの追加パネルで、ルートエントリを構成し、OK をクリックします。

      • 名前:ルートエントリの名前を入力します。

      • 宛先 CIDR ブロック:宛先 CIDR ブロックを入力します。この例では、0.0.0.0/0 を入力します。

      • ネクストホップタイプ:ネクストホップのタイプを選択します。この例では、トランジットルーター を選択します。

      • トランジットルーター:ネットワークインスタンスアタッチメントを選択します。この例では、VPC3 アタッチメントを選択します。

      パラメーターの詳細については、「カスタムルートテーブルを使用したネットワークトラフィックの管理」をご参照ください。

    7. ステップ 4 から ステップ 6 を繰り返して、VPC1 および VPC2 に対して宛先が 0.0.0.0/0 でネクストホップがトランジットルーターアタッチメントを指すデフォルトルートを追加します。

      構成を完了後、CEN コンソールのトランジットルーター詳細ページで、VPC およびトランジットルーターのルートテーブルのルーティング情報を確認できます。

      1. トランジットルーター詳細ページで、ネットワークラウトをクリックして、VPC1、VPC2、および VPC3 のルートを表示します。

        1. トランジットルーター詳細ページで、ネットワークラウトをクリックします。

        2. ネットワークインスタンスドロップダウンリストから、VPC1、VPC2、または VPC3 のインスタンス ID を選択して、そのルートを表示します。

          図 1. VPC1 のルート

          image

          図 2. VPC2 のルート

          image

          図 3. VPC3 のルート

          image

      2. ルートテーブルタブで、トランジットルーターのシステムルートテーブルが VPC1、VPC2、および VPC3 から学習したルートを確認できます。

        1. トランジットルーター詳細ページで、ルートテーブルをクリックします。

        2. ルートテーブルタブで、ルートテーブル内のルートエントリを表示します。

          図 4. システムルートテーブル

          image

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

          image

    ステップ 5:接続性の検証

    前述の手順を完了後、VPC1、VPC2、および VPC3 間の接続性をテストします。

    説明

    開始前に、VPC1、VPC2、および VPC3 の ECS インスタンスに適用されているセキュリティグループルールを確認してください。インスタンス間の通信を許可するルールになっていることを確認します。詳細については、「セキュリティグループルールの表示」をご参照ください。

    1. VPC1 の ECS インスタンスにログインします。詳細については、「ECS インスタンスへの接続」をご参照ください。

    2. ping コマンドを実行して、VPC3 の ECS インスタンスへの接続性をテストします。

      正常な応答が返された場合、VPC1 と VPC3 が通信できることを確認できます。共享VPC-VPC1-VPC3

    3. VPC2 の ECS インスタンスにログインします。ping コマンドを実行して、VPC3 の ECS インスタンスへの接続性をテストします。

      正常な応答が返された場合、VPC2 と VPC3 が通信できることを確認できます。共享VPC-VPC2-VPC3

    4. VPC1 の ECS インスタンスにログインします。ping コマンドを実行して、VPC2 の ECS インスタンスへの接続性をテストします。

      応答がない場合、VPC1 と VPC2 が通信できないことを確認できます。共享VPC-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&regionId=${var.default_region}&instanceId=${alicloud_instance.ecs[0].id}"
    }
    
    output "ecs2_login_address" {
      value = "https://ecs-workbench.aliyun.com/?from=EcsConsole&instanceType=ecs&regionId=${var.default_region}&instanceId=${alicloud_instance.ecs[1].id}"
    }
    
    output "ecs3_login_address" {
      value = "https://ecs-workbench.aliyun.com/?from=EcsConsole&instanceType=ecs&regionId=${var.default_region}&instanceId=${alicloud_instance.ecs[2].id}"
    }

    ステップ 2:接続性の検証

    VPC1、VPC2、および VPC3 間の接続性をテストするには、次の手順を実行します。

    1. VPC1 の ECS1 インスタンス(インスタンス名:tf-CenSharedVpc-ecs1)にログインします。

      Terraform の出力で ecs1_login_address を見つけ、このアドレスをブラウザにコピーしてインスタンスにアクセスします。ログイン時に、認証方法として一時的な SSH キーによる認証を選択します。

      image

    2. ping コマンドを実行して、VPC3 の ECS3 インスタンスへの接続性をテストします。

      ping 10.0.0.112

      正常な応答が返された場合、VPC1 と VPC3 が通信できることを確認できます。共享VPC-VPC1-VPC3

    3. VPC2 の ECS2 インスタンス(インスタンス名:tf-CenSharedVpc-ecs2)にログインします。ping コマンドを実行して、VPC3 の ECS3 インスタンスへの接続性をテストします。

      ping 10.0.0.112

      正常な応答が返された場合、VPC2 と VPC3 が通信できることを確認できます。共享VPC-VPC2-VPC3

    4. VPC1 の ECS1 インスタンス(インスタンス名:tf-CenSharedVpc-ecs1)にログインします。ping コマンドを実行して、VPC2 の ECS2 インスタンスへの接続性をテストします。

      ping 172.16.0.222

      応答がない場合、VPC1 と VPC2 が通信できないことを確認できます。共享VPC-VPC1-VPC2

    ステップ 3:リソースのリリース

    テスト完了後、次のコマンドを実行してリソースをリリースし、不要な課金を防止します。

    terraform destroy --auto-approve