有关VPC中Elastic Beanstalk应用程序的问题

我正试图在Amazon的Elastic Beanstalk上部署一个rails应用程序。 我不是很了解networking/服务器环境,所以我通过阅读文档和研究堆栈中存在的任何技术来获取一些知识,所以如果我犯了错误,请耐心等待。

所以这是我想要实现的:

我想在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)上的传入stream量相同的安全组中,也存在不可满足的安全组。

我用我的Ip的CIDR添加了一个安全组,并可以确认数据库可以从我的机器上访问。 这意味着我在我的环境中指定的连接参数是正确的,并且与错误的凭证/configuration无关。

什么可能是我的EC2实例无法build立连接到我的RDS实例的罪魁祸首? 再一次,我几乎肯定了它在我的安全组设置中,但是我还没有能够缩小问题的根源。

如果您需要更多信息(为了简洁起见,我故意省略),请告诉我(例如VPC,EC2或RDS的安全组等)。

由于RDS需要在VPC中部署两个可用区域,因此您需要确保Beanstalk能够通过networkingACL访问它们以及基于实例的安全组的权限。

只有你的ELB和你的NAT实例/ NAT网关需要是公有子网,其他的一切都应该在私有子网中。

安全组是有状态的,并且networking组是无状态的,所以虽然您只需要允许安全组的入站规则,但您需要允许来自您的Beanstalk子网的入站和出站端口同时使用networkingACL访问两个RDS子网。 请参阅您的VPC中的安全性 。

这里是创buildbeanstalk环境的示例eb create (replace方括号string):

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

子网-db000001networkingACL规则:

 Inbound: Port Range: 5432, Source [subnet-ec200001 (as ip range)], Allow Outbound: Port Range: 5432, Source [subnet-ec200001 (as ip range)], Allow 

子网-db000002networkingACL规则:

 Inbound: Port Range: 5432, Source [subnet-ec200001 (as ip range)], Allow Outbound: Port Range: 5432, Source [subnet-ec200001 (as ip range)], Allow 

子网-EC200001networkingACL规则:

 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 

子网-elb00001networkingACL规则:

 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 

关于networkingACL的附加说明 – 许多服务不响应原始端口,而是使用临时端口 。 因此,您可能必须将以下内容添加到具有EC2实例的子网的入站和出站networkingACL:

 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的networkingACL规则中还有几个有用的scheme。

我希望这有帮助。