セキュリティグループでセキュリティグループを指定する
AWSのセキュリティグループ(以下SG)で、[送信元]にSGのID(sg-××××)を指定することができます。
その場合、そのSGに属しているEC2からの接続を許可することになります。
下記のようにSG自身をそのSGで許可すると、そのSGに属している全EC2間の通信が許可されます。
このようなSGがアタッチされたEC2、SERVER-AとSERVER-Bで検証を行います。
下記のように、プライベートIPで疎通が確認できます。
1 2 3 4 5 |
[root@<span style="color: #ffff00">SERVER-A</span> ~]# ping <span style="color: #ffff00">172.31.***.*** (SERVER-BのプライベートIP)</span> PING 172.31.***.*** (172.31.***.***) 56(84) bytes of data. 64 bytes from 172.31.***.***: icmp_seq=1 ttl=255 time=0.903 ms 64 bytes from 172.31.***.***: icmp_seq=2 ttl=255 time=0.674 ms ~ |
1 2 3 4 5 |
[root@<span style="color: #ffff00">SERVER-B</span> ~]# ping <span style="color: #ffff00">172.31.***.*** (SERVER-AのプライベートIP)</span> PING 172.31.***.*** (172.31.***.***) 56(84) bytes of data. 64 bytes from 172.31.***.***: icmp_seq=1 ttl=255 time=0.821 ms 64 bytes from 172.31.***.***: icmp_seq=2 ttl=255 time=0.728 ms ~ |
しかし、グローバルIPにpingを打つと疎通が取れなくなります。
1 2 3 4 5 |
[root@<span style="color: #ffff00">SERVER-A</span> ~]# ping -c 4 <span style="color: #ffff00">52.***.***.*** (SERVER-BのグローバルIP)</span> PING 52.***.***.*** (52.***.***.***) 56(84) bytes of data. --- 52.0.0.2 ping statistics --- 4 packets transmitted, 0 received, 100% packet loss, time 2999ms |
1 2 3 4 5 |
[root@<span style="color: #ffff00">SERVER-B</span> ~]# ping -c 4 <span style="color: #ffff00">52.***.***.*** (SERVER-AのグローバルIP)</span> PING 52.***.***.*** (52.***.***.***) 56(84) bytes of data. --- 52.0.0.1 ping statistics --- 4 packets transmitted, 0 received, 100% packet loss, time 3024ms |
SGをSGで許可する方法はプライベートネットワーク内でのみ有効なようです。
疑問:各エンドポイントへの接続に関して
しかし、そこで1つ疑問が湧きました。
BeanstalkでEC2+RDS+AutoScalingを半自動構築しました。
RDSのSGで、EC2に適用されているSGからのDBポートが許可されています。
RDSへの接続手段はエンドポイント(~~~.rds.amazonaws.com)しかなく、
エンドポイントはCNAMEである以上、DNSで名前解決される必要があります。
SGをSGで許可する方法はプライベートネットワーク内でのみ有効なので
DNSに問い合わせる為にグローバルネットワークに出てしまうと
EC2-RDS間で通信が出来なくなってしまうのではないでしょうか?
VPC(プライベートネットワーク)内での名前解決
しかし実際は、EC2からRDSへの接続が確認できました。
(Beanstalkで構築したので当然といえば当然ですが)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# mysql -h ****.****.****.rds.amazonaws.com -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 373 Server version: 5.6.27-log MySQL Community Server (GPL) Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> |
どうやら、同一のVPC内であればエンドポイントは
プライベートネットワーク内で名前解決されるようです。
下記digは、RDSと同一のBeanstalk環境(同一のVPC内)のEC2から実行しています。
1 2 3 4 5 6 |
# dig ****.****.****.rds.amazonaws.com ~ ;; ANSWER SECTION: ****.****.****.rds.amazonaws.com. 5 IN CNAME ec2-52-***-***-***.ap-northeast-1.compute.amazonaws.com. ec2-52-***-***-***.ap-northeast-1.compute.amazonaws.com. 20 IN A <span style="color: #ffff00"><strong>172.31.***.***</strong></span> ~ |
他のVPCのEC2からdigするとグローバルIPを引っ張ってきます。
1 2 3 4 5 6 |
# dig ****.****.****.rds.amazonaws.com ~ ;; ANSWER SECTION: ****.****.****.rds.amazonaws.com. 5 IN CNAME ec2-52-***-***-***.ap-northeast-1.compute.amazonaws.com. ec2-52-***-***-***.ap-northeast-1.compute.amazonaws.com. 50 IN A <span style="color: #ffff00"><strong>52.***.***.***</strong></span> ~ |
このVPC内での名前解決はVPCデフォルトの動作で、
下記のようにVPCのコンパネから設定を変更することが出来ます。
まとめ
①SGをSGで許可する方法はプライベートネットワーク内でのみ有効である
②RDSなどのエンドポイントは、デフォルトで、プライベートネットワーク(同一のVPC)内で名前解決される
投稿者プロフィール
- 2015年8月入社。弊社はインフラ屋ですが、アプリも作ってみたいです。