Ste*_*oll 3 java postgresql amazon-ec2 amazon-web-services amazon-rds
我有一个 Spring 应用程序,我试图在 AWS 上托管,几天来我一直在努力配置。
我有一个 EC2 实例,并且能够通过 SSH 连接到它。我还在 AWS 中设置了 Postgres RDS 数据库,但我无法使用 IDE 中的代码连接到它,因此我尚未将应用程序上传到 EC2 实例。
我认为问题出在我的安全组上,正如application.propertiesAWS 文档和其他指南所建议的那样。
我一直试图了解安全组的来龙去脉,但这是一场斗争。我认为在实际生产环境中精确地使用我的 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
Run Code Online (Sandbox Code Playgroud)
我尝试了多种 SG 配置,这里有 2 个示例:
RDS 配置 1:
Public accessibility: Yes
VPC Security Groups: launch-wizard-1 (sg-id-1) / Active
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
RDS 配置 2:
Public accessibility: Yes
VPC Security Groups: default (sg-id-2) / Active
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
当我尝试连接 RDS 上设置的任一安全组时,连接超时并显示SocketTimeoutException.
这是什么原因造成的?
编辑:它终于连接了。最终允许访问的安全组配置为:
Inbound rules:
rule 1 -- Type: PostgreSQL, Protocol: TCP, Port range: 5432, Source: 0.0.0.0/0
Outbound rules:
N/A
Run Code Online (Sandbox Code Playgroud)
我还在互联网网关中添加了一个子网路由表,我认为这是必要的,尽管它最初不允许访问,因为 SG 入站规则上的源仍然不正确。
ASocketTimeoutException意味着您的应用程序无法从端点(在本例中为数据库)获取响应。
您的 RDS 配置肯定有问题,您可以检查以下几项内容。
1. 安全组(SG)入站和出站规则
就 SG 配置而言,安全组是有状态的。
这意味着,如果您创建允许流量进入的入站规则,则无论任何出站规则如何,该流量都会自动允许返回。
因此,公共 PostgreSQL RDS 数据库的最佳配置是:
Inbound rules:
rule 1 -- Type: PostgreSQL, Protocol: TCP, Port range: 5432, Source: 0.0.0.0/0
Outbound rules:
N/A
Run Code Online (Sandbox Code Playgroud)
如果您的入站规则不允许 PostgreSQL 流量通过,您的请求将永远不会到达数据库 - 安全组应用在实例级别。
2.“公共可访问性”RDS属性
如果安全组设置正确,请仔细检查 RDS 实例的“网络和安全”中的“公共可访问性”属性是否设置为“是”。
这将为 RDS 实例分配一个用于外部访问的公共 IP 地址,并且公共 IP 地址是公共数据库的要求。
3. 子网类型
如果你的SGS没问题,并且你的数据库有公共IP,但你没有互联网网关,就好像你买了宽带来连接互联网,但你的网线被拔掉了(缺少互联网网关)。
为了使 RDS 实例可公开访问,您还需要在数据库的子网中创建一个Internet 网关。创建后,您需要将互联网绑定的流量定向到互联网网关。
为此,请设置子网的路由表,以将所有前往0.0.0.0/0互联网的 IPv4 流量(作为目的地)的数据路由到互联网网关 ID(目标)。
这将使您的子网成为public,因为该子网现在与具有到 Internet 网关的路由的路由表关联。
公共子网是公共数据库的另一个要求,因为这将确保通信可以在您的 VPC 和互联网之间流动。
没有互联网网关的私有子网将不允许外部访问。
4. DNS 主机名和 DNS 解析 VPC 属性
如果您仍然无法公开访问数据库,请确保为 RDS 实例所在的 VPC启用 DNS 主机名和 DNS 解析 VPC 属性。
5. 网络 ACL
检查您是否尚未创建任何与子网关联的默认状态的网络 ACL或具有阻止规则的 NACL。
默认创建的 NACL 会像防火墙一样阻止所有入站和出站流量,无论安全组设置如何,除非您添加明确允许它们的规则。
您的 VPC 将附带一个默认 NACL,该 NACL 允许所有入站和出站 IPv4 流量 - 使用该 NACL。
6. 认证
确保您的用户名和密码/IAM 身份验证令牌/Kerberos 凭证 100% 正确。
上面是一个非常全面的列表,所以希望其中一个建议应该允许您从外部连接到数据库并排除您的 Java 代码不正确。
然后,您可以将 RDS 实例设为私有,仅接受来自 EC2 实例安全组的流量,并从子网中删除互联网网关以使其私有,应用AWS Well 中安全支柱的所有层安全原则-架构框架。
| 归档时间: |
|
| 查看次数: |
5893 次 |
| 最近记录: |