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

Cloud Enterprise Network:VPC の分離と共有サービスへのアクセス

最終更新日:Sep 02, 2026

Cloud Enterprise Network (CEN) は、リージョン内での柔軟な接続、分離、およびトラフィックリダイレクションポリシーをサポートします。このチュートリアルでは、VPC 同士を分離したまま、共有サービス VPC にアクセスできるようにする方法について説明します。

背景情報

ある企業が、中国 (杭州) リージョンに 3 つの Virtual Private Cloud (VPC) をデプロイしています。VPC3 は共有サービスをホストしています。目標は、VPC1 と VPC2 を相互に分離したまま、VPC1 と VPC2 が VPC3 にアクセスできるようにすることです。

image

ネットワーク計画

CEN のカスタムルートテーブル、ルートテーブルの関連付け、およびルート学習を使用して、ネットワークセグメントとルーティングを次のように設定します。

image

この例では、3 つの VPC とトランジットルーターはすべて同じ Alibaba Cloud アカウントに属しています。クロスアカウント構成については、「クロスアカウント VPC ルート分離」セクションをご参照ください。

  • VPC3 をトランジットルーターに接続するときは、トランジットルーターのシステムルートテーブルに自動的に関連付ける と システムルートをトランジットルーターのシステムルートテーブルに自動伝播する の高度な設定を有効にします。

    これにより、トランジットルーターのシステムルートテーブルは VPC3 のルートを自動的に学習し、VPC3 はこのシステムルートテーブルを介してトラフィックを転送します。

  • VPC1 と VPC2 をトランジットルーターに接続するときは、システムルートをトランジットルーターのシステムルートテーブルに自動伝播する の高度な設定のみを有効にします。次に、VPC1 と VPC2 をトランジットルーター上のカスタムルートテーブルに関連付け、VPC3 を指すカスタムルートエントリを追加します。

    トランジットルーターのシステムルートテーブルは、VPC1 と VPC2 からルートを学習します。VPC1 と VPC2 はカスタムルートテーブルを介して VPC3 にトラフィックを転送するため、VPC1 と VPC2 は相互に通信できなくなります。

  • VPC1、VPC2、および VPC3 のルートテーブルに 0.0.0.0/0 へのルートを追加します。このルートのネクストホップをトランジットルーターに設定します。

  • 次の表に、VPC のネットワーク計画の詳細を示します。

    重要

    ネットワークを計画する際は、VPC の CIDR ブロックが重複しないようにしてください。

    VPC

    vSwitch

    vSwitch ゾーン

    CIDR ブロック

    Elastic Compute Service (ECS) インスタンス

    VPC1

    プライマリ CIDR ブロック: 192.168.0.0/16

    vSwitch1

    ゾーン A

    192.168.0.0/24

    ECS1 インスタンスのアドレス:

    192.168.0.124

    vSwitch2

    ゾーン B

    192.168.1.0/24

    VPC2

    プライマリ CIDR ブロック: 172.16.0.0/16

    vSwitch3

    ゾーン A

    172.16.0.0/24

    ECS2 インスタンスのアドレス:

    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 インスタンスのアドレス:

    10.0.0.112

    vSwitch6

    ゾーン B

    10.0.1.0/24

操作手順

このチュートリアルは、Alibaba Cloud コンソールまたは Terraform を使用して完了できます。

コンソール

ステップ 1: CEN インスタンスの作成

ネットワークインスタンスを接続する前に CEN インスタンスを作成します。

  1. CEN コンソールにログインします。
  2. インスタンス ページで、CEN インスタンスの作成 をクリックします。

  3. CEN インスタンスの作成 ダイアログボックスで、次のパラメーターを設定し、OK をクリックします。

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

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

ステップ 2: VPC 接続の作成

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

  2. 基本設定 タブの VPC セクションで、ネットワークインスタンスの追加 アイコンをクリックします。

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

    • [ネットワークタイプ]:デフォルトで [仮想プライベートクラウド (VPC)] が選択されています。

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

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

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

    • 課金方法:デフォルトは従量課金です。

    • [接続名]:接続の名前を入力します。

    • [ネットワーク]:接続する VPC の ID を選択します。この例では、VPC3 が選択されています。

    • [vSwitch]:トランジットルーターでサポートされているゾーンの vSwitch インスタンスを選択します。

      単一ゾーンリージョンの場合は、1 つの vSwitch を選択します。複数ゾーンリージョンの場合は、異なるゾーンにある少なくとも 2 つの vSwitch を選択します。レイテンシーを削減するには、ゾーンごとに 1 つの vSwitch を選択します。

    • [詳細設定]:この例では、VPC3 については トランジットルーターのシステムルートテーブルに自動的に関連付ける と システムルートをトランジットルーターのシステムルートテーブルに自動伝播する のみを有効にします。

      デフォルトでは、[Associate with Default Route Table of Transit Router] (VPC 接続をトランジットルーターのデフォルトルートテーブルに関連付ける)、[Propagate System Routes to Transit Router Route Table] (VPC のシステムルートをトランジットルーターにアドバタイズし、他のアタッチされたネットワークインスタンスとの通信を可能にする)、および [Automatically create routes pointing to the Transit Router in all route tables of this VPC] (VPC のすべてのルートテーブルに 3 つのルート (10.0.0.0/8、172.16.0.0/12, 192.168.0.0/16) を追加し、ネクストホップはトランジットルーターを指す。デフォルトでは、トランジットルーターは VPC にルートをアドバタイズしません) の 3 つのオプションが有効になっています。ルーティングをカスタマイズするには、これらのチェックボックスをオフにし、ルートの関連付けと伝播を手動で設定します。詳細については、「ルートの管理」をご参照ください。

      説明

      IPv6 トラフィックの場合、VPC 接続を作成した後、ルート同期を有効にするか、VPC 内に VPC 接続を指す IPv6 ルートエントリを手動で追加します。

  4. VPC3 の接続が作成されたら、接続をさらに作成 をクリックします。

    ステップ 3 を繰り返して、VPC1 と VPC2 の接続を作成します。VPC1 と VPC2 の接続を作成するときは、システムルートをトランジットルーターのシステムルートテーブルに自動伝播する 詳細設定のみを選択します。

  5. VPC 接続が作成されたら、リストに戻る をクリックするとインスタンス詳細ページに戻ります。

ステップ 3: VPC とカスタムルートテーブルの関連付け

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

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

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

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

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

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

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

    • [マルチリージョン等価ルート]:デフォルト値のままにします。

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

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

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

    関連付け後、VPC1 と VPC2 はこのルートテーブルを参照してトラフィックを転送します。

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

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

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

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

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

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

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

    • [ネクストホップ]:ルートのネクストホップを選択します。この例では、VPC3 接続を選択します。

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

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

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

  1. VPC コンソールにログインします。
  2. 左側のナビゲーションペインで、ルートテーブル をクリックします。

  3. 上部メニューで、ルートテーブルが存在するリージョンを選択します。

  4. ルートテーブル ページで、目的のルートテーブルを探し、その ID をクリックします。

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

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

  6. ルートエントリの追加 パネルで、以下のパラメーターを設定し、OK をクリックします。

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

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

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

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

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

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

    CEN コンソールのトランジットルーター詳細ページで、VPC1、VPC2、VPC3、およびトランジットルーターのルートテーブルのルーティング情報を表示できます。

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

      1. トランジットルーターの詳細ページで、ルーティング情報 をクリックします。

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

        図 1. VPC1 のルート

        VPC1 のルート情報:トランジットルーターインスタンスの [Route Information] タブで、対応する VPC ネットワークインスタンスを選択します。ルートエントリには以下が含まれます。

        • 宛先 CIDR ブロック 0.0.0.0/0:カスタムルート、アドバタイズされません。ネクストホップはトランジットルーター接続です。

        • 宛先 CIDR ブロック 100.64.0.0/10:システムルート、アドバタイズされません。

        • 宛先 CIDR ブロック 192.168.0.0/24:システムルート、アドバタイズされます。

        • 宛先 CIDR ブロック 192.168.1.0/24:システムルート、アドバタイズされます。

        図 2. VPC2 のルート

        VPC2 のルート情報には、次の 4 つのルートエントリが含まれています。

        • 宛先 CIDR ブロック 0.0.0.0/0:カスタムルート、アドバタイズされません。ネクストホップはトランジットルーター接続です。

        • 宛先 CIDR ブロック 100.64.0.0/10:システムルート、アドバタイズされません。

        • 宛先 CIDR ブロック 172.16.0.0/24:システムルート、アドバタイズされます。

        • 宛先 CIDR ブロック 172.16.1.0/24:システムルート、アドバタイズされます。

        図 3. VPC3 のルート

        トランジットルーターの詳細ページで、[Route Information] タブをクリックし、VPC ネットワークインスタンスと対応するルートテーブルを選択して、ルートエントリを表示します。

        • 0.0.0.0/0:カスタムルート、アドバタイズされません。ネクストホップはトランジットルーター接続 (tr-attach) です。

        • 10.0.0.0/24:システムルート、アドバタイズされます。

        • 10.0.1.0/24:システムルート、アドバタイズされます。

        • 100.64.0.0/10:システムルート、アドバタイズされません。

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

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

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

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

        システムルートテーブルのルートエントリ詳細 (タイプ:システム):すべてのルートエントリは自動学習タイプで、次の宛先 CIDR ブロックとネクストホップ接続インスタンスが含まれます。

        • 10.0.0.0/24 および 10.0.1.0/24:ネクストホップは attach3 (VPC3 に対応) です。

        • 172.16.0.0/24 および 172.16.1.0/24:ネクストホップは attach2 (VPC2 に対応) です。

        • 192.168.0.0/24 および 192.168.1.0/24:ネクストホップは attach1 (VPC1 に対応) です。

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

        トランジットルーターのカスタムルートテーブルの詳細ページには、ルートテーブルのタイプが [Custom] で、ステータスが利用可能であることが表示されます。ルートエントリリストには 1 つのスタティックルートが含まれています。宛先 CIDR ブロックは 10.0.0.0/16 で、ネクストホップは VPC3 のネットワークインスタンス接続を指します。

ステップ 5: ネットワーク接続性のテスト

VPC1、VPC2、および VPC3 間の接続性をテストします。

説明

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

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

  2. ping コマンドを実行して、VPC3 内の ECS インスタンスの IP アドレスに ping を送信し、VPC1 と VPC3 間の接続性をテストします。

    出力から、VPC1 と VPC3 が通信できることがわかります。

    [root@iZrxxx3iiZ ~]# ping 10.0.0.112
    PING 10.0.0.112 (10.0.0.112) 56(84) bytes of data.
    64 bytes from 10.0.0.112: icmp_seq=1 ttl=64 time=0.835 ms
    64 bytes from 10.0.0.112: icmp_seq=2 ttl=64 time=0.582 ms
    64 bytes from 10.0.0.112: icmp_seq=3 ttl=64 time=0.587 ms
    64 bytes from 10.0.0.112: icmp_seq=4 ttl=64 time=0.584 ms
    ^C
    --- 10.0.0.112 ping statistics ---
    4 packets transmitted, 4 received, 0% packet loss, time 3112ms
    rtt min/avg/max/mdev = 0.582/0.647/0.835/0.108 ms
    [root@iZrj9fxxxmr3iiZ ~]#
  3. VPC2 の ECS インスタンスにログインし、ping コマンドを使用して VPC3 の ECS インスタンスの IP アドレスに ping を実行し、VPC2 と VPC3 間の接続性をテストします。

    出力から、VPC2 と VPC3 が通信できることがわかります。

    [root@iZrxxx a81Z ~]# ping 10.0.0.112
    PING 10.0.0.112 (10.0.0.112) 56(84) bytes of data.
    64 bytes from 10.0.0.112: icmp_seq=1 ttl=64 time=1.17 ms
    64 bytes from 10.0.0.112: icmp_seq=2 ttl=64 time=0.931 ms
    64 bytes from 10.0.0.112: icmp_seq=3 ttl=64 time=0.923 ms
    64 bytes from 10.0.0.112: icmp_seq=4 ttl=64 time=0.938 ms
    ^C
    --- 10.0.0.112 ping statistics ---
    4 packets transmitted, 4 received, 0% packet loss, time 3035ms
    rtt min/avg/max/mdev = 0.923/0.992/1.178/0.111 ms
    [root@iZrj906fxxx LZ ~]#
  4. VPC1 内の ECS インスタンスにログインし、ping コマンドを使用して VPC2 内の ECS インスタンスの IP アドレスに ping を実行し、VPC1 と VPC2 間の接続性をテストします。

    出力から、VPC1 と VPC2 が通信できないことがわかります。

    [root@iZrjxxx r3iiZ ~]# ping 172.16.0.222
    PING 172.16.0.222 (172.16.0.222) 56(84) bytes of data.
    ^Z
    [5]+  Stopped                 ping 172.16.0.222
    [root@iZrj9f7xxx3iiZ ~]#

クロスアカウント VPC ルート分離

このチュートリアルで説明されているルーティングと分離のメカニズムは、クロスアカウント構成にも同様に適用されます。分離は、VPC1 と VPC2 のルート学習 (システムルートをトランジットルーターのシステムルートテーブルに自動伝播する) のみを有効にし、それらをカスタムルートテーブルに関連付け、そのルートテーブルに VPC3 へのカスタムルートを追加することで実現します。このメカニズムは、VPC がどの Alibaba Cloud アカウントに属しているかには依存しません。

前提条件:クロスアカウントの VPC 接続を作成する前に、VPC を所有するアカウントは、トランジットルーターを所有するアカウントに権限を付与する必要があります。手順については、「ネットワークインスタンスのクロスアカウント権限付与」をご参照ください。

設定の違い:[ステップ 2: VPC 接続の作成] で、リソース所有者 ID フィールドで 現在のアカウント の代わりに [Another Account] を選択し、VPC を所有する Alibaba Cloud アカウントのプライマリアカウント ID を入力します。他のすべての設定項目は、同一アカウントのシナリオと同じです。パラメーターの詳細については、「VPC 接続の作成」をご参照ください。

操作の所有権:[ステップ 1] から [ステップ 3] (CEN インスタンス、トランジットルーター、VPC 接続、およびそのルートエントリを含むカスタムルートテーブルの作成) はすべて、トランジットルーターを所有するアカウントで実行します。[ステップ 4: 各 VPC へのデフォルトルートの追加] は、各 VPC の所有アカウントが、そのアカウント自身の VPC コンソールで実行する必要があります。

ルートマップを使用したクロスアカウント VPC 分離

クロスアカウント VPC が CEN に接続されると、デフォルトでトランジットルーター上の他のすべての VPC インスタンスに完全に接続されます。クロスアカウント VPC を特定の VPC インスタンスから選択的に分離するには、このトピックで前述したカスタムルートテーブルとルートテーブルの関連付けの方法を使用する代わりに、トランジットルーターのルートテーブルにルートマップを設定します。このメカニズムは、「クロスアカウント VPC ルート分離」で説明されているカスタムルートテーブルベースの分離とは独立しています。VPC アタッチメントが使用するルートテーブルを変更するのではなく、コントロールプレーンでルートアドバタイズをフィルタリングすることで分離を実現します。

仕組み:ルートマップは、トランジットルーターが特定の VPC アタッチメントにアドバタイズするルートを制御します。2 つの VPC アタッチメント間のトラフィックに一致する Deny ルートマップを作成すると、基盤となるルートテーブルが変更されていなくても、トランジットルーターは対応するルートのアドバタイズを停止するため、2 つの VPC インスタンスは相互に到達できなくなります。

開始する前に:ルートマップは、ルートマップが作成された後に発生するルートアドバタイズに対してのみ有効になります。2 つの VPC インスタンス間の通信を可能にするルートエントリがルートテーブルにすでに存在する場合は、まずそのルートエントリを削除します。そうしないと、既存のルートが引き続き機能し、分離は有効になりません。

Deny ルートマップを設定するには:

  1. トランジットルーターのルートテーブルに、次の設定でルートマップを作成します。

    • アクション:Deny

    • 優先度:20。値が小さいほど優先度が高くなります。

    • 方向:[Export from Regional Gateway] (ルートマップは、リージョンからアドバタイズされるルートをフィルタリングします)。

    • ソースインスタンスID:クロスアカウント VPC アタッチメントの ID (例:vpc-xxx)。

    • 宛先インスタンスID:ソース VPC から分離したい VPC アタッチメントの ID (例:vpc-yyy)。

    説明

    コンソールのルートマップ作成ページの [Source Instance IDs] ドロップダウンリストに、VPC 接続がルートテーブルの関連付けによってすでにルートテーブルに関連付けられている場合でも、選択可能なオプションが表示されないことがあります。この場合、代わりに CreateCenRouteMap API を呼び出し、vpc-xxx 形式で VPC インスタンス ID を渡してルートマップを作成します。

  2. ルートマップが有効になったら、送信元 VPC の ECS インスタンスにログインし、ping コマンドを実行して、隔離された VPC の ECS インスタンスへの接続性をテストします。ping コマンドは失敗 (100% のパケットロス) します。これは、ルートマップによる隔離が有効であることを示します。

Terraform

Terraform を使用して、このチュートリアルの環境を構築できます。Terraform のインストールと設定の手順については、Terraform のインストールをご参照ください。

次の手順では、Linux ホストで Terraform v1.9.8 を実行する方法について説明します。開始する前に、認証を設定していることを確認してください。

説明

このチュートリアルのリソースの一部には料金が発生します。予期しない料金を避けるため、不要になったリソースは解放してください。

ステップ 1: リソースの作成

次のコードは、このシナリオのすべてのリソースを定義します。これを新しいディレクトリに .tf ファイルとして保存します。

variable "pname" {
  description = "リソースのプレフィックス名"
  type        = string
  default     = "tf-CenSharedVpc"
}

variable "default_region" {
  description = "デフォルトリージョン"
  type        = string
  default     = "cn-hangzhou"
}

variable "az_list" {
  description = "使用するアベイラビリティゾーンのリスト"
  type        = list(string)
  default     = ["cn-hangzhou-j", "cn-hangzhou-k"]
}

variable "vpc_cidr_list" {
  description = "VPC CIDR ブロックのリスト"
  type        = list(string)
  default     = ["192.168.0.0/16", "172.16.0.0/16", "10.0.0.0/16"]
}

variable "vsw_cidr_list" {
  description = "VSW CIDR ブロックのリスト"
  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 = "ECS IP のリスト"
  type        = list(string)
  default     = ["192.168.0.124", "172.16.0.222", "10.0.0.112"]
}

provider "alicloud" {
  region = var.default_region
}

# --- 3 つの VPC、6 つの vSwitch、3 つの ECS インスタンス
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"
}

# --- 3 つの SG
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"
}

# --- CEN と TR
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" { # TR システムテーブルを取得
  transit_router_id               = alicloud_cen_transit_router.tr.transit_router_id
  transit_router_route_table_type = "System"
}

# 3 つのアタッチメント
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}"
}

# 3 つの伝播
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
}

# 1 つのカスタムテーブル
resource "alicloud_cen_transit_router_route_table" "custom_table" { # TR カスタムテーブルを作成
  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
}

# attach1、2 とカスタムテーブルを関連付け
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
}
# attach3 とシステムテーブルを関連付け
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
}

# VPC エントリ
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          = "TransitRouter"
  nexthop_id            = alicloud_cen_transit_router.tr.transit_router_id
}

output "ecs1_login_address" {
  value = "https://ecs-workbench.alibabacloud.com/?from=EcsConsole&instanceType=ecs&regionId=${var.default_region}&instanceId=${alicloud_instance.ecs[0].id}"
}

output "ecs2_login_address" {
  value = "https://ecs-workbench.alibabacloud.com/?from=EcsConsole&instanceType=ecs&regionId=${var.default_region}&instanceId=${alicloud_instance.ecs[1].id}"
}

output "ecs3_login_address" {
  value = "https://ecs-workbench.alibabacloud.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 のログイン URL を見つけます。ブラウザーで URL を開き、一時的な SSH キーベースの認証を使用します。

    Outputs:
    
    ecs1_login_address = "https://ecs-workbench.alibabacloud.com/?from=EcsConsole&instanceType=ecs&regionId=cn-hangzhou&instanceId=i-bp1g4zxxx"
    ecs2_login_address = "https://ecs-workbench.alibabacloud.com/?from=EcsConsole&instanceType=ecs&regionId=cn-hangzhou&instanceId=i-bp1ct8xxx"
    ecs3_login_address = "https://ecs-workbench.alibabacloud.com/?from=EcsConsole&instanceType=ecs&regionId=cn-hangzhou&instanceId=i-bp1iiwxxx"
  2. ping コマンドを実行し、VPC3 内の ECS3 インスタンスの IP アドレスに ping して、VPC1 と VPC3 間の接続性をテストします。

    ping 10.0.0.112

    出力から、VPC1 と VPC3 が通信できることがわかります。

    [root@iZrxxx3iiZ ~]# ping 10.0.0.112
    PING 10.0.0.112 (10.0.0.112) 56(84) bytes of data.
    64 bytes from 10.0.0.112: icmp_seq=1 ttl=64 time=0.835 ms
    64 bytes from 10.0.0.112: icmp_seq=2 ttl=64 time=0.582 ms
    64 bytes from 10.0.0.112: icmp_seq=3 ttl=64 time=0.587 ms
    64 bytes from 10.0.0.112: icmp_seq=4 ttl=64 time=0.584 ms
    ^C
    --- 10.0.0.112 ping statistics ---
    4 packets transmitted, 4 received, 0% packet loss, time 3112ms
    rtt min/avg/max/mdev = 0.582/0.647/0.835/0.108 ms
    [root@iZrj9fxxxmr3iiZ ~]#
  3. VPC2 の ECS2 インスタンス (tf-CenSharedVpc-ecs2) にログオンし、ping コマンドで VPC3 の ECS3 インスタンスの IP アドレスに ping を実行して、VPC2 と VPC3 間の接続性をテストします。

    ping 10.0.0.112

    出力から、VPC2 と VPC3 が通信できることがわかります。

    [root@iZrxxx a81Z ~]# ping 10.0.0.112
    PING 10.0.0.112 (10.0.0.112) 56(84) bytes of data.
    64 bytes from 10.0.0.112: icmp_seq=1 ttl=64 time=1.17 ms
    64 bytes from 10.0.0.112: icmp_seq=2 ttl=64 time=0.931 ms
    64 bytes from 10.0.0.112: icmp_seq=3 ttl=64 time=0.923 ms
    64 bytes from 10.0.0.112: icmp_seq=4 ttl=64 time=0.938 ms
    ^C
    --- 10.0.0.112 ping statistics ---
    4 packets transmitted, 4 received, 0% packet loss, time 3035ms
    rtt min/avg/max/mdev = 0.923/0.992/1.178/0.111 ms
    [root@iZrj906fxxx LZ ~]#
  4. VPC1 の ECS1 インスタンス (tf-CenSharedVpc-ecs1) にログインします。 ping コマンドを使用して、VPC2 の ECS2 インスタンスの IP アドレスに ping を実行し、VPC1 と VPC2 間の接続をテストします。

    ping 172.16.0.222

    出力から、VPC1 と VPC2 が通信できないことがわかります。

    [root@iZrjxxx r3iiZ ~]# ping 172.16.0.222
    PING 172.16.0.222 (172.16.0.222) 56(84) bytes of data.
    ^Z
    [5]+  Stopped                 ping 172.16.0.222
    [root@iZrj9f7xxx3iiZ ~]#

ステップ 3: リソースのクリーンアップ

確認後、次のコマンドを実行してリソースを解放します。

terraform destroy --auto-approve