我尝试从 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))
您能解决这个问题吗?
数据库用户或读者角色就足够了。