在 EC2 中部署的 Tomcat Webapp 无法与 Postgres RDS 实例通信
Posted
技术标签:
【中文标题】在 EC2 中部署的 Tomcat Webapp 无法与 Postgres RDS 实例通信【英文标题】:Deployed Tomcat Webapp in EC2 can't talk to Postgres RDS instance 【发布时间】:2021-11-08 05:00:40 【问题描述】:我有一个简单的基于 Java servlet 的应用程序在 EC2 中的 tomcat 服务器的端口 8080 上运行。当我点击一个按钮时,它会返回数据库中的所有用户记录并将它们呈现到屏幕上。
当我使用 Tomcat 在我的本地主机上部署该应用程序时,它运行良好,并且它可以很好地连接从中检索用户记录的 RDS。
但是,当我将 WAR 文件部署到 EC2 实例上的 Tomcat 并通过 http://51...***:8080/MyApp 访问它时-0.0.1-SNAPSHOT,当我单击同一个按钮时,它不允许我连接到我的 RDS 并返回相同的对象。
EC2 和 RDS 实例共享相同的可用区、VPC(默认)和安全组。 我什至将 EC2 的私有 IP 地址添加到为 RDS 和 EC2 指定入站规则的安全组(入站:Postgres 5432 139...***)。
我通过 AWS EC2 Instance Connect 连接到我的 EC2(不是通过我的本地主机上的 bash,因为 RDS 是一项托管服务)。我已经在ec2上安装了maven、jdk8、tomcat和git……我还需要安装postgres吗?
将war文件复制到var/lib/tomcat/webapps
后,我使用sudo service tomcat start
运行应用程序,并且可以在我上面提到的地址的8080端口访问它。 (http://51.***.***.***:8080/MyApp-0.0.1-SNAPSHOT
)。
EC2和RDS实例共享的安全组入站规则如下:
在允许 EC2 和 RDS 相互通信方面我做错了什么?
【问题讨论】:
【参考方案1】:想通了。与安全组或 VPC 无关。有问题的基于 servlet 的应用程序正在使用 URL 重写来捕获发送到 http://543.251.123/AppToDeploy/.. 的请求。
final String URI = request.getRequestURI().replace("/AppToDeploy/", "");
switch(URI)
case "login":
RequestHelper.processLogin(request, response);
break;
...
在 EC2 实例中,当我运行 mvn clean package
时,它生成了一个名为 AppToDeploy-0.0.1-SNAPSHOT.war
的 WAR,我将其传递到 Tomcat 的 webapps/
目录以在端口 8080 上提供服务。
解决方法是将以下内容添加到我的 pom.xml
文件中以重命名打包的 war 文件。
<build>
<!-- This renames the built war file -->
<finalName>$project.artifactId</finalName>
</build>
【讨论】:
以上是关于在 EC2 中部署的 Tomcat Webapp 无法与 Postgres RDS 实例通信的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Amazon EC2 上部署 Java webapp,以便您可以有效地使用自动缩放?
从 Eclipse 在 AWS EC2 上部署 Java webapp
Tomcat 7:在 webapp 的子目录中部署一个 war 文件