使用服务账号连接SQLAlchemy与Google Cloud Spanner时遭遇权限拒绝问题的技术求助
使用服务账号连接SQLAlchemy与Google Cloud Spanner时遭遇权限拒绝问题的技术求助
问题背景
我尝试从Google Cloud Spanner数据库中获取数据,已经做了以下权限配置:
- 创建了一个服务账号,给它分配了Owner基础角色(我本身就是项目所有者)
- 同时把自己添加为该服务账号的Service Account User和Service Account Admin角色,确保权限拉满
尝试过的操作
配置凭证环境变量
在Python代码中设置环境变量:import os os.environ["GOOGLE_APPLICATION_CREDENTIALS"]="c17-bot-dd3cca1bd2f3.json"也在终端手动执行了:
export GOOGLE_APPLICATION_CREDENTIALS="c17-bot-dd3cca1bd2f3.json"SQLAlchemy连接代码(第一种方式)
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"))SQLAlchemy连接代码(第二种方式,显式指定凭证)
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=credentials)} )
遇到的错误
不管用哪种方式,都会收到相同的权限拒绝错误:
google.api_core.exceptions.PermissionDenied: 403 Caller is missing IAM permission spanner.sessions.create on resource projects/c-17bot/instances/test-instance/databases/example-db.
额外信息:CLI方式可以成功获取数据
使用原生Spanner客户端的代码能够正常查询:
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的连接请求,才能让它成功获取Spanner的数据?
备注:内容来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

