如何从启用Requester Pays的GCP存储桶复制数据到Azure Storage
开启Requester Pays模式的GCS存储桶,要求所有访问请求必须携带userProject参数,明确指定承担本次请求产生的API调用费、流量出口费的GCP项目ID。AzCopy、Azure Data Factory默认的GCS连接器不会自动携带该参数,是触发400 Bad Request错误的直接原因。持有有效GCP服务账号凭据的前提下,按以下步骤完成额外配置即可正常复制数据。
前置权限校验
先确认服务账号和计费项目满足以下要求,避免配置完成后出现权限报错:
- 服务账号对源GCS存储桶至少拥有
storage.objects.list、storage.objects.get权限 - 准备用于承担费用的GCP项目已开启Cloud Storage计费,且服务账号对该项目拥有
serviceusage.services.use权限,允许项目扣取对应服务费用 - 确认填写的是GCP项目ID(全局唯一、通常带数字后缀),而非项目显示名,可在GCP控制台项目选择器中直接查看对应值
AzCopy 配置步骤
- 先配置凭据环境变量,指定本地存储的GCP服务账号JSON密钥路径:
# Windows PowerShell 环境 $env:GOOGLE_APPLICATION_CREDENTIALS="C:\path\to\your\gcp-sa-key.json" # Linux/macOS 环境 export GOOGLE_APPLICATION_CREDENTIALS="/path/to/your/gcp-sa-key.json" - 执行复制命令时,在源GCS地址末尾追加
userProject查询参数,指定计费项目ID,示例命令:azcopy copy "https://storage.googleapis.com/your-source-bucket?userProject=your-gcp-billing-project-12345" "https://your-storage-account.blob.core.windows.net/target-container/?your-azure-sas-token" --recursive
如果需要复制桶内指定前缀的对象,将对象前缀放在桶名后、查询参数前即可,例如https://storage.googleapis.com/your-source-bucket/log/202408/?userProject=your-gcp-billing-project-12345
Azure Data Factory 配置步骤
ADF的GCS链接服务配置界面默认没有暴露Requester Pays相关配置项,需要手动添加附加连接属性:
- 进入已创建的GCS链接服务编辑页,确认已选服务账号密钥认证方式,且密钥上传校验正常
- 拉到页面最底部找到「附加连接属性」板块,点击新增属性
- 属性名称填
userProject,属性值填你的GCP计费项目ID,属性类型选择String - 测试连接通过后保存链接服务即可,数据集、复制活动无需额外调整
如果你通过JSON代码直接编辑链接服务,在
typeProperties节点下新增userProject字段即可,配置片段参考:"typeProperties": { "serviceAccountKey": { "type": "SecureString", "value": "your-service-account-json-content" }, "userProject": "your-gcp-billing-project-12345" }
常见报错排查
- 配置完成后仍返回400错误:优先检查
userProject对应的取值是否为正确的GCP项目ID,不要填项目名、桶名 - 配置完成后返回403错误:依次检查服务账号是否有源桶的对象读取权限、是否有计费项目的服务使用权限、计费项目是否未限制GCS API调用
- 费用说明:跨云复制产生的GCS出口流量费、API调用费将全部从你指定的
userProject项目中扣除,不会向桶所属项目计费
内容的提问来源于stack exchange,提问作者Karina Agudelo
相关产品推荐
相关产品推荐

