使用Play框架将EC2连接到RDS

时间:2010-08-28 06:54:34

标签: java amazon-ec2 playframework amazon-rds

我有一个我使用Play框架构建的小网站,我试图在EC2服务器上针对Amazon RDS实例运行。我可以在我的机器上运行应用程序对抗RDS实例,一切正常。但是当我将它部署到我的EC2服务器时,会出现这个错误:

The last packet successfully received from the server was 1,282,977,731,085 milliseconds ago.  The last packet sent successfully to the server was 0 milliseconds ago.
        at play.db.DBPlugin.onApplicationStart(DBPlugin.java:87)
        at play.Play.start(Play.java:381)
        at play.Play.init(Play.java:247)
        at play.server.Server.main(Server.java:85)
Caused by: java.net.ConnectException: Connection refused

我的第一个想法是它是某种安全设置,但我有一个基于Spring的应用程序在Tomcat上运行,在相同的EC2服务器上使用相同的用户名和密码连接到相同的RDS实例,并且它工作得很好。只有Play应用有连接问题。

我似乎无法解释为什么会发生这种情况,或者有关如何修复它的想法。

之前有人见过这样的事吗?

4 个答案:

答案 0 :(得分:2)

问题出在application.conf文件中。如果您指定本地数据库:

db=mysql:root:pass@db

和你的prod DB是这样的:

%prod.db.url=jdbc:mysql://<your-db-ip>:3306/db
%prod.db.user=db_user
%prod.db.pass=db_pass

尝试在生产中运行时会出现此错误,因为Play!实际上是尝试使用db = mysql:root:pass @ db param来连接,因为prod参数不会特别地覆盖该参数。要解决此问题,请务必在本地和prod中以相同的方式连接到数据库。这对我有用:

db.url=jdbc:mysql://localhost:3306/db
db.user=root
db.pass=pass

%prod.db.url=jdbc:mysql://<your-db-ip>:3306/db
%prod.db.user=db_user
%prod.db.pass=db_pass

答案 1 :(得分:0)

我对这些框架(或一般的Java)都不了解,但我确实对这些Amazon服务有一些经验 - 这些框架是否可能使用不同的协议或不同的端口进行通信?如果是这样,它仍然可能是一个安全问题。

如果有可能,那么转到EC2&gt;安全组,如果您没有这三行,请尝试添加它们:

All | icmp | -1 |    -1 | default group
All | tcp  |  0 | 65535 | default group
All | udp  |  0 | 65535 | default group

(“默认组”是默认名称,我称之为我的,但您的组名可能不同 - 无论如何确保它们是组名而不是“0.0.0.0/0”)

另外,如果您知道需要打开的特定协议/端口,那么显然也要添加它们。

答案 2 :(得分:0)

您的错误可能是由许多事情引起的,并且似乎发生在协议堆栈的较低级别上,而不是您正在查看的内容。我建议在发送服务器上运行数据包分析器(例如wireshark)以试图弄清楚发生了什么。也许数据包没有到达那里?也许你的客户因为环境不同而混淆了什么?数据包嗅探器对于揭开不连接之谜是非常宝贵的。

如果您的服务器无头,或者您无法转发图形会话,则可以始终使用命令行工具,例如* nix系统上的tcpdump。

答案 3 :(得分:0)

我在这里问了同样的问题

Amazon RDS and Elastic Beanstalk connectivity

很可能你的问题会在你之后解决 在RDS默认安全组中添加“elasticbeanstalk-default”安全组