假设我的地下室中有一台服务器要复制到RDS数据库。为此,我在pg_hba.conf
文件中添加了一个用户:
hostssl all replica 64.222.124.22 md5
这样可行!直到IP地址发生变化。
所以我尝试将AWS主机放在那里:
hostssl all replica my-db.random-string.us-west-2.rds.amazonaws.com md5
但这与日志失败,如:
2019-03-01 11:50:13.205 PST [28518] replica@server DETAIL: Client IP address resolved to "ec2-64-222-124-22.us-west-2.compute.amazonaws.com", forward lookup not checked.
2019-03-01 11:50:13.251 PST [28519] replica@server FATAL: no pg_hba.conf entry for replication connection from host "64.222.124.22", user "replica", SSL off
当我在IP上执行反向DNS请求时:
↪ host 64.222.124.22
49.221.155.35.in-addr.arpa domain name pointer ec2-64-222-124-22.us-west-2.compute.amazonaws.com.
所以我认为它无法将连接的IP地址解析回我放在pg_hba.conf
文件中的主机名。我可以把根域名放在那里:
hostssl all replica .rds.amazonaws.com md5
但是,如果所有AWS都可以连接到我的服务器,那么这种方法就无法限制为单个IP地址/主机。
这里有一个技巧可以让解决方案与AWS的主机名一起正常工作吗?
我真的不想在我的两台服务器之间设置一个代理,只是给它们一个静态IP。我查看了AWS弹性IP,但无法将它们分配给RDS实例。
在验证pg_hba.conf时,Postgresql首先执行反向DNS查找。因此反向DNS非常重要。这也意味着这不会起作用:
hostssl all replica .rds.amazonaws.com md5
你可以这样做:
hostssl all replica .us-west-2.compute.amazonaws.com md5
但是当你正确停留时,这将留下一个非常开放的配置,允许在AWS的那个区域运行的任何计算机连接正确的md5密码。
这基本上留下了两种不同的解决方案。
选项1 - 专用网络和VPN
使用AWS VPC,您可以为RDS实例设置专用网络和子网组,并在其中为您可以控制的IP空间分配IP地址。假设你有10.10.10.0/24
的子网。这意味着你可以在你的10.10.10.0/24
发布pg_hba.conf
。这需要在VPC和服务器之间设置某种VPN。
根据地下室中的网络设备类型,您可以使用AWS Site-to-site VPN。或者,您可以使用其他解决方案货架解决方案,例如OpenVPN或WireGuard。
选项2 - 动态更新pg_hba.conf
如果您不想要VPN的额外复杂性。您可以每5分钟找一个脚本查询主机名my-db.random-string.us-west-2.rds.amazonaws.com
,然后根据需要更新pg_hba.conf并向postgres发送一个SIGHUP信号。这不是最漂亮的解决方案,但应该允许它半自动工作。如果不需要该连接的停机时间,那么这不太可能是理想的解决方案。
现在复制(嘿)这个想法,我知道如何在SO上实际“回答”问题。
另一种可能性是使用动态DNS提供程序。我之前没有想过这个,因为它基本上只在你想在家里使用使用DHCP的连接托管服务器时使用,所以我实际上并不知道它有多好用。
实质上:
我认为更新应该几乎是立即的,但我不确定传播延迟是否仅限于主机名,或者A路径是否实际缓存(从而绕过名称服务器查找)。
一些潜在的问题(除了传播延迟):
我认为问题#1可以通过相当简单的Lambda函数解决,如果动态DNS提供程序有API,则会触发事件。
不过,这是一个权宜之计。我认为VPN和代理解决方案绝对是更强大的选择。