我正试图通过AlloyDB-auth代理连接到谷歌云中的AlloyDB。我无法成功连接到它。我在尝试这样做时出错了。
我遵循了中提到的说明https://cloud.google.com/alloydb/docs/auth-proxy/connect#python和https://github.com/GoogleCloudPlatform/alloydb-auth-proxy#example-调用
我在后台使用FastAPI,并使用sqlalchemy。
SQLALCHEMY_DATABASE_URL = "postgresql+psycopg2://<user>:<password>@
localhost/postgres"
engine = create_engine(SQLALCHEMY_DATABASE_URL)
SesionLocal = sessionmaker(bind=engine, autocommit=False, autoflush=True)
我使用凭据启动身份验证代理
alloydb-auth-proxy "projects/<project-id>/locations/<region>/clusters/<database-id>/instances/<instance-id>" --credentials-file "key.json"
我将地址和端口保留为默认值,即地址到127.0.0.1
和端口5432
。
代理启动
[projects/<project-id>/locations/<region>/clusters/<database-id>/instances/<instance-id>] Listening on 127.0.0.1:5432
The proxy has started successfully and is ready for new connections!
但当我运行应用程序时,它在控制台中给我带来了一个错误-
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) connection to server at "localhost" (::1), port 5432 failed: Connection refused (0x0000274D/10061)
Is the server running on that host and accepting TCP/IP connections?
connection to server at "localhost" (127.0.0.1), port 5432 failed: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
并且在代理cmd 中
[projects/<project-id>/locations/<region>/clusters/<database-id>/instances/<instance-id>] failed to connect to instance: Dial error: failed to dial (instance URI = "<project-id>/<region-id>/
<database-id>/<instance-id>"): dial tcp xx.xx.xx.x:5433: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
这里发生了什么?
AlloyDB目前只能选择通过私有IP连接到它。这意味着,无论您的连接方法(auth-proxy、Python连接器、直接连接等(如何,您的本地计算机都将无法访问集群。
要进行连接,您需要从与AlloyDB集群相同的网络(VPC(中进行连接,或者您需要设置一个类似堡垒的实例,该实例具有与Alloy DB集群共享网络的公共入口点。
要测试这一点,最简单的方法是在与AlloyDB集群相同的VPC上启动最小的GCE实例。然后SSH进入该实例,并使用psql客户端确认您可以连接到AlloyDB实例。一旦您确认了这一点,为了进行开发,您要么需要将应用程序推送到该GCE实例以进行连接,要么在您和GCE实例之间建立一些连接。
有几种方法可以做到这一点,我建议尽可能严格地锁定GCE实例,并从本地计算机反向SSH隧道到该实例。或者设置VPN(云VPN是一种选择,但相当昂贵,所以在GCE实例上运行自己的VPN服务是一种选项,只是增加了开销和维护(。你也可以在bastion实例上设置一个Socks5代理,从那里转发到你的AlloyDB集群,这也可以。