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

MVC application running on EC2 instance can't acess RDS database

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

请检查是否完成了以下操作。

  1. 创建VPC安全组(例如"sg-appsrv1")并定义 使用客户端 IP 地址作为源的入站规则 应用。此安全组允许您的客户端应用程序 连接到使用此安全组的 VPC 中的 EC2 实例。
  2. 为应用创建EC2实例并添加EC2实例 到您在之前创建的 VPC 安全组 ("sg-appsrv1") 步。 VPC中的EC2实例共享VPC安全组 数据库实例。
  3. 创建第二个 VPC 安全组(例如,"sg-dbsrv1")并 通过指定您创建的 VPC 安全组来创建新规则 在步骤 1 ("sg-appsrv1") 中作为来源。
  4. 创建一个新的数据库实例并将数据库实例添加到VPC安全 您在上一步中创建的组 ("sg-dbsrv1")。当你 创建实例,使用与指定相同的端口号 对于您在步骤 3 中创建的 VPC 安全组 ("sg-dbsrv1") 规则。

参考:http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Overview.RDSSecurityGroups.html#Overview.RDSSecurityGroups.Scenarios

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

问题

I am unable to connect to my Amazon RDS database instance.

您的问题:

When attempting to connect from an EC2 instance that is not in a VPC, the DB instance's security group is not configured to allow access by the EC2 instance.

解决方案:

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

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

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

重要

Adding an ingress rule to a DB security group for an Amazon EC2 security group only grants access to your DB instances from Amazon EC2 instances associated with that Amazon EC2 security group.

You can't authorize an Amazon EC2 security group that is in a different AWS region than your DB instance. You can authorize an IP range, or specify an Amazon EC2 security group in the same region that refers to IP address in another region. If you specify an IP range, we recommend that you use the private IP address of your Amazon EC2 instance, which provides a more direct network route from your Amazon EC2 instance to your Amazon RDS DB instance, and does not incur network charges for data sent outside of the Amazon network.

AWS 管理控制台

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

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

  2. Select 控制台左侧导航窗格中的安全组 window.

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

  1. 在您的安全组的详细信息页面中,select,select EC2 安全组从连接类型下拉列表,然后 select 您的 Amazon EC2 安全组想用。然后点击授权。

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

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> 

资源Link:

  1. 如何解决连接到我的 Amazon RDS 数据库的问题 实例?
  2. 授权从 Amazon EC2 对数据库实例进行网络访问 实例

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

还要检查:

  • 关联的子网是否配置正确?
  • 子网是否属于似乎配置正确的路由组(指定的 Internet 网关等?)
  • RDS 是否表示它可以公开访问?
  • 当然还要检查 RDS 安全组和 EC2 安全组
    • 不要忘记您的实际源 IP 可能是内部 IP(如果通过 VPC 进行内部访问)或外部 IP(可能是路由器的 IP,或 EC2 实例的 Instance IP,这与其 Load 不同Balancer / Elastic IP) -- 要排除故障,您可以尝试允许访问所有 IP 和端口。

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