在 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 文件

JavaWeb项目如何部署到tomcat(手工)

Maven - 在 JUnit 测试之前将 webapp 部署到 tomcat

具有数据源部署的 Tomcat 6 webapp