我正在尝试在 Amazon 的 Elastic Beanstalk 上部署一个 rails 应用程序。我不太熟悉网络/服务器环境,因此我通过阅读文档和研究堆栈中存在的任何技术来获取一些知识,因此如果我犯了任何错误,请多多包涵。
这就是我想要实现的目标:
我想在 Elastic Beanstalk 上使用 Docker 部署我的 Rails 应用程序,我的实例在具有两个面向公众的子网和一个关联的 RDS 实例的 VPC 中启动。到目前为止一切顺利,我已设置好堆栈,但在部署时我收到一条错误消息,表明我的 EC2 实例无法连接到 Postgres RDS 实例:
[91mrake 中止![0m[91mPG::ConnectionBad: 无法连接到服务器:没有此文件或目录服务器是否在本地运行并接受 Unix 域套接字“/var/run/postgresql/.s.PGSQL.5432”上的连接?
因此,本质上我的感觉是,除了我的 EC2 实例无法访问我的 RDS 实例外,我已经取得了很大进展。我的猜测是存在无法满足要求的安全组,尽管我尝试确保将 EC2 实例和 RDS 实例都添加到同一个安全组中,并且安全组本身允许端口 5432 (Postgres) 上的传入流量。
我使用我的 IP 的 CIDR 添加了安全组,并确认可以从我的机器访问数据库。这意味着我在我的环境中指定的连接参数是正确的,并且与错误的凭据/配置无关。
我的 EC2 实例无法与我的 RDS 实例建立连接的原因可能是什么? 再次,我几乎肯定它位于我的安全组设置中,但我无法缩小问题的根源。
如果您需要更多信息(为了简洁我故意省略了这些信息),请告诉我(例如 VPC、EC2 或 RDS 的安全组等)。
答案1
由于 RDS 要求您在 VPC 中部署时拥有两个可用区域,因此您需要确保 beanstalk 能够通过网络 ACL 以及基于实例的安全组的权限访问它们。
只有您的 ELB 和 NAT 实例/NAT 网关需要是公共子网,其他所有内容都应该位于私有子网中。
安全组是有状态的,而网络组是无状态的,因此,虽然您只需要允许安全组的入站规则,但您需要使用网络 ACL 允许从 beanstalk 子网到两个 RDS 子网的入站和出站端口。请参阅VPC 中的安全性。
eb create
下面是创建 beanstalk 环境的示例(替换方括号内的字符串):
eb create [BEANSTALK_ENVIRONMENT] --instance_type m3.medium --branch_default --cname [BEANSTALK_CNAME] --database --database.engine postgres --database.version [x] --database.size 100 --database.instance db.m4.large --database.password xxxxxxxxx --database.username ebroot --instance_profile [BEANSTALK_EC2_IAM_PROFILE] --keyname [SSH_KEY_NAME] --platform "64bit Amazon Linux 2015.03 v1.3.0 running Ruby 2.2" --region us-east-1 --tags tag1=value1,tag2=value2 --tier webserver --verbose --sample --vpc.id [vpc-xxxxxx] --vpc.dbsubnets [subnet-db000001,subnet-db000002] --vpc.ec2subnets [subnet-ec200001] --vpc.elbsubnets [subnet-elb00001] --vpc.elbpublic --vpc.securitygroups [sg-00000001] --sample --timeout 3600
subnet-db000001 网络 ACL 规则:
Inbound: Port Range: 5432, Source [subnet-ec200001 (as ip range)], Allow
Outbound: Port Range: 5432, Source [subnet-ec200001 (as ip range)], Allow
subnet-db000002 网络 ACL 规则:
Inbound: Port Range: 5432, Source [subnet-ec200001 (as ip range)], Allow
Outbound: Port Range: 5432, Source [subnet-ec200001 (as ip range)], Allow
subnet-ec200001 网络 ACL 规则:
Inbound: Port Range: 5432, Source [subnet-db000001 (as ip range)], Allow
Inbound: Port Range: 5432, Source [subnet-db000002 (as ip range)], Allow
Outbound: Port Range: 5432, Source [subnet-db000001 (as ip range)], Allow
Outbound: Port Range: 5432, Source [subnet-db000002 (as ip range)], Allow
subnet-elb00001 网络 ACL 规则:
Inbound: Port Range: 80, Source 0.0.0.0/0, Allow
Inbound: Port Range: 443, Source 0.0.0.0/0, Allow
Outbound: Port Range: 80, Source 0.0.0.0/0, Allow
Outbound: Port Range: 443, Source 0.0.0.0/0, Allow
关于网络 ACL 的补充说明——许多服务不会在原始端口上响应,而是使用临时端口。因此,您可能必须将以下内容添加到具有 EC2 实例的子网的入站和出站网络 ACL 中:
Outbound: Port Range: 1024-65535, Source 0.0.0.0/0, Allow
Outbound: Port Range: 1024-65535, Source 0.0.0.0/0, Allow
还有几个有用的场景为您的 VPC 推荐的网络 ACL 规则。
我希望这有帮助。