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からのインバウンド通信は全て許可する設定を入れておきます。
VPCピアリングではトランジット接続は出来ないため、たとえルーティング設定と通信許可設定を行っていても、VPC1とVPC3は通信が出来ないことを確認します。
今回構築に使用するCloudFormationテンプレ
今回構築に使用するCloudFormationテンプレートですが、このブログに直接貼り付けると結構な行数になってしまうので、こちらに格納しました。
CloudFormationをちゃんと使うのは初めてなので、CIDRブロックやAMI IDがベタ書きだったりして色々と粗がありますが、徐々にマシなものが書けるようになりたいと思います。
あと、実はGitHubを使うのも初めてだったりします。一応IT業界には7~8年くらいいるのですが、今まで全く触れる機会がありませんでした。使わない所は使わないものですね。
とはいえ今後いつ必要になるか分からないし、折角なのでこの機会に使い始めて、慣れておきたいと思います。
CLIによるリソースの確認
上記テンプレートによる環境構築が完了したので、CLIでリソースの確認をしてみます。今回はCloudShellを使用します。
CLIコマンドについては、こちらのブログをかなり参考にさせていただきました。
# 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で実施してみようと思います。