AWS TransitGatewayでVPC間接続・セキュリティグループによるアクセス制御
概要
本記事ではVPC間をTransitGatewayで接続し異なるVPC間でEC2をつなぎます。
また、セキュリティグループのルールを設定してEC2間の通信を制御します。
構成図
今回作成するAWSの構成図がこちら。
10.0.1.10のインスタンスからTGWを経由して10.0.2.0/24と10.0.3.0/24のVPCへ接続します。
VPC内EC2への接続についてはセキュリティグループを設定して通信できるインスタンスとそうでないインスタンスとを分けます。
デフォルトではVPCの上限が5つとなっていますので、本手順で3つVPCを作成する場合は予めVPCを2つ以内に減らしてください。
*構成図右上と右下の作成手順は基本同じなので最低2つVPC作成に余裕があれば大丈夫です。
また、本作業はTransitgatewayのアタッチメントと(無料枠外の場合)EC2の稼働時間によって料金が発生します。
VPCの作成
今回は、パブリックサブネットを1つ持つVPCx1とプライベートサブネットを1つ持つVPCx2の合計3つを作成します。
TGWでつなぐので各VPCのCIDR範囲が重複しないように注意しましょう。
パブリックサブネット持ちVPC
プライベートサブネットのみVPC-1
プライベートサブネットのみVPC-2
TransitGatewayの作成
AWSサービスでTransitgatewayと検索するか、VPCサービスの左ペインから『Transit Gateway』を選択。
『Transit Gatewayを作成』
名前タグ:任意の名前
TrangitGatewayを設定
デフォルトルートテーブルの関連付け:チェック解除
デフォルトルートテーブル伝播:チェック解除
出来立てのTransit Gatewayが状態がPendingなのでAvailableになるまで少し待ちましょう。
TrangitGatewayルートテーブルの作成
マネコンの左側ペインから『Transit Gatewayルートテーブル』を選択。
Transit Gatewayルートテーブルを作成から
名前にルートテーブルに設定する名前を入力し、TrangitGatewayIDには先ほど作成したTGWを選択
ルートテーブルも1、2分程でAvailable状態になります。
TransitGatewayアタッチメントの作成
TrangitGatewayをVPCに関連付けるためにアタッチメントを作成します。
Trangit Gatewayアタッチメントから『Transit Gatewayアタッチメントを作成』
名前タグ:アタッチメント名(任意)
Transit GatewayID:今回作成したTGWを選択
VPC ID:関連付けるVPCを選択
これをVPCの数だけ行います。
状態がAvailableになるのを待って次に進みます。
TransitGatewayルートテーブルの編集
今回作成したアタッチメントをTransit Gatewayに関連付けしVPCへ通信を伝播できるようにしていきます。
今回作成したTGWのルートテーブルを選択したら『関連付け』タブから『関連付けを作成』。
もしくは、『アクション』から『関連付けを作成』
関連付けるアタッチメントを選択で先ほど作ったアタッチメントを選択します。
これをアタッチメント分実施します。
関連付けタブで状態がすべてAssociatedになったのを確認したら次は伝播(プロパゲーション)の設定をします。
アクションかタブから『伝播を作成』を選択。
伝播するアタッチメントで先ほど関連付けたアタッチメントを選択します。
これもアタッチメント分実施します。
伝播の状態がEnabledになり、ルートタブにアクティブ状態のVPC CIDRが出てきたらTGW側の設定は完了です。
VPC
ここまでTGW→各VPCの経路作成を実施しました。
ここから『VPC→』TGW→VPCの部分を作成しTGW経由でVPC同士が通信できるようにしていきます。
Before:TGW→VPC
After:VPC⇔TGW⇔VPC
ルートテーブル編集
VPCのルートテーブルにTGWへのルートを作成していきます。
各ルートテーブルの『ルートを編集』から次のように設定していきます。
VPC-10.0.1.0/24
VPC-10.0.2.0/24
VPC-10.0.3.0/24
セキュリティグループとEC2作成
セキュリティグループ作成
VPC-TGW間の設定が完了したのでEC2とセキュリティグループを作成していきます。
まずは、セキュリティグループから作っていきましょう。
例)EC2-10.0.1.10用
通信を許可する予定のEC2に割り当てるプライベートIPアドレスからのPingを許可します。
構成図を参考に許可したいEC2のIPアドレスからping(ICMP)をインバウンドで許可するセキュリティグループを作成するインスタンス分準備します。
パブリックサブネットのEC2にSSH接続する場合はインバウンドでSSHも許可してください。
EC2インスタンス起動
プライベートIPアドレスの指定は「高度なネットワーク設定」を開いて「プライマリIP」に指定したいプライベートIPアドレスを入力しましょう。
パブリックEC2にのみ必要な設定
・パブリックIPの自動割り当て:有効化
・SSM接続に必要なIAMロールの割り当て(SSH接続時は不要)
アクセス制御
それでは、パブリックサブネットで起動したEC2に入って各EC2間の接続を確認してみましょう。
まずは、EC2(10.0.1.10)からEC2(10.2.0.12)にpingを飛ばしてみます。
10.0.2.12側では10.0.1.10からのpingを許可しています。
pingが通りましたね。
$ ping -c 5 10.0.2.12
PING 10.0.2.12 (10.0.2.12) 56(84) bytes of data.
64 bytes from 10.0.2.12: icmp_seq=1 ttl=126 time=2.25 ms
64 bytes from 10.0.2.12: icmp_seq=2 ttl=126 time=0.747 ms
64 bytes from 10.0.2.12: icmp_seq=3 ttl=126 time=0.760 ms
64 bytes from 10.0.2.12: icmp_seq=4 ttl=126 time=0.677 ms
64 bytes from 10.0.2.12: icmp_seq=5 ttl=126 time=0.780 ms
--- 10.0.2.12 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4119ms
rtt min/avg/max/mdev = 0.677/1.042/2.248/0.603 ms
次は10.0.3.15にpingしてみます。
10.0.3.15は10.0.1.11からのpingのみ許可しています。
pingが返ってきませんでした。
$ ping -c 5 10.0.3.15
PING 10.0.3.15 (10.0.3.15) 56(84) bytes of data.
--- 10.0.3.15 ping statistics ---
5 packets transmitted, 0 received, 100% packet loss, time 4151ms
このことからTGWで異なるVPC間の通信ができていること
SGによって通信が制御されていることが確認できました。
セキュリティグループ編集
最後にSGを編集して10.0.1.10-10.0.3.15間でpingを通るようにしましょう。
10.0.3.15に関連付けられているSGを編集します。
SGを編集するとpingが通るようになりました。
$ ping 10.0.3.15
#SG編集前
PING 10.0.3.15 (10.0.3.15) 56(84) bytes of data.
#SG編集後
64 bytes from 10.0.3.15: icmp_seq=76 ttl=126 time=0.950 ms
64 bytes from 10.0.3.15: icmp_seq=77 ttl=126 time=1.12 ms
64 bytes from 10.0.3.15: icmp_seq=78 ttl=126 time=0.728 ms
64 bytes from 10.0.3.15: icmp_seq=79 ttl=126 time=0.713 ms
64 bytes from 10.0.3.15: icmp_seq=80 ttl=126 time=0.664 ms
64 bytes from 10.0.3.15: icmp_seq=81 ttl=126 time=0.680 ms
^C
--- 10.0.3.15 ping statistics ---
81 packets transmitted, 6 received, 92.5926% packet loss, time 83095ms
rtt min/avg/max/mdev = 0.664/0.808/1.116/0.167 ms
おわり
今回は、TGWを利用したVPC接続とSGによるアクセス制御でした。
SGによるアクセス制御はルートテーブルを分離できない場合などに活用できるかなと思います。
作業後はAWSリソースを削除しましょう。
TGWはアタッチメント→その他TGWリソースの順で削除しましょう。
アタッチメントの状態がDeletedになったら削除可能になります。
Discussion