GCE实例执行gcloud billing命令返回0项无法获取结算数据如何解决
问题核心原因
GCE实例控制台显示的Allow full access to all Cloud APIs是实例层面的OAuth访问范围配置,不是IAM权限配置,这是最容易踩的认知误区:
- 访问范围是GCE早期推出的实例侧流量管控机制,仅限制实例能发起哪些云服务的API请求,哪怕开了全范围访问,只要调用请求携带的身份(也就是实例绑定的服务账号)没有对应资源的IAM权限,请求依然会被拦截
- 你本地执行命令能正常拉取数据,是因为本地gcloud用的是你的个人用户身份,该身份已经被授予了账单账号的查看权限;而GCE实例默认用绑定的服务账号发起请求,该账号默认不会被授予任何账单相关的跨资源权限。
修复步骤
- 先在GCE实例内确认当前激活的gcloud身份是绑定的服务账号,执行命令:
gcloud config get-value account
如果返回结果不是对应服务账号的邮箱,执行gcloud config set account <你的服务账号邮箱>切换到正确身份。
- 给服务账号授予账单查看所需的权限:
列出账单账号至少需要billing.accounts.list、billing.accounts.get两个权限,直接授予预定义的roles/billing.viewer(账单查看者)角色即可满足需求。注意:账单账号是独立于项目的层级资源,项目级的IAM绑定(哪怕给服务账号授项目Owner角色)不会继承账单账号权限,你需要进入云账单管理页面,在对应账单账号的权限配置页,把上述角色绑定给目标服务账号,而不是在项目IAM页面操作。
- 授权完成后等待1-2分钟权限生效,再在实例上执行原命令验证即可:
gcloud beta billing accounts list
其他可能的遗漏排查点
- 如果执行上述操作后依然返回空,先在实例上执行
gcloud components update升级gcloud到最新版本,排除旧beta版本的命令bug - 若你的资源归属于组织,检查组织策略是否开启了账单账号访问限制,这类策略会阻止未在白名单内的服务账号访问账单数据
- 已关闭的账单账号默认不会在列表中展示,可以追加
--show-closed参数执行命令,确认是否是账号状态导致的返回为空
内容的提问来源于stack exchange,提问作者BadProgrammer
相关产品推荐
相关产品推荐

