无法将我的 EC2 实例连接到我的 Flask 应用程序的私有 RDS
Cannot connect my EC2 instance to private RDS for my Flask app
我有一个 Flask 应用程序,我正尝试使用带有 EC2 的 ECS 和一个 postgres RDS 作为我的数据库将其部署到 AWS。
我的 EC2 实例在 public 子网中,我的 RDS 实例在私有子网中。两者在同一个 VPC 上。
通过使用 ssh 隧道进入我的 EC2 实例并将其用作堡垒主机,我成功地能够从我的本地计算机连接到 RDS 实例。我已经使用 pgadmin 和我在烧瓶应用程序中创建的自定义 cli 对此进行了测试。这样做时 - 我创建了我的数据库。
我可以 运行 我的 ECS 任务并在我的 EC2 public DNS 上使用我的应用程序。但是,如果我尝试使用使用我的 Flask-SQLAlchemy ORM 的功能(例如,向数据库提交表单),我会收到以下错误:
sqlalchemy.exc.InterfaceError: (pg8000.exceptions.InterfaceError) Can't create a connection to host
我在初始化我的应用程序时使用的数据库 URI 如下:
db_uri = 'postgres+pg8000://username:password@host:5432/db'
其中username是AWS RDS控制台中的“Master Username”,host是AWS RDS控制台中的“Endpoint”,db是我在本地ssh连接时创建的数据库名。
我的 EC2 有一个安全组,我的 RDS 有一个安全组。两者都在同一个 VPC 下。我在 RDS sg 上配置了入站规则,以允许来自端口 5432 上我的 EC2 私有 ipv4 地址的 TPC 流量。
我已经尝试修改 db_uri 并尝试使用我的 sg 规则,但到目前为止还没有成功。我假设当 运行在 ECS 本身上安装我的应用程序时我不需要 ssh 隧道。
从 EC2,在端口 5432 上远程登录到 RDS。如果 telnet 正常工作,那么很明显可以从 EC2 连接到 RDS。
telnet rds_endpoint 5432
如果 [1] 不工作:检查 public 子网的路由 table 并确保为私有子网通信添加路由。再次执行 telnet。
如果在 AWS 端配置正确(SG,路由 table..),则问题与 sqlalchemy 有关。
尴尬的是,我的 RDS 端点(主机)最终出错了。它在我的配置文件中包含一个拼写错误。
“”我们不犯错误,只是快乐的小意外。”- 鲍勃·罗斯
我有一个 Flask 应用程序,我正尝试使用带有 EC2 的 ECS 和一个 postgres RDS 作为我的数据库将其部署到 AWS。
我的 EC2 实例在 public 子网中,我的 RDS 实例在私有子网中。两者在同一个 VPC 上。
通过使用 ssh 隧道进入我的 EC2 实例并将其用作堡垒主机,我成功地能够从我的本地计算机连接到 RDS 实例。我已经使用 pgadmin 和我在烧瓶应用程序中创建的自定义 cli 对此进行了测试。这样做时 - 我创建了我的数据库。
我可以 运行 我的 ECS 任务并在我的 EC2 public DNS 上使用我的应用程序。但是,如果我尝试使用使用我的 Flask-SQLAlchemy ORM 的功能(例如,向数据库提交表单),我会收到以下错误:
sqlalchemy.exc.InterfaceError: (pg8000.exceptions.InterfaceError) Can't create a connection to host
我在初始化我的应用程序时使用的数据库 URI 如下:
db_uri = 'postgres+pg8000://username:password@host:5432/db'
其中username是AWS RDS控制台中的“Master Username”,host是AWS RDS控制台中的“Endpoint”,db是我在本地ssh连接时创建的数据库名。
我的 EC2 有一个安全组,我的 RDS 有一个安全组。两者都在同一个 VPC 下。我在 RDS sg 上配置了入站规则,以允许来自端口 5432 上我的 EC2 私有 ipv4 地址的 TPC 流量。
我已经尝试修改 db_uri 并尝试使用我的 sg 规则,但到目前为止还没有成功。我假设当 运行在 ECS 本身上安装我的应用程序时我不需要 ssh 隧道。
从 EC2,在端口 5432 上远程登录到 RDS。如果 telnet 正常工作,那么很明显可以从 EC2 连接到 RDS。
telnet rds_endpoint 5432
如果 [1] 不工作:检查 public 子网的路由 table 并确保为私有子网通信添加路由。再次执行 telnet。
如果在 AWS 端配置正确(SG,路由 table..),则问题与 sqlalchemy 有关。
尴尬的是,我的 RDS 端点(主机)最终出错了。它在我的配置文件中包含一个拼写错误。
“”我们不犯错误,只是快乐的小意外。”- 鲍勃·罗斯