Y_Yamashitaのブログ

勉強したことのアウトプット・メモ中心。たまに日記とか。

CloudFormationでVPCピアリングを設定し通信確認してみた

はじめに

これまで、本ブログでの「やってみた」系の記事は全て、JAWS-UGハンズオンの復習だけでしたが、そろそろ自分でテーマを決めて構築や検証をしてみようと思います。

その際、今後の業務利用も見据え、構築は出来るだけCloudFormation等のIaCツールを使用して実施してみます。それと、折角JAWS-UG CLI専門支部CLIを扱っているので、リソースの確認はCLIで確認したいと思います。

というわけで、今回はタイトル通り、CloudFormationでVPCピアリングを設定し、通信確認を行ってみます。非常にシンプルな構成なので、入り口としては丁度良さそうです。

VPCピアリングを試そうと思った理由は、ちょうど今「AWS 認定 高度なネットワーキング – 専門知識」の学習中で、「インプットした記憶をアウトプットによって定着させたい」と思ったためです。そのため、今後も資格取得まではネットワーク系の構築と検証が中心になる予定です。(DirectConnectは個人環境で試すのがちょっと難しいですが。。)

今回の構成と試すこと

今回は、3つのVPCを作成し、下図のようにVPCピアリング接続を行い、ルーティング設定を行います。クライアントPCから各EC2にSSH接続するため、インターネット接続設定もしておきます。
また、各EC2のセキュリティグループでは、他のVPCのCIDRからのインバウンド通信は全て許可する設定を入れておきます。 f:id:YuY_83:20210724022934p:plain

VPCピアリングではトランジット接続は出来ないため、たとえルーティング設定と通信許可設定を行っていても、VPC1とVPC3は通信が出来ないことを確認します。 f:id:YuY_83:20210724023118p:plain



今回構築に使用するCloudFormationテンプレ

今回構築に使用するCloudFormationテンプレートですが、このブログに直接貼り付けると結構な行数になってしまうので、こちらに格納しました。

CloudFormationをちゃんと使うのは初めてなので、CIDRブロックやAMI IDがベタ書きだったりして色々と粗がありますが、徐々にマシなものが書けるようになりたいと思います。

あと、実はGitHubを使うのも初めてだったりします。一応IT業界には7~8年くらいいるのですが、今まで全く触れる機会がありませんでした。使わない所は使わないものですね。
とはいえ今後いつ必要になるか分からないし、折角なのでこの機会に使い始めて、慣れておきたいと思います。

CLIによるリソースの確認

上記テンプレートによる環境構築が完了したので、CLIでリソースの確認をしてみます。今回はCloudShellを使用します。

CLIコマンドについては、こちらのブログをかなり参考にさせていただきました。

blog.serverworks.co.jp



# VPCの確認(VPCID、CIDRブロック、状態、テナンシー)
[cloudshell-user@ip-10-0-131-98 ~]$ aws ec2 describe-vpcs \
> --filters "Name=tag-value,Values=handson-vpc*" \
> --output text \
> --query "Vpcs[].[Tags[?Key=='Name'] 
> | [0].Value,VpcId,CidrBlock,State,InstanceTenancy]" \
> | sort
handson-vpc-peering1    vpc-0932bf14cf664577f   10.100.0.0/16   available       default
handson-vpc-peering2    vpc-0f5af64c8262401f0   10.200.0.0/16   available       default
handson-vpc-peering3    vpc-0150bd49c56f4f085   10.50.0.0/16    available       default
[cloudshell-user@ip-10-0-131-98 ~]$ 
[cloudshell-user@ip-10-0-131-98 ~]$ 


#サブネットの確認(VPCID、CIDRブロック、利用可能アドレス数、サブネットID、AZ、状態)
[cloudshell-user@ip-10-0-131-98 ~]$ aws ec2 describe-subnets \
> --filters "Name=tag-value,Values=handson-vpc*" \
> --query "Subnets[].[Tags[?Key=='Name'] \
> | [0].Value,VpcId,CidrBlock,AvailableIpAddressCount,SubnetId,AvailabilityZone,MapPublicIpOnLaunch,State]" \
> --output text \
> | sort
handson-vpc-peering1    vpc-0932bf14cf664577f   10.100.0.0/24   250     subnet-05283462e7cd5044d        ap-northeast-1a True    available
handson-vpc-peering2    vpc-0f5af64c8262401f0   10.200.0.0/24   250     subnet-082fe1abac42bd13c        ap-northeast-1c True    available
handson-vpc-peering3    vpc-0150bd49c56f4f085   10.50.0.0/24    250     subnet-02bf2ccee82e23c16        ap-northeast-1c True    available
[cloudshell-user@ip-10-0-131-98 ~]$ 
[cloudshell-user@ip-10-0-131-98 ~]$ 


#ルートテーブルの確認1(サブネットID、ルートテーブルID、メインルートかどうか、関連付けられたサブネットがあるか)
[cloudshell-user@ip-10-0-131-98 ~]$ aws ec2 describe-route-tables \
> --filters "Name=tag-value,Values=handson-vpc*" \
> --query "RouteTables[].Associations[].[SubnetId,RouteTableId,Main,AssociationState.State]" \
> --output text \
> | sort | column -t
subnet-02bf2ccee82e23c16  rtb-09af531f07f2cd06f  False  associated
subnet-05283462e7cd5044d  rtb-09abdfe97a306a035  False  associated
subnet-082fe1abac42bd13c  rtb-0e3a628ee0d845da7  False  associated
[cloudshell-user@ip-10-0-131-98 ~]$ 
[cloudshell-user@ip-10-0-131-98 ~]$ 


#ルートテーブルの確認2(ルートテーブルID、経路)
[cloudshell-user@ip-10-0-131-98 ~]$ aws ec2 describe-route-tables \
> --filters "Name=tag-value,Values=handson-vpc*" \
> --query "RouteTables[].[Associations[].[RouteTableId],Routes]" \
> --output text
rtb-09af531f07f2cd06f
10.100.0.0/24           CreateRoute     active  pcx-0dbfc21a4ec1e1609
10.200.0.0/24           CreateRoute     active  pcx-0dbfc21a4ec1e1609
10.50.0.0/16    local   CreateRouteTable        active  
0.0.0.0/0       igw-0a6cbcd0152530b46   CreateRoute     active  
rtb-0e3a628ee0d845da7
10.50.0.0/24            CreateRoute     active  pcx-0dbfc21a4ec1e1609
10.100.0.0/24           CreateRoute     active  pcx-0b9cd821777935106
10.200.0.0/16   local   CreateRouteTable        active  
0.0.0.0/0       igw-0628af6c9db7c71d6   CreateRoute     active  
rtb-09abdfe97a306a035
10.50.0.0/24            CreateRoute     active  pcx-0b9cd821777935106
10.200.0.0/24           CreateRoute     active  pcx-0b9cd821777935106
10.100.0.0/16   local   CreateRouteTable        active  
0.0.0.0/0       igw-0bada0d7405535216   CreateRoute     active  
[cloudshell-user@ip-10-0-131-98 ~]$ 
[cloudshell-user@ip-10-0-131-98 ~]$ 


#インターネットゲートウェイの確認
[cloudshell-user@ip-10-0-131-98 ~]$ aws ec2 describe-internet-gateways \
> --filters "Name=tag-value,Values=handson-vpc*" \
> --query "InternetGateways[].{InternetGatewayId:InternetGatewayId,VpcId:Attachments[0].VpcId}" \
> --output table
----------------------------------------------------
|             DescribeInternetGateways             |
+------------------------+-------------------------+
|    InternetGatewayId   |          VpcId          |
+------------------------+-------------------------+
|  igw-0628af6c9db7c71d6 |  vpc-0f5af64c8262401f0  |
|  igw-0a6cbcd0152530b46 |  vpc-0150bd49c56f4f085  |
|  igw-0bada0d7405535216 |  vpc-0932bf14cf664577f  |
+------------------------+-------------------------+
[cloudshell-user@ip-10-0-131-98 ~]$ 
[cloudshell-user@ip-10-0-131-98 ~]$ 


#VPCピアリングの確認(VPCピアリングコネクションID、CIDRブロック)
[cloudshell-user@ip-10-0-131-98 ~]$ aws ec2 describe-vpc-peering-connections \
> --filters "Name=status-code,Values=active" \
> --query "VpcPeeringConnections[].[VpcPeeringConnectionId,AccepterVpcInfo.CidrBlock,RequesterVpcInfo.CidrBlock]" \
> --output text
pcx-0dbfc21a4ec1e1609   10.50.0.0/16    10.200.0.0/16
pcx-0b9cd821777935106   10.200.0.0/16   10.100.0.0/16
[cloudshell-user@ip-10-0-131-98 ~]$ 
[cloudshell-user@ip-10-0-131-98 ~]$ 


#EC2インスタンス(プライベートIP、グローバルIP、タグ名、CloudFormationロジカルID)
[cloudshell-user@ip-10-0-131-98 ~]$ aws ec2 describe-instances \
> --filters "Name=tag-value,Values=handson-vpc*" \
> --query "Reservations[].Instances[].[PrivateIpAddress,PublicIpAddress,Tags[?Key=='Name'].[Value],Tags[?Key=='aws:cloudformation:logical-id'].[Value]]" \
> --output text
10.50.0.215     13.112.80.211
handson-vpc-peering3
EC2C
10.200.0.230    3.112.25.175
handson-vpc-peering2
EC2B
10.100.0.199    18.176.59.141
handson-vpc-peering1
EC2A
[cloudshell-user@ip-10-0-131-98 ~]$ 


#セキュリティグループの確認(Description、プロトコル、CIDRブロック)
[cloudshell-user@ip-10-0-131-98 ~]$ aws ec2 describe-security-groups \
> --filters "Name=tag-value,Values=handson-vpc*" \
> --query "SecurityGroups[].[Description,IpPermissions]" \
> --output text
Security Group for VPC2
        -1                        #すべてのプロトコル
IPRANGES        10.100.0.0/16
IPRANGES        10.50.0.0/16
22      tcp     22
IPRANGES        XXX.XXX.XXX.XXX/32  #クライアントPCのグローバルIP
Security Group for VPC1
        -1                        #すべてのプロトコル      
IPRANGES        10.50.0.0/16
IPRANGES        10.200.0.0/16
22      tcp     22
IPRANGES        XXX.XXX.XXX.XXX/32 #クライアントPCのグローバルIP
Security Group for VPC3
        -1                        #すべてのプロトコル
IPRANGES        10.200.0.0/16
IPRANGES        10.100.0.0/16
22      tcp     22
IPRANGES        XXX.XXX.XXX.XXX/32 #クライアントPCのグローバルIP
[cloudshell-user@ip-10-0-131-98 ~]$ 


どうやらリソースは問題なく作成されていそうですので、クライアントPCから各EC2へSSH接続して、他のEC2への通信確認をしてみたいと思います。

通信確認

それでは、各EC2インスタンスSSHログインして、他のVPCのEC2インスタンスPingを打ってみます。

#EC2AからEC2BへのPing 
[ec2-user@ip-10-100-0-199 ~]$ 
[ec2-user@ip-10-100-0-199 ~]$ ping 10.200.0.230
PING 10.200.0.230 (10.200.0.230) 56(84) bytes of data.
64 bytes from 10.200.0.230: icmp_seq=1 ttl=255 time=1.63 ms
64 bytes from 10.200.0.230: icmp_seq=2 ttl=255 time=1.60 ms
64 bytes from 10.200.0.230: icmp_seq=3 ttl=255 time=1.59 ms
64 bytes from 10.200.0.230: icmp_seq=4 ttl=255 time=1.61 ms
64 bytes from 10.200.0.230: icmp_seq=5 ttl=255 time=1.58 ms
^C
--- 10.200.0.230 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4006ms
rtt min/avg/max/mdev = 1.587/1.608/1.631/0.015 ms
[ec2-user@ip-10-100-0-199 ~]$ 


#EC2AからEC2CへのPing
[ec2-user@ip-10-100-0-199 ~]$ ping 10.50.0.215
PING 10.50.0.215 (10.50.0.215) 56(84) bytes of data.
^C
--- 10.50.0.215 ping statistics ---
10 packets transmitted, 0 received, 100% packet loss, time 9198ms

[ec2-user@ip-10-100-0-199 ~]$ 
[ec2-user@ip-10-100-0-199 ~]$ 


#EC2BからEC2AへPing
[ec2-user@ip-10-200-0-230 ~]$ 
[ec2-user@ip-10-200-0-230 ~]$ ping 10.100.0.199
PING 10.100.0.199 (10.100.0.199) 56(84) bytes of data.
64 bytes from 10.100.0.199: icmp_seq=1 ttl=255 time=1.88 ms
64 bytes from 10.100.0.199: icmp_seq=2 ttl=255 time=1.66 ms
64 bytes from 10.100.0.199: icmp_seq=3 ttl=255 time=1.67 ms
64 bytes from 10.100.0.199: icmp_seq=4 ttl=255 time=1.59 ms
64 bytes from 10.100.0.199: icmp_seq=5 ttl=255 time=1.59 ms
^C
--- 10.100.0.199 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4006ms
rtt min/avg/max/mdev = 1.593/1.682/1.880/0.108 ms
[ec2-user@ip-10-200-0-230 ~]$ 
[ec2-user@ip-10-200-0-230 ~]$ 


#EC2BからEC2CへPing
[ec2-user@ip-10-200-0-230 ~]$ 
[ec2-user@ip-10-200-0-230 ~]$ ping 10.50.0.215
PING 10.50.0.215 (10.50.0.215) 56(84) bytes of data.
64 bytes from 10.50.0.215: icmp_seq=1 ttl=255 time=0.572 ms
64 bytes from 10.50.0.215: icmp_seq=2 ttl=255 time=0.390 ms
64 bytes from 10.50.0.215: icmp_seq=3 ttl=255 time=0.178 ms
64 bytes from 10.50.0.215: icmp_seq=4 ttl=255 time=0.181 ms
64 bytes from 10.50.0.215: icmp_seq=5 ttl=255 time=0.218 ms
^C
--- 10.50.0.215 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4093ms
rtt min/avg/max/mdev = 0.178/0.307/0.572/0.154 ms
[ec2-user@ip-10-200-0-230 ~]$ 
[ec2-user@ip-10-200-0-230 ~]$ 


#EC2CからEC2AへPing
[ec2-user@ip-10-50-0-215 ~]$ 
[ec2-user@ip-10-50-0-215 ~]$ ping 10.100.0.199
PING 10.100.0.199 (10.100.0.199) 56(84) bytes of data.
^C
--- 10.100.0.199 ping statistics ---
9 packets transmitted, 0 received, 100% packet loss, time 8176ms

[ec2-user@ip-10-50-0-215 ~]$ 
[ec2-user@ip-10-50-0-215 ~]$ 


#EC2CからEC2BへPing
[ec2-user@ip-10-50-0-215 ~]$ 
[ec2-user@ip-10-50-0-215 ~]$ ping 10.200.0.230
PING 10.200.0.230 (10.200.0.230) 56(84) bytes of data.
64 bytes from 10.200.0.230: icmp_seq=1 ttl=255 time=0.214 ms
64 bytes from 10.200.0.230: icmp_seq=2 ttl=255 time=0.178 ms
64 bytes from 10.200.0.230: icmp_seq=3 ttl=255 time=0.230 ms
64 bytes from 10.200.0.230: icmp_seq=4 ttl=255 time=0.202 ms
64 bytes from 10.200.0.230: icmp_seq=5 ttl=255 time=0.225 ms
^C
--- 10.200.0.230 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4094ms
rtt min/avg/max/mdev = 0.178/0.209/0.230/0.026 ms
[ec2-user@ip-10-50-0-215 ~]$ 



想定通り、VPCピアリングをトランジットした通信は(ルーティング設定を行ってセキュリティグループで許可設定しても)出来ませんでした。

おわりに

今回はVPCピアリングの基本的な確認でした。非常に簡便な構成でしたが、CloudFormationでの環境構築やCLIでのリソース確認、GitHubの使用など、本題以外の不慣れな部分で結構時間がかかってしまいました。。もっと数をこなして、検証やアウトプットをスピーディに出来るようになりたいですね。

あと、今回はCloudFormationのスタック作成・削除をマネジメントコンソールで実施しましたが、次回以降はこれもCLIで実施してみようと思います。