使用Python google-cloud-billing库获取GCP项目成本报告的ServiceAccount配置问题
问题解答
关于ServiceAccount创建层级的疑问
项目层级创建ServiceAccount是完全可行的,不需要重新在其他层级创建。你遇到的“Billing Account Viewer角色不可用”问题,核心原因是这个角色属于账单账户层级权限,而非项目层级,所以无法在项目的IAM页面找到并绑定该角色。
ServiceAccount正确配置步骤
1. 为SA绑定账单账户层级权限
- 打开GCP控制台,进入「账单」页面,选择你要访问的目标账单账户
- 切换到「权限」标签页,点击「添加」按钮
- 在「新成员」输入框中,填入你的ServiceAccount邮箱(格式:
[SA名称]@[项目ID].iam.gserviceaccount.com) - 在「角色」搜索框中,找到并选择「Billing > Billing Account Viewer」角色,保存配置
2. 生成并配置SA密钥
- 回到GCP控制台的「IAM与管理员 > 服务账号」页面,找到你创建的SA
- 进入「密钥」标签页,点击「添加密钥 > 创建新密钥」
- 选择「JSON」格式,点击「创建」,将生成的密钥文件下载到本地安全位置
3. 代码中配置认证与调用示例
在Python代码中,你可以通过两种方式配置SA认证:
- 环境变量方式(推荐):
在终端执行:export GOOGLE_APPLICATION_CREDENTIALS="/本地路径/你的密钥文件.json" - 代码内加载密钥:
from google.cloud import billing_v1 # 初始化客户端 client = billing_v1.CloudBillingClient.from_service_account_json("/本地路径/你的密钥文件.json") # 获取指定账单账户下所有项目的账单信息 billing_account_id = "你的账单账户ID" # 格式类似:012345-ABCDEF-789012 billing_account_name = f"billingAccounts/{billing_account_id}" request = billing_v1.ListProjectBillingInfoRequest(name=billing_account_name) response = client.list_project_billing_info(request=request) # 遍历输出项目成本关联信息 for project_billing_info in response: print(f"项目ID: {project_billing_info.project_id}") print(f"项目名称: {project_billing_info.project_name}") print(f"账单启用状态: {project_billing_info.billing_enabled}\n")
额外说明
- 如果需要获取更细粒度的成本数据(比如按SKU、时间维度拆分),可以绑定「Billing Account Costs Manager」角色,该角色拥有更全面的账单数据访问权限
- 确保你的ServiceAccount所在的项目已关联到目标账单账户,否则无法访问该账单下的项目数据
内容的提问来源于stack exchange,提问作者ArunKumar
相关产品推荐
相关产品推荐

