はじめに
以前から興味のあったAWS CloudWANについてBlackbelt資料1を見ていた際、
「インターネットの出口は、AWSの各リージョンごとに個別設定する事も可能。」
との文言をみて、どのような仕組みで実現しているのか気になり調査してみた。
AWS CloudWANとは
AWS CloudWANとは、複数の拠点・VPC・データセンターを一元的に接続・管理できるマネージドWANサービスである。
Transit Gatewayではリージョン間をメッシュ型にピアリングしたり複雑なルートテーブルの設定が必要だったりと、管理が困難な大規模マルチリージョンネットワークを簡単に構築・運用することが可能となる。
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を設けるべきだが、
今回は構成簡略化のため割愛する。
環境構築
構成図を元に環境を作成する。
以下の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が東京リージョン側のインターネット出口を
使用して外部と通信できること、その際のルート情報を確認する。
デフォルトルートの設定は、コアネットワークのセグメントアクション>ルートにて
設定する。この構成では、以下の通りデフォルトルートの通信を東京リージョン側
VPCアタッチメントに送信する設定を行う。
この構成におけるsegmentのルーティング情報は以下となった。
東京リージョンの方は0.0.0.0/0のルートタイプが"STATIC"であり、
大阪リージョンは0.0.0.0/0のルートタイプが"PROPAGATED"となっている。
つまり、送信先として設定したVPCアタッチメントが存在する東京リージョンに
STATICルートが設定され、そのルート情報が大阪リージョンに伝搬される形となる。
各リージョンのEC2から外部(1.1.1.1)3※に向けて通信してみた結果は以下の通り。
東京/大阪リージョン共に、東京リージョン側のNATGateway(グローバルIP:54.64.199.92 / ローカルIP:10.0.0.10)を経由して1.1.1.1宛に通信している。
東京を経由しているため、応答時間も約10msと東京より長くかかっている。
パターン2:東京/大阪リージョン両方のインターネット出口を利用
次は大阪リージョン側のインターネット出口も利用して通信する構成で検証してみる。
赤線の経路通り、東京/大阪リージョンのEC2がそれぞれのリージョンにあるインターネット出口を使用して外部と通信できること、その際のルート情報を確認する。
パターン1の構成に対し、デフォルトルートを大阪リージョン側VPCアタッチメントに送信する設定を追加する。
この構成におけるsegmentのルーティング情報は以下となった。
パターン1と比較し、東京リージョンは変更無し。
大阪リージョンは0.0.0.0/0へのルートについて以下の点が変更されている。
- 送信先:「segment/ap-northeast-1」→「大阪リージョン側のVPCアタッチメント」
- ルートタイプ:「PROPAGATED」→「STATIC」
各リージョンのEC2から外部(1.1.1.1)に向けて通信してみた結果は以下の通り。
東京側は(途中ホップ機器が変わっているが)変更無し。
大阪側は想定通り大阪リージョンの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の構成から、大阪リージョン内でインターネット障害が発生した際に、
東京リージョン側に迂回して外部と通信ができるか確認する。
疑似的なインターネット障害として、大阪リージョン側のEC2にてpingを打ち続けた状態で、大阪リージョン側のNATGWを削除してみる。
結果として、NATGWを削除したタイミングでping応答しなくなった。
CloudWANではアタッチしたVPC内部のネットワーク状態までは参照していないため、
STATICルートが自動的に削除されることはない。そのため、大阪リージョンに通信が転送されたがNATGWに到達できず通信不可となったと考えられる。
つまり、何らかのAWS障害でインターネット通信できなくなった際に別リージョンのインターネット出口に切り替えたい場合、CloudWANのSTATICルート設定を削除する何らかの仕組みを導入する必要がある。
パターン4:パターン2→1に戻した場合の通信継続性
今度は大阪リージョンのインターネット出口のメンテナンス作業を想定した検証を行う。
パターン2の構成より、大阪リージョンのインターネット出口向けのルートへの振り分けを停止させることで、ルート変更中における既存通信への影響を確認してみる。
図の青点線のように、自動的に東京リージョン側のインターネット出口を経由して外部と通信を継続できると嬉しい。
大阪リージョン側のEC2にて外部にpingを打ち続けた状態で、パターン2で追加した
大阪リージョン向けデフォルトルート設定を削除してみる。
結果として、pingは欠けることなく通信継続が可能。
図の2〜3行目でデフォルトルート設定が削除されたことにより、BGP広報された
東京リージョン側のデフォルトルートが採用され、迂回して通信が継続される結果となる。
応答時間も1.80ms→13.0msと遅くなっていることがわかる。
まとめ
Cloud WANでリージョン毎にインターネット出口を設定した場合の挙動を検証してみたが、
デフォルトルートの挙動1つとっても奥が深い。
ネットワークの設計は設定一つ誤るとすべての通信に影響が出るため、実際のシステム構築で利用する際に事故らないよう、継続して理解を深めていきたい。
<検証で分かったこと>
- デフォルトルートをセグメントアクション>ルートで設定すると、送信先で指定した
アタッチメントが存在するリージョンに対してSTATICルートが設定される。 - BGPのルート優先度として、STATIC > BGP広報されたルートとなるため、
各リージョンのSTATICルートが優先された結果としてインターネット出口を
各リージョンごとに個別設定できる形になる。 - インターネット出口が何らかの障害で使用不可となった際、別リージョンの
インターネット出口に自動切替させるには一工夫する必要あり。
参考
-
Cloudflare社が提供するパブリックDNSサービス ↩

















