gcloud storage是否对公共数据传输计费?请求头自动设置问题咨询
问题核心确认
你的理解完全正确:gcloud storage默认会将你配置的项目通过X-Goog-User-Project请求头发送给GCS,这会导致访问未启用请求者付费的公共存储桶时,数据传输费用计入你的项目,而非公共存储桶的所有者。
行为差异与原因
gsutil vs gcloud storage 默认行为
gsutil:默认情况下,访问公共存储桶时不会添加X-Goog-User-Project头,费用由存储桶所有者承担。gcloud storage:当你通过gcloud init配置了默认项目后,会自动为所有GCS请求附加X-Goog-User-Project头,无论目标存储桶是否启用请求者付费模式。
文档依据(转述)
- 针对未启用请求者付费的存储桶:即使请求携带了计费项目头,GCS也会接受该请求,并将相关费用计入请求中指定的项目。
X-Goog-User-Project头的作用是指定承担请求费用的项目,不仅适用于请求者付费存储桶,也会作用于公共存储桶的请求。
测试验证
你的测试结果已经明确印证了这一点:
gsutil -d ls gs://gcp-public-data--broad-references的请求头中无X-Goog-User-Projectgcloud --log-http storage ls gs://gcp-public-data--broad-references的请求头自动包含了默认项目作为X-Goog-User-Project- 访问请求者付费存储桶
gs://gnomad-public-requester-pays时,gsutil因缺少项目头报错,而gcloud storage自动附加头后成功访问,进一步证明了自动附加行为。
解决方案
要避免为公共数据传输付费,有两种方式:
临时单命令禁用
在执行gcloud storage命令时添加--no-user-project参数,示例:
gcloud storage ls gs://gcp-public-data--broad-references --no-user-project
此命令不会附加X-Goog-User-Project头,费用由公共存储桶所有者承担。
全局配置禁用
如果希望所有gcloud storage请求默认都不附加该头,执行以下配置命令:
gcloud config set storage/user_project_enabled false
配置生效后,后续所有gcloud storage请求都不会自动添加X-Goog-User-Project头,和gsutil的默认行为一致。
内容的提问来源于stack exchange,提问作者kshakir
相关产品推荐
相关产品推荐

