セキュリティグループでセキュリティグループを指定する
AWSのセキュリティグループ(以下SG)で、[送信元]にSGのID(sg-××××)を指定することができます。
その場合、そのSGに属しているEC2からの接続を許可することになります。
下記のようにSG自身をそのSGで許可すると、そのSGに属している全EC2間の通信が許可されます。

このようなSGがアタッチされたEC2、SERVER-AとSERVER-Bで検証を行います。
下記のように、プライベートIPで疎通が確認できます。
[root@SERVER-A ~]# ping 172.31.***.*** (SERVER-BのプライベートIP) 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 ~
[root@SERVER-B ~]# ping 172.31.***.*** (SERVER-AのプライベートIP) 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を打つと疎通が取れなくなります。
[root@SERVER-A ~]# ping -c 4 52.***.***.*** (SERVER-BのグローバルIP) PING 52.***.***.*** (52.***.***.***) 56(84) bytes of data. --- 52.0.0.2 ping statistics --- 4 packets transmitted, 0 received, 100% packet loss, time 2999ms
[root@SERVER-B ~]# ping -c 4 52.***.***.*** (SERVER-AのグローバルIP) 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で構築したので当然といえば当然ですが)
# 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から実行しています。
# 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 172.31.***.***
~
他のVPCのEC2からdigするとグローバルIPを引っ張ってきます。
# 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 52.***.***.***
~
このVPC内での名前解決はVPCデフォルトの動作で、
下記のようにVPCのコンパネから設定を変更することが出来ます。

まとめ
①SGをSGで許可する方法はプライベートネットワーク内でのみ有効である
②RDSなどのエンドポイントは、デフォルトで、プライベートネットワーク(同一のVPC)内で名前解決される
投稿者プロフィール
- 2015年8月入社。弊社はインフラ屋ですが、アプリも作ってみたいです。