在EC2实例上运行的MVC应用程序无法访问RDS数据库

时间:2016-11-16 12:01:21

标签: asp.net-mvc amazon-web-services amazon-ec2 amazon-rds

我正在使用MVC开发一个应用程序,该应用程序使用远程数据库(RDS amazon)来填充应用程序的数据。在本地运行应用程序一切正常。当我将应用程序部署到EC2 instance时,问题就出现了,我的在线应用程序无法访问RDS database。启用EC2 instance RDS database的正确程序是什么?我的安全组具有所有流量和任何地方启用的入站和出站权限。

3 个答案:

答案 0 :(得分:3)

如何解决连接到我的Amazon RDS数据库实例的问题?

问题

  

我无法连接到我的Amazon RDS数据库实例。

你的问题:

  

尝试从不在VPC中的EC2实例进行连接时,   数据库实例的安全组未配置为允许访问   EC2实例。

解决方案:

如果尝试从EC2 classic实例连接失败,请从数据库实例安全组授予用户访问权限。有关更多信息,请查看以下内容:

如果要从Amazon EC2实例访问数据库实例,则必须首先确定您的EC2实例和数据库实例是否在VPC中。如果您使用的是默认VPC,则可以在创建或修改EC2实例将访问的数据库实例时分配用于EC2实例的相同EC2或VPC安全组。

如果您的数据库实例和EC2实例不在VPC中,则必须使用允许来自Amazon EC2实例的流量的入口规则配置数据库实例的安全组。您可以通过将EC2实例的Amazon EC2安全组添加到数据库实例的数据库安全组来完成此操作。在此示例中,您将入口规则添加到Amazon EC2安全组的数据库安全组。

重要

  

将入口规则添加到Amazon EC2的数据库安全组   安全组仅授予从Amazon EC2访问您的数据库实例的权限   与该Amazon EC2安全组关联的实例。

     

您无法授权其中的Amazon EC2安全组   与您的数据库实例不同的AWS区域。您可以授权IP   范围,或在同一区域中指定Amazon EC2安全组   指另一个地区的IP地址。如果您指定IP范围,我们   建议您使用Amazon EC2的私有IP地址   实例,它提供来自您的亚马逊的更直接的网络路由   EC2实例到您的Amazon RDS数据库实例,并且不会发生   在亚马逊网络外发送的数据的网络费用。

AWS管理控制台

将EC2安全组添加到数据库安全组

  1. 登录AWS管理控制台并在https://console.aws.amazon.com/rds/打开Amazon RDS控制台。

  2. 从控制台窗口左侧的导航窗格中选择安全组。

  3. 选择要授予访问权限的数据库安全组的详细信息图标。

  4. enter image description here

    1. 在安全组的详细信息页面中,选择,从“连接类型”下拉列表中选择“EC2安全组”,然后选择要使用的Amazon EC2安全组。然后单击“授权”。
    2. enter image description here

      1. 入口规则的状态将是授权,直到新入口规则应用于与您修改的数据库安全组关联的所有数据库实例。成功应用入口规则后,状态将更改为已授权。
      2. CLI

        要授予对Amazon EC2安全组的访问权限,请使用AWS CLI命令authorize-db-security-group-ingress。

        示例

        对于Linux,OS X或Unix:

        aws rds authorize-db-security-group-ingress \
            --db-security-group-name default  \
            --ec2-security-group-name myec2group \
            --ec2-security-group-owner-id 987654321021 
        

        对于Windows:

        aws rds authorize-db-security-group-ingress ^
            --db-security-group-name default  ^
            --ec2-security-group-name myec2group ^
            --ec2-security-group-owner-id 987654321021
        

        该命令应产生类似于以下内容的输出:

        SECGROUP  Name     Description 
        SECGROUP  default  default
              EC2-SECGROUP  myec2group  987654321021  authorizing
        

        API

        要授权对Amazon EC2安全组进行网络访问,请使用以下参数调用该Amazon RDS API函数http://docs.aws.amazon.com//AmazonRDS/latest/APIReference/API_AuthorizeDBSecurityGroupIngress.htmlAuthorizeDBSecurityGroupIngress

        EC2Security­GroupName = myec2group
        
        EC2SecurityGroupOwnerId = 987654321021
        

        实施例

        https://rds.amazonaws.com/
            ?Action=AuthorizeDBSecurityGroupIngress
            &EC2SecurityGroupOwnerId=987654321021
            &EC2Security­GroupName=myec2group
            &Version=2009-10-16
            &SignatureVersion=2
            &SignatureMethod=HmacSHA256
            &Timestamp=2009-10-22T17%3A10%3A50.274Z
            &AWSAccessKeyId=<AWS Access Key ID>
            &Signature=<Signature> 
        

        资源链接:

        1. How do I resolve problems connecting to my Amazon RDS database instance?
        2. Authorizing Network Access to a DB Instance from an Amazon EC2 Instance

答案 1 :(得分:0)

请检查以下内容是否已完成。

  1. 创建一个VPC安全组(例如,&#34; sg-appsrv1&#34;)并定义 入站规则,用作客户端IP地址的源 应用。此安全组允许您的客户端应用程序 连接到使用此安全组的VPC中的EC2实例。
  2. 为应用程序创建EC2实例并添加EC2实例 到您在之前创建的VPC安全组(&#34; sg-appsrv1&#34;) 步。 VPC中的EC2实例与VPC安全组共享 数据库实例。
  3. 创建第二个VPC安全组(例如,&#34; sg-dbsrv1&#34;)和 通过指定您创建的VPC安全组来创建新规则 在第1步(&#34; sg-appsrv1&#34;)作为来源。
  4. 创建新数据库实例并将数据库实例添加到VPC安全性 您在上一步中创建的组(&#34; sg-dbsrv1&#34;)。当你 创建实例,使用与指定的端口号相同的端口号 对于您在步骤3中创建的VPC安全组(&#34; sg-dbsrv1&#34;)规则。
  5. 参考:http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Overview.RDSSecurityGroups.html#Overview.RDSSecurityGroups.Scenarios

答案 2 :(得分:0)

默认情况下,RDS不允许在安全组(SG)中未指定任何连接。您可以根据CIDR地址或亚马逊帐号允许,该帐号允许该帐户下的任何EC2访问它。

但也要检查:

  • 是否正确配置了关联的子网?
  • 子网是否是正确配置的路由组的一部分(指定了Internet网关等?)
  • RDS是否说它可以公开访问?
  • 当然要检查RDS安全组和EC2安全组
    • 不要忘记您的实际源IP可能是内部IP(如果通过VPC内部访问)或外部IP(可能是路由器的IP,或EC2实例的实例IP,与其负载均衡器不同/弹性IP) - 要进行故障排除,您可以尝试允许访问所有IP和端口。

(路由组是我的问题;在创建新子网时,我忽略了将其添加到带网关的路由组。)