13
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS CloudWANでリージョン毎にインターネット出口を設定した際のルーティング挙動を調べてみた

Last updated at Posted at 2025-12-15

はじめに

以前から興味のあったAWS CloudWANについてBlackbelt資料1を見ていた際、
「インターネットの出口は、AWSの各リージョンごとに個別設定する事も可能。」
との文言をみて、どのような仕組みで実現しているのか気になり調査してみた。

AWS CloudWANとは

AWS CloudWANとは、複数の拠点・VPC・データセンターを一元的に接続・管理できるマネージドWANサービスである。
Transit Gatewayではリージョン間をメッシュ型にピアリングしたり複雑なルートテーブルの設定が必要だったりと、管理が困難な大規模マルチリージョンネットワークを簡単に構築・運用することが可能となる。

Cloud-WAN-Figure-1.png
図1:AWS CloudWANコンポーネント図

出典:AWS Cloud WAN の紹介

Cloud WANは主に以下のコンポーネントで構成される。2

  • Global Network:組織全体のネットワークインフラを表す最上位のコンテナ。Cloud WANやTransitGatewayを統合管理する論理的な境界

  • Core Network:AWS管理のマネージドネットワークで、Global Network内でリージョン間の接続を自動的に提供し、アタッチメントの中継ポイントとして機能する

  • Segments: トラフィックを論理的に分離するルーティングドメイン。本番環境や開発環境などの異なるネットワークを同一Core Network内で区別できる

  • Attachments: VPC、VPN、Connect、Transit Gateway Peering など、Cloud WANに接続されるリソースの接続点

  • Core Network Edges: 各AWSリージョンに配置されるCloud WAN接続ポイントで、そのリージョン内のリソースがアタッチされる場所。各リージョン間のルート情報をBGPで広報している

検証構成

インターネット出口に対し、通常デフォルトルート(0.0.0.0/0)を設定してルーティングを
行う。これを1つのセグメントに対してリージョンの数だけ複数設定した場合の挙動を確認してみる。
今回は下図の通り、2リージョンのシンプルな構成で検証を行う。

インターネット出口には本来Network Firewallを設けるべきだが、
今回は構成簡略化のため割愛する。

structure.png
図2:CloudWANネットワーク構成

環境構築

構成図を元に環境を作成する。
以下のCloudFormationテンプレートを①→②→③の順に実行する。

Cloud WANはそこそこ高い課金が発生する(1リージョン:$0.50/h+α)ため、
検証が終わり次第すぐにスタック削除しましょう!
https://aws.amazon.com/jp/cloud-wan/pricing/

<CloudFormationテンプレート>
※折り畳んでいるので、自分の環境で検証されたい方は展開してご使用ください。

①:cloudwan-test.yaml(東京リージョンで実行)
AWSTemplateFormatVersion: '2010-09-09'
Description: 'AWS Cloud WAN with Internet Gateway VPC and Private VPC'

Resources:
  # Global Network
  GlobalNetwork:
    Type: AWS::NetworkManager::GlobalNetwork
    Properties:
      Description: Global Network for Cloud WAN
      Tags:
        - Key: Name
          Value: global-network

  # Core Network
  CoreNetwork:
    Type: AWS::NetworkManager::CoreNetwork
    Properties:
      GlobalNetworkId: !Ref GlobalNetwork
      Description: Core Network
      PolicyDocument:
        {
          'version': '2021.12',
          'core-network-configuration':
            {
              'vpn-ecmp-support': true,
              'dns-support': true,
              'security-group-referencing-support': false,
              'asn-ranges': ['65000-65534'],
              'edge-locations':
                [
                  { 'location': 'ap-northeast-1' },
                  { 'location': 'ap-northeast-3' },
                ],
            },
          'segments':
            [
              {
                'name': 'segment',
                'edge-locations': ['ap-northeast-1', 'ap-northeast-3'],
                'require-attachment-acceptance': false,
              },
            ],
          'attachment-policies':
            [
              {
                'rule-number': 100,
                'description': 'segment',
                'condition-logic': 'or',
                'conditions':
                  [
                    {
                      'type': 'tag-value',
                      'operator': 'equals',
                      'key': 'env',
                      'value': 'segment',
                    },
                  ],
                'action':
                  { 'association-method': 'constant', 'segment': 'segment' },
              },
            ],
        }
      Tags:
        - Key: Name
          Value: core-network

Outputs:
  GlobalNetworkId:
    Description: Global Network ID
    Value: !Ref GlobalNetwork

  CoreNetworkId:
    Description: Core Network ID
    Value: !Ref CoreNetwork

  CoreNetworkArn:
    Description: Core Network ARN
    Value: !GetAtt CoreNetwork.CoreNetworkArn

①の実行完了後、出力された「CoreNetworkId」「CoreNetworkArn」をメモしておく。
※②③のParameterにて設定するため。

②:create-vpc-ec2-tokyo.yaml(東京リージョンで実行)
AWSTemplateFormatVersion: '2010-09-09'
Description: 'AWS Cloud WAN with Internet Gateway VPC and Private VPC'

Parameters:
  LatestAmiId:
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64

  CoreNetworkId:
    Type: String
    Description: CloudWAN Core Network ID (e.g., core-network-01234567890abcdef)
    AllowedPattern: '^core-network-[a-f0-9]{17}$'
    ConstraintDescription: Must be a valid Core Network ID format

  CoreNetworkArn:
    Type: String
    Description: CloudWAN Core Network ARN
    AllowedPattern: '^arn:aws:networkmanager::[0-9]{12}:core-network/core-network-[a-f0-9]{17}$'
    ConstraintDescription: Must be a valid Core Network ARN

Resources:
  # VPC 01 (Internet Gateway VPC @ Tokyo Region)
  VPC01:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsHostnames: true
      EnableDnsSupport: true
      Tags:
        - Key: Name
          Value: vpc-01

  VPC01PublicSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC01
      CidrBlock: 10.0.0.0/24
      AvailabilityZone: 'ap-northeast-1a'
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: vpc-01-public-subnet-01

  VPC01PrivateSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC01
      CidrBlock: 10.0.1.0/24
      AvailabilityZone: 'ap-northeast-1a'
      Tags:
        - Key: Name
          Value: vpc-01-private-subnet-01

  VPC01InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: vpc-01-igw

  VPC01AttachInternetGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref VPC01
      InternetGatewayId: !Ref VPC01InternetGateway

  VPC01EIP:
    Type: AWS::EC2::EIP
    DependsOn: VPC01AttachInternetGateway
    Properties:
      Domain: vpc

  VPC01NATGateway:
    Type: AWS::EC2::NatGateway
    Properties:
      AllocationId: !GetAtt VPC01EIP.AllocationId
      SubnetId: !Ref VPC01PublicSubnet1
      Tags:
        - Key: Name
          Value: vpc-01-nat

  VPC01PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC01
      Tags:
        - Key: Name
          Value: vpc-01-public-rt

  VPC01PublicRoute:
    Type: AWS::EC2::Route
    DependsOn: VPC01AttachInternetGateway
    Properties:
      RouteTableId: !Ref VPC01PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref VPC01InternetGateway

  VPC01PublicRouteCloudWAN:
    Type: AWS::EC2::Route
    DependsOn: VPC01Attachment
    Properties:
      RouteTableId: !Ref VPC01PublicRouteTable
      DestinationCidrBlock: 10.0.0.0/8
      CoreNetworkArn: !Ref CoreNetworkArn

  VPC01PublicSubnet1RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref VPC01PublicSubnet1
      RouteTableId: !Ref VPC01PublicRouteTable

  VPC01PrivateRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC01
      Tags:
        - Key: Name
          Value: vpc-01-private-rt

  VPC01PrivateRoute:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref VPC01PrivateRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      NatGatewayId: !Ref VPC01NATGateway

  VPC01PrivateRouteCloudWAN:
    Type: AWS::EC2::Route
    DependsOn: VPC01Attachment
    Properties:
      RouteTableId: !Ref VPC01PrivateRouteTable
      DestinationCidrBlock: 10.0.0.0/8
      CoreNetworkArn: !Ref CoreNetworkArn

  VPC01PrivateSubnet1RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref VPC01PrivateSubnet1
      RouteTableId: !Ref VPC01PrivateRouteTable

  # VPC 01 Cloud WAN Attachments
  VPC01Attachment:
    Type: AWS::NetworkManager::VpcAttachment
    Properties:
      CoreNetworkId: !Ref CoreNetworkId
      VpcArn: !Sub 'arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${VPC01}'
      SubnetArns:
        - !Sub 'arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:subnet/${VPC01PrivateSubnet1}'
      Tags:
        - Key: Name
          Value: vpc-01-attachment
        - Key: env
          Value: segment

  # VPC 02 (Private VPC)
  VPC02:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.1.0.0/16
      EnableDnsHostnames: true
      EnableDnsSupport: true
      Tags:
        - Key: Name
          Value: vpc-02

  VPC02PrivateSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC02
      CidrBlock: 10.1.0.0/24
      AvailabilityZone: 'ap-northeast-1a'
      Tags:
        - Key: Name
          Value: vpc-02-private-subnet-01

  VPC02PrivateSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC02
      CidrBlock: 10.1.1.0/24
      AvailabilityZone: 'ap-northeast-1a'
      Tags:
        - Key: Name
          Value: vpc-02-private-subnet-02

  VPC02RouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC02
      Tags:
        - Key: Name
          Value: vpc-02-rt

  VPC02RouteCloudWAN:
    Type: AWS::EC2::Route
    DependsOn: VPC02Attachment
    Properties:
      RouteTableId: !Ref VPC02RouteTable
      DestinationCidrBlock: 0.0.0.0/0
      CoreNetworkArn: !Ref CoreNetworkArn

  VPC02Subnet1RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref VPC02PrivateSubnet1
      RouteTableId: !Ref VPC02RouteTable

  VPC02Subnet2RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref VPC02PrivateSubnet2
      RouteTableId: !Ref VPC02RouteTable

  # VPC 02 Cloud WAN Attachments
  VPC02Attachment:
    Type: AWS::NetworkManager::VpcAttachment
    Properties:
      CoreNetworkId: !Ref CoreNetworkId
      VpcArn: !Sub 'arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${VPC02}'
      SubnetArns:
        - !Sub 'arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:subnet/${VPC02PrivateSubnet2}'
      Tags:
        - Key: Name
          Value: vpc-02-attachment
        - Key: env
          Value: segment

  # Security Groups
  VPC02SecurityGroupForEC2:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: 'Security group for VPC02 EC2 instance'
      VpcId: !Ref VPC02
      SecurityGroupEgress:
        - IpProtocol: -1
          CidrIp: 0.0.0.0/0
      Tags:
        - Key: Name
          Value: vpc-02-sg-for-ec2

  VPC02SecurityGroupForSSM:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: 'Security group for SSM Endpoint'
      VpcId: !Ref VPC02
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: !Sub ${VPC02.CidrBlock}
      Tags:
        - Key: Name
          Value: !Sub vpc-02-sg-for-ssm

  # SSM Endpoint
  VPC02SsmEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      ServiceName: !Sub 'com.amazonaws.${AWS::Region}.ssm'
      VpcEndpointType: Interface
      PrivateDnsEnabled: true
      VpcId: !Ref VPC02
      SubnetIds:
        - !Ref VPC02PrivateSubnet1
      SecurityGroupIds:
        - !Ref VPC02SecurityGroupForSSM

  VPC02SsmMessageEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      ServiceName: !Sub 'com.amazonaws.${AWS::Region}.ssmmessages'
      VpcEndpointType: Interface
      PrivateDnsEnabled: true
      VpcId: !Ref VPC02
      SubnetIds:
        - !Ref VPC02PrivateSubnet1
      SecurityGroupIds:
        - !Ref VPC02SecurityGroupForSSM

  # IAM Role for EC2
  EC2Role:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: ec2.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
      Tags:
        - Key: Name
          Value: ec2-ssm-role

  EC2InstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Roles:
        - !Ref EC2Role

  # EC2 Instance in VPC02
  VPC02EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref LatestAmiId
      InstanceType: t3.micro
      IamInstanceProfile: !Ref EC2InstanceProfile
      SubnetId: !Ref VPC02PrivateSubnet1
      PrivateIpAddress: '10.1.0.100'
      SecurityGroupIds:
        - !Ref VPC02SecurityGroupForEC2
      Tags:
        - Key: Name
          Value: vpc-02-ec2

Outputs:
  VPC01Id:
    Description: VPC 01 ID
    Value: !Ref VPC01

  VPC02Id:
    Description: VPC 02 ID
    Value: !Ref VPC02

  VPC02EC2InstanceId:
    Description: VPC02 EC2 Instance ID
    Value: !Ref VPC02EC2Instance
③:create-vpc-ec2-osaka.yaml(大阪リージョンで実行)
AWSTemplateFormatVersion: '2010-09-09'
Description: 'AWS Cloud WAN with Internet Gateway VPC and Private VPC'

Parameters:
  LatestAmiId:
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64

  CoreNetworkId:
    Type: String
    Description: CloudWAN Core Network ID (e.g., core-network-01234567890abcdef)
    AllowedPattern: '^core-network-[a-f0-9]{17}$'
    ConstraintDescription: Must be a valid Core Network ID format

  CoreNetworkArn:
    Type: String
    Description: CloudWAN Core Network ARN
    AllowedPattern: '^arn:aws:networkmanager::[0-9]{12}:core-network/core-network-[a-f0-9]{17}$'
    ConstraintDescription: Must be a valid Core Network ARN

Resources:
  # VPC 03 (Internet Gateway VPC @ Tokyo Region)
  VPC03:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.100.0.0/16
      EnableDnsHostnames: true
      EnableDnsSupport: true
      Tags:
        - Key: Name
          Value: vpc-03

  VPC03PublicSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC03
      CidrBlock: 10.100.0.0/24
      AvailabilityZone: 'ap-northeast-3a'
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: vpc-03-public-subnet-01

  VPC03PrivateSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC03
      CidrBlock: 10.100.1.0/24
      AvailabilityZone: 'ap-northeast-3a'
      Tags:
        - Key: Name
          Value: vpc-03-private-subnet-01

  VPC03InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: vpc-03-igw

  VPC03AttachInternetGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref VPC03
      InternetGatewayId: !Ref VPC03InternetGateway

  VPC03EIP:
    Type: AWS::EC2::EIP
    DependsOn: VPC03AttachInternetGateway
    Properties:
      Domain: vpc

  VPC03NATGateway:
    Type: AWS::EC2::NatGateway
    Properties:
      AllocationId: !GetAtt VPC03EIP.AllocationId
      SubnetId: !Ref VPC03PublicSubnet1
      Tags:
        - Key: Name
          Value: vpc-03-nat

  VPC03PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC03
      Tags:
        - Key: Name
          Value: vpc-03-public-rt

  VPC03PublicRoute:
    Type: AWS::EC2::Route
    DependsOn: VPC03AttachInternetGateway
    Properties:
      RouteTableId: !Ref VPC03PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref VPC03InternetGateway

  VPC03PublicRouteCloudWAN:
    Type: AWS::EC2::Route
    DependsOn: VPC03Attachment
    Properties:
      RouteTableId: !Ref VPC03PublicRouteTable
      DestinationCidrBlock: 10.0.0.0/8
      CoreNetworkArn: !Ref CoreNetworkArn

  VPC03PublicSubnet1RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref VPC03PublicSubnet1
      RouteTableId: !Ref VPC03PublicRouteTable

  VPC03PrivateRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC03
      Tags:
        - Key: Name
          Value: vpc-03-private-rt

  VPC03PrivateRoute:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref VPC03PrivateRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      NatGatewayId: !Ref VPC03NATGateway

  VPC03PrivateRouteCloudWAN:
    Type: AWS::EC2::Route
    DependsOn: VPC03Attachment
    Properties:
      RouteTableId: !Ref VPC03PrivateRouteTable
      DestinationCidrBlock: 10.0.0.0/8
      CoreNetworkArn: !Ref CoreNetworkArn

  VPC03PrivateSubnet1RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref VPC03PrivateSubnet1
      RouteTableId: !Ref VPC03PrivateRouteTable

  # VPC 03 Cloud WAN Attachments
  VPC03Attachment:
    Type: AWS::NetworkManager::VpcAttachment
    Properties:
      CoreNetworkId: !Ref CoreNetworkId
      VpcArn: !Sub 'arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${VPC03}'
      SubnetArns:
        - !Sub 'arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:subnet/${VPC03PrivateSubnet1}'
      Tags:
        - Key: Name
          Value: vpc-03-attachment
        - Key: env
          Value: segment

  # VPC 04 (Private VPC)
  VPC04:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.101.0.0/16
      EnableDnsHostnames: true
      EnableDnsSupport: true
      Tags:
        - Key: Name
          Value: vpc-04

  VPC04PrivateSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC04
      CidrBlock: 10.101.0.0/24
      AvailabilityZone: 'ap-northeast-3a'
      Tags:
        - Key: Name
          Value: vpc-04-private-subnet-01

  VPC04PrivateSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC04
      CidrBlock: 10.101.1.0/24
      AvailabilityZone: 'ap-northeast-3a'
      Tags:
        - Key: Name
          Value: vpc-04-private-subnet-02

  VPC04RouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC04
      Tags:
        - Key: Name
          Value: vpc-04-rt

  VPC04RouteCloudWAN:
    Type: AWS::EC2::Route
    DependsOn: VPC04Attachment
    Properties:
      RouteTableId: !Ref VPC04RouteTable
      DestinationCidrBlock: 0.0.0.0/0
      CoreNetworkArn: !Ref CoreNetworkArn

  VPC04Subnet1RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref VPC04PrivateSubnet1
      RouteTableId: !Ref VPC04RouteTable

  VPC04Subnet2RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref VPC04PrivateSubnet2
      RouteTableId: !Ref VPC04RouteTable

  # VPC 04 Cloud WAN Attachments
  VPC04Attachment:
    Type: AWS::NetworkManager::VpcAttachment
    Properties:
      CoreNetworkId: !Ref CoreNetworkId
      VpcArn: !Sub 'arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${VPC04}'
      SubnetArns:
        - !Sub 'arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:subnet/${VPC04PrivateSubnet2}'
      Tags:
        - Key: Name
          Value: vpc-04-attachment
        - Key: env
          Value: segment

  # Security Groups
  VPC04SecurityGroupForEC2:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: 'Security group for VPC04 EC2 instance'
      VpcId: !Ref VPC04
      SecurityGroupEgress:
        - IpProtocol: -1
          CidrIp: 0.0.0.0/0
      Tags:
        - Key: Name
          Value: vpc-04-sg-for-ec2

  VPC04SecurityGroupForSSM:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: 'Security group for SSM Endpoint'
      VpcId: !Ref VPC04
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: !Sub ${VPC04.CidrBlock}
      Tags:
        - Key: Name
          Value: !Sub vpc-04-sg-for-ssm

  # SSM Endpoint
  VPC04SsmEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      ServiceName: !Sub 'com.amazonaws.${AWS::Region}.ssm'
      VpcEndpointType: Interface
      PrivateDnsEnabled: true
      VpcId: !Ref VPC04
      SubnetIds:
        - !Ref VPC04PrivateSubnet1
      SecurityGroupIds:
        - !Ref VPC04SecurityGroupForSSM

  VPC04SsmMessageEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      ServiceName: !Sub 'com.amazonaws.${AWS::Region}.ssmmessages'
      VpcEndpointType: Interface
      PrivateDnsEnabled: true
      VpcId: !Ref VPC04
      SubnetIds:
        - !Ref VPC04PrivateSubnet1
      SecurityGroupIds:
        - !Ref VPC04SecurityGroupForSSM

  # IAM Role for EC2
  EC2Role:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: ec2.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
      Tags:
        - Key: Name
          Value: ec2-ssm-role

  EC2InstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Roles:
        - !Ref EC2Role

  # EC2 Instance in VPC04
  VPC04EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref LatestAmiId
      InstanceType: t3.micro
      IamInstanceProfile: !Ref EC2InstanceProfile
      SubnetId: !Ref VPC04PrivateSubnet1
      PrivateIpAddress: '10.101.0.100'
      SecurityGroupIds:
        - !Ref VPC04SecurityGroupForEC2
      Tags:
        - Key: Name
          Value: vpc-04-ec2

Outputs:
  VPC03Id:
    Description: VPC 03 ID
    Value: !Ref VPC03

  VPC04Id:
    Description: VPC 04 ID
    Value: !Ref VPC04

  VPC04EC2InstanceId:
    Description: VPC04 EC2 Instance ID
    Value: !Ref VPC04EC2Instance

検証

パターン1:東京リージョン側のインターネット出口のみ利用して通信

まずは東京リージョン側のインターネット出口のみ通る構成で検証してみる。
赤線の経路通り、東京/大阪リージョンのEC2が東京リージョン側のインターネット出口を
使用して外部と通信できること、その際のルート情報を確認する。

structure-03.png
図3:パターン1構成

デフォルトルートの設定は、コアネットワークのセグメントアクション>ルートにて
設定する。この構成では、以下の通りデフォルトルートの通信を東京リージョン側
VPCアタッチメントに送信する設定を行う。

コアネットワーク設定_ルート.png

この構成におけるsegmentのルーティング情報は以下となった。

  • 東京リージョン
    ルート情報_東京_01.png

  • 大阪リージョン
    ルート情報_大阪_01.png

東京リージョンの方は0.0.0.0/0のルートタイプが"STATIC"であり、
大阪リージョンは0.0.0.0/0のルートタイプが"PROPAGATED"となっている。

つまり、送信先として設定したVPCアタッチメントが存在する東京リージョンに
STATICルートが設定され、そのルート情報が大阪リージョンに伝搬される形となる。

各リージョンのEC2から外部(1.1.1.1)3※に向けて通信してみた結果は以下の通り。

  • 東京リージョン
    traceroute_東京.png

  • 大阪リージョン
    traceroute_大阪.png

東京/大阪リージョン共に、東京リージョン側のNATGateway(グローバルIP:54.64.199.92 / ローカルIP:10.0.0.10)を経由して1.1.1.1宛に通信している。
東京を経由しているため、応答時間も約10msと東京より長くかかっている。

パターン2:東京/大阪リージョン両方のインターネット出口を利用

次は大阪リージョン側のインターネット出口も利用して通信する構成で検証してみる。
赤線の経路通り、東京/大阪リージョンのEC2がそれぞれのリージョンにあるインターネット出口を使用して外部と通信できること、その際のルート情報を確認する。

structure-04.png
図4:パターン2構成

パターン1の構成に対し、デフォルトルートを大阪リージョン側VPCアタッチメントに送信する設定を追加する。

コアネットワーク設定_ルート_02.png

この構成におけるsegmentのルーティング情報は以下となった。

  • 東京リージョン
    ルート情報_東京_02.png

  • 大阪リージョン
    ルート情報_大阪_02.png

パターン1と比較し、東京リージョンは変更無し。
大阪リージョンは0.0.0.0/0へのルートについて以下の点が変更されている。

  • 送信先:「segment/ap-northeast-1」→「大阪リージョン側のVPCアタッチメント」
  • ルートタイプ:「PROPAGATED」→「STATIC」

各リージョンのEC2から外部(1.1.1.1)に向けて通信してみた結果は以下の通り。

  • 東京リージョン
    traceroute_東京_02.png

  • 大阪リージョン
    traceroute_大阪_02.png

東京側は(途中ホップ機器が変わっているが)変更無し。
大阪側は想定通り大阪リージョンのNATGateway(グローバルIP:15.168.52.50 / ローカルIP:10.100.0.57)を経由して1.1.1.1宛に通信できている。
応答時間も約1.5msと短くなっている事がわかる。

上記のことから、コアネットワークにルート設定を追加した場合、
送信先のVPCアタッチメントが所属するリージョンにSTATICルートが設定される形となる。

BGPのルート優先度として、多くのNW機器が「STATICルート > BGP広報されたルート」4となることから、CloudWANにおいても各リージョンのSTATICルートが優先されることで、
送信元が所属するリージョンのインターネット出口が使用されたと考えられる。

パターン3:大阪リージョン側でインターネット障害が起きた場合

せっかくCloudWAN環境を構築したので、障害時や運用を想定したパターンも検証してみる。
パターン2の構成から、大阪リージョン内でインターネット障害が発生した際に、
東京リージョン側に迂回して外部と通信ができるか確認する。

structure-05.png
図5:NATGWを削除

疑似的なインターネット障害として、大阪リージョン側のEC2にてpingを打ち続けた状態で、大阪リージョン側のNATGWを削除してみる。

大阪リージョン側NATGW削除.png

結果として、NATGWを削除したタイミングでping応答しなくなった。

CloudWANではアタッチしたVPC内部のネットワーク状態までは参照していないため、
STATICルートが自動的に削除されることはない。そのため、大阪リージョンに通信が転送されたがNATGWに到達できず通信不可となったと考えられる。

つまり、何らかのAWS障害でインターネット通信できなくなった際に別リージョンのインターネット出口に切り替えたい場合、CloudWANのSTATICルート設定を削除する何らかの仕組みを導入する必要がある。

パターン4:パターン2→1に戻した場合の通信継続性

今度は大阪リージョンのインターネット出口のメンテナンス作業を想定した検証を行う。
パターン2の構成より、大阪リージョンのインターネット出口向けのルートへの振り分けを停止させることで、ルート変更中における既存通信への影響を確認してみる。

structure-06.png
図6:大阪リージョン側インターネット出口向けルート削除

図の青点線のように、自動的に東京リージョン側のインターネット出口を経由して外部と通信を継続できると嬉しい。

大阪リージョン側のEC2にて外部にpingを打ち続けた状態で、パターン2で追加した
大阪リージョン向けデフォルトルート設定を削除してみる。

staticルート変更.png

結果として、pingは欠けることなく通信継続が可能。
図の2〜3行目でデフォルトルート設定が削除されたことにより、BGP広報された
東京リージョン側のデフォルトルートが採用され、迂回して通信が継続される結果となる。
応答時間も1.80ms→13.0msと遅くなっていることがわかる。

まとめ

Cloud WANでリージョン毎にインターネット出口を設定した場合の挙動を検証してみたが、
デフォルトルートの挙動1つとっても奥が深い。
ネットワークの設計は設定一つ誤るとすべての通信に影響が出るため、実際のシステム構築で利用する際に事故らないよう、継続して理解を深めていきたい。

<検証で分かったこと>

  • デフォルトルートをセグメントアクション>ルートで設定すると、送信先で指定した
    アタッチメントが存在するリージョンに対してSTATICルートが設定される。
  • BGPのルート優先度として、STATIC > BGP広報されたルートとなるため、
    各リージョンのSTATICルートが優先された結果としてインターネット出口を
    各リージョンごとに個別設定できる形になる。
  • インターネット出口が何らかの障害で使用不可となった際、別リージョンの
    インターネット出口に自動切替させるには一工夫する必要あり。

参考

  1. AWS Cloud WAN概要(AWS Black Belt Online Seminar)

  2. What is AWS Cloud WAN?

  3. Cloudflare社が提供するパブリックDNSサービス

  4. Cisco アドミニストレーティブディスタンスの説明

13
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?