如何使用flask_sqlalchemy和GCP TLS保护的数据库连接器?

问题描述 投票:0回答:1

我想将flask_sqlalchemy与GCP的数据库连接器一起使用,它可以按照此处所述进行自动TLS设置:https://cloud.google.com/sql/docs/postgres/connect-connectors#python_1

我在我的笔记本电脑上尝试了他们的示例代码,并通过 GOOGLE_APPLICATION_CREDENTIALS 设置了凭据,并且它有效。它能够连接到GCP上的远程数据库,我检查它是否使用wireshark进行了TLS加密,它成功地从数据库查询了数据。我用 sqlalchemy 1.4.47 运行了它。

我想将 GCP 连接器与使用 SQLALCHEMY_BINDS 的 Flask + Flask_sqlalchemy 应用程序一起使用。使用 sqlalchemy 1.4.47flask_sqlalcehmy 2.5.1 和如下代码:

...

from flask_sqlalchemy import SQLAlchemy
from google.cloud.sql.connector import Connector, IPTypes
import pg8000

...   

db: SQLAlchemy = SQLAlchemy()

def create_web_app():
    app = Flask('ex')
    ...

    ip_type = IPTypes.PUBLIC
    connector = Connector()

    def getconn() -> pg8000.dbapi.Connection:
        conn: pg8000.dbapi.Connection = connector.connect(
            app.config["GCPTSLPROTECTED_INSTANCE_CONNECTION_NAME"],
            "pg8000",
            user=app.config["GCPTSLPROTECTED_DB_USER"],
            password=app.config["GCPTSLPROTECTED_DB_PASS"],
            db=app.config["GCPTSLPROTECTED_DB_NAME"],
            ip_type=ip_type,
        )
        return conn

    app.config["SQLALCHEMY_BINDS"] = {
          "gcptslprotected": {
             # This URI looks funny but is what GCP docs request and works in the test script
             "url": make_url("postgresql+pg8000://"), 
             "creator": getconn }
    }

    ...
    # SQLALCHEMY_URI for a default db connection also gets created and works fine
    app.config['SQLALCHEMY_URI'] = "sqlite:///./tests/data/test.db"
    
    db.init_app(app)
    ...

上面的代码运行良好,但随后 Flask 应用程序中的路由使用数据库,从而引发此错误:

File "/home/bdc34/.pyenv/versions/browse310/lib/python3.10/site-packages/sqlalchemy/engine/create.py", line 516, in create_engine
u, plugins, kwargs = u._instantiate_plugins(kwargs)
AttributeError: 'dict' object has no attribute '_instantiate_plugins'

您可能会注意到我使用了 make_url(),而 GCP 示例脚本则没有。我这样做是为了解决由flask_sqlalchemy函数引发的异常

apply_driver_hacks()
,这不是最鼓舞人心的名字。

python google-cloud-platform sqlalchemy flask-sqlalchemy
1个回答
0
投票

我已成功复制您的问题。为了解决这个问题,我按照连接到 Cloud SQL for PostgreSQL 的快速入门进行操作。请注意,从其他服务(私有 IP、Cloud SQL Auth 代理、Cloud Run、Cloud Functions 等)连接还有其他步骤,可以在左侧窗格中找到。

以下是连接到 Cloud SQL for PostgreSQL 时需要检查的一些步骤:

  • 使用 Cloud Shell 运行
    gcloud services enable sqladmin.googleapis.com
    命令以启用本快速入门所需的 API。
  • 确保 Postgre 实例详细信息 (
    instance_connection_name
    db_user
    db_pass
    db_name
    ) 正确。
  • 确保安装
    pip install -r requirements.txt
    以安装所需的依赖项。您可以通过此 Github 链接检查其他步骤。
  • 由于我使用 Cloud Shell 部署它,所以我使用了
    gcloud sql connect [myinstance] --user=postgres
    。这提示我输入实例的密码。

连接到 Cloud Shell 时出现以下内容:

Allowlisting your IP for incoming connection for 5 minutes...done.                                                                                                        
Connecting to database with SQL user [db_user].Password: 
psql (15.4 (Debian 15.4-1.pgdg110+1), server 14.7)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.

postgres=> 

出于某种奇怪的原因,我重复了此步骤大约 9-10 次,因为我在部署项目时遇到了不同的错误。

如果上述步骤不起作用,您还可以提交错误,或者联系 Google Cloud 支持以获得有关您的问题的其他帮助。

如果成功请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.