使用服务帐户将 SQLAlchemy 与 Google Cloud Spanner 连接

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

我尝试从 Google Cloud Spanner 数据库检索数据。我创建一个服务帐户,为其配备基本角色“所有者”,以确保最大范围的权限。 (我本人是该项目的所有者)。我还将自己添加为服务帐户用户角色和服务帐户管理员角色,只是为了最大限度地发挥我的权利和权限。

从该服务帐户中,我创建服务帐户 JSON 凭据。我通过 python 代码中的环境变量提供对此 json 文件的访问:

import os 
os.environ["GOOGLE_APPLICATION_CREDENTIALS"]="c17-bot-dd3cca1bd2f3.json"

并确保我在终端中输入:

导出 GOOGLE_APPLICATION_CREDENTIALS="c17-bot-dd3cca1bd2f3.json"

这是我的Python代码:

from sqlalchemy import create_engine, text
    
engine = create_engine(
            "spanner+spanner:///projects/c-17bot/instances/test-instance/databases/example-db"})
with engine.connect() as conn:
     result = conn.execute(text("SELECT SingerId, AlbumId, AlbumTitle FROM Albums"))

为了真正让大家明白 json 凭据被考虑的这一点,我还运行了代码:

credentials = service_account.Credentials.from_service_account_file("c17-bot-dd3cca1bd2f3.json")
engine = create_engine(
    "spanner+spanner:///projects/c-17bot/instances/test-instance/databases/example-db",
        connect_args={'client': spanner.Client(project="c-17bot", credentials = creds)}
)

在每种情况下,我总是收到错误:

google.api_core.exceptions.PermissionDenied:403 调用者缺少 IAM 资源上的权限 spanner.sessions.create 项目/c-17bot/实例/测试实例/数据库/example-db。

我必须为服务帐户分配哪些角色和/或如何成功地将凭据传递给连接请求,以便 SQLAlchemy 成功检索数据?

更多信息:

基于 CLI 成功检索数据:

instance_id = "test-instance"
database_id = "example-db"
instance = spanner_client.instance(instance_id)
database = instance.database(database_id)
    with database.snapshot() as snapshot:
        results = snapshot.execute_sql(
            "SELECT SingerId, AlbumId, AlbumTitle FROM Albums"
        )
    
        for row in results:
            print("SingerId: {}, AlbumId: {}, AlbumTitle: {}".format(*row))
sqlalchemy permissions credentials google-cloud-spanner
1个回答
0
投票

您能解决这个问题吗?

数据库用户或读者角色就足够了。

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