我试图将在一个EC2实例上运行的应用程序连接到在另一个EC2实例上运行的MongoDB。我很确定问题出在安全设置上,但是我不太确定如何处理。
首先,我的应用程序实例位于ELB后面的自动缩放组中。实例和ELB的入站安全设置允许从任何位置访问端口80,以及来自其自己的安全组的所有流量。
如果该实例的安全组从任何地方接受所有入站流量,则运行该Mongo的EC2实例能够建立连接。我尝试过的任何其他配置都会导致应用程序说无法与远程地址建立连接。我已经设置了规则,以接受来自我所有安全组的入站流量,但是只有当我允许来自任何地方的所有流量时,它似乎才起作用。
另外,我的数据库实例是用弹性IP设置的。我是否也应该在ELB后面加入该实例?
所以我的问题是:
1)如何安全地连接到运行mongo的EC2实例?
2)就体系结构而言,以这种方式运行数据库是否有意义,还是应该在负载均衡器之后?
这个问题给我带来的打击比我想象的要多得多,因此,我们将不胜感激。
注意
我还在bind_ip=0.0.0.0
中设置了/etc/mongo.conf
最佳答案
您的问题是您正在使用公共弹性IP从其他服务器连接到数据库服务器。这意味着该连接正在连接到Internet,然后又重新连接到您的VPC,这带来了以下问题:
VPC中未包含数据传输所导致的安全问题
网络延迟问题
您的数据库服务器的安全组无法识别入站连接的安全组
摆脱MongoDB服务器上的弹性IP,除非您打算从VPC外部连接到IP,否则不需要它。修改服务器以在创建与数据库服务器的连接时使用分配给数据库服务器的内部专用IP地址。最后,将您的安全组锁定回去,仅允许您从其他安全组访问数据库。
可选:在Route53中创建一个私有托管区域,其A记录指向数据库服务器的私有IP地址,然后使用该主机名代替内部IP地址。