【发布时间】:2021-11-28 13:51:27
【问题描述】:
我有一个 Spring 应用程序,我正试图将其托管在 AWS 上,但我已经在配置方面苦苦挣扎了几天。
我有一个 EC2 实例,并且能够使用 SSH 连接到它。我还在 AWS 中设置了 Postgres RDS 数据库,但我无法使用 IDE 中的代码连接到它,因此我还没有将应用程序上传到 EC2 实例。
我认为问题出在我的安全组上,因为我的 application.properties 出现的方式与 AWS 文档和其他指南所建议的一样。
我一直在努力了解安全组的来龙去脉,但这一直是一场斗争。我认为在实际生产环境中准确使用我的 SG 非常重要,但我只是尝试将此应用程序用作演示。
任何允许连接到 RDS 数据库的松散配置现在都对我有用。
application.properties
spring.datasource.url=jdbc:postgresql://myEndpoint:myPort/myAppName
spring.datasource.username=myDbUsername
spring.datasource.password=myDbPassword
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgresPlusDialect
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.show-sql=true
spring.session.jdbc.initialize-schema=always
spring.session.store-type=jdbc
spring.session.jdbc.table-name=spring_session
server.servlet.session.timeout=30m
我尝试了多个 SG 配置,这里有 2 个示例:
RDS 配置 1:
Public accessibility: Yes
VPC Security Groups: launch-wizard-1 (sg-id-1) / Active
sg-id-1
Inbound rules:
rule 1 -- IP version: IPv4, Type: SSH, Protocol: TCP, Port range: MySSHPort, Source: 0.0.0.0/0
rule 2 -- IP version: IPv4, Type: Custom TCP, Protocol: TCP, Port range: MyLocalPort, Source: 0.0.0.0/0
Outbound rules:
rule 1 -- IP version: IPv4, Type: All traffic, Protocol: All, Port range: All, Destination: 0.0.0.0/0
RDS 配置 2:
Public accessibility: Yes
VPC Security Groups: default (sg-id-2) / Active
sg-id-2
Inbound rules:
rule 1 -- Type: PostgreSQL, Protocol: TCP, Port range: 5432, Source: sg-id
rule 2 -- Type: All traffic, Protocol: All, Port range: All, Source: sg-id
Outbound rules:
rule 1 -- IP version: IPv4, Type: All traffic, Protocol: All, Port range: All, Destination: 0.0.0.0/0
当我尝试连接 RDS 上设置的任一安全组时,连接超时并显示 SocketTimeoutException。
这是什么原因造成的?
编辑:它终于连接了。最终允许访问的安全组配置是:
Inbound rules:
rule 1 -- Type: PostgreSQL, Protocol: TCP, Port range: 5432, Source: 0.0.0.0/0
Outbound rules:
N/A
我还向互联网网关添加了一个子网路由表,我认为这是必要的,尽管它最初不允许访问,因为 SG 入站规则上的源仍然不正确。
【问题讨论】:
-
感谢您提出明确的问题 - 连接字符串绝对正确吗?尝试使用常规 SQL 客户端来查看它是您的 Java 代码还是您的 RDS 配置 - 例如SQL Electron。
-
感谢您的回复!不幸的是,SQL Electron 没有任何运气。我很确定连接字符串是正确的。除了不一定包括一两个教程中的端口之外,我真的找不到与我使用的模式的任何变化。我尝试了两种方法都没有运气,我使用的端点是直接从 AWS 上的管理控制台复制的。
-
不用担心 Stephen - 可以设置为您的第二个安全组配置,但是删除第一个 5432 规则。确保 SG 在任何地方都应用 - 现在可以使用 SQL 客户端连接到它吗?
-
我的 Sqlectron 和我的 IDE 仍然超时。更清楚地说,默认的 sg-id-2 应用于 RDS 和 EC2 实例,并且对于入站和出站只有一个“所有流量”规则。这让我觉得我在端点上做错了什么。在 Sqlectron 中,我使用 RDS 管理控制台中 Endpoint 下的完整条目作为服务器地址。
-
啊抱歉,我很困惑,因为当我从 RDS 控制台单击安全组时,它会将我带到 EC2 管理控制台。这是否意味着我的 RDS 设置没有特定的安全组?是的,它可以公开访问。
标签: java postgresql amazon-web-services amazon-ec2 amazon-rds