You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用GCP服务账号认证从AWS S3下载对象至本地遇哈希错误

问题

使用GCP服务账号访问AWS S3存储桶并下载对象到本地时,执行gsutil cp或gcloud storage cp命令触发gslib.exception.HashMismatchException md5 signature computed for local file错误,但能正常列出S3对象,且AWS CLI可正常下载目标文件。已尝试S3到GCS自动传输(不符合需求)、联邦身份访问两种方法,仍未解决问题,需要修复哈希不匹配错误,或找到其他通过GCP服务账号+GCP CLI下载S3对象到本地的可行方案。

相关命令及现象:

  • 报错命令:
gsutil cp s3://bucket-name/image.png ./
gcloud storage cp s3://bucket/image.png ./
  • 可正常执行的命令:
gsutil ls s3://bucket-name/image.png
aws s3api get-object --bucket bucket-name --key image.png abc.png

修复HashMismatchException错误

1. 跳过哈希校验

直接禁用GCP工具的哈希校验逻辑,强制完成下载:

  • 使用gsutil:
gsutil -h "x-goog-skip-hash-check: true" cp s3://bucket-name/image.png ./
  • 使用gcloud storage:
gcloud storage cp --no-hash-check s3://bucket-name/image.png ./

注意:此方法会跳过文件完整性校验,下载后建议自行验证文件(比如对比AWS CLI下载的文件哈希)。

2. 排查S3对象的ETag格式

AWS S3中,分段上传的对象其ETag会包含分段数量(格式如"abc123-5"),而GCP工具默认用标准MD5值做校验,导致不匹配。可以先查看对象的ETag确认:

aws s3api head-object --bucket bucket-name --key image.png | jq '.ETag'

如果ETag带短横线后缀,说明是分段上传对象,此时使用跳过哈希校验的方法是合理的。

3. 更新GCP CLI/gsutil版本

旧版本的GCP工具可能存在S3哈希处理的兼容性问题,更新到最新版本:

gcloud components update

替代实现方法

1. 基于联邦身份获取AWS临时凭证,用AWS CLI下载

通过GCP服务账号获取AWS临时凭证后,使用AWS CLI完成下载,既满足GCP服务账号认证的要求,又避免GCP工具的哈希问题:

  1. 获取GCP身份令牌:
gcloud auth print-identity-token > token.txt
  1. 调用AWS STS获取临时凭证(需提前配置好AWS IAM角色的联邦身份信任关系):
aws sts assume-role-with-web-identity \
  --role-arn arn:aws:iam::AWS_ACCOUNT_ID:role/YOUR_FEDERATED_ROLE \
  --role-session-name gcp-sa-session \
  --web-identity-token file://token.txt
  1. 提取返回结果中的AccessKeyId、SecretAccessKey、SessionToken,设置环境变量:
export AWS_ACCESS_KEY_ID="你的临时AccessKey"
export AWS_SECRET_ACCESS_KEY="你的临时SecretKey"
export AWS_SESSION_TOKEN="你的临时SessionToken"
  1. 用AWS CLI下载对象:
aws s3 cp s3://bucket-name/image.png ./

2. 临时借助GCS中转

如果允许临时将对象存储到GCS,可通过中转实现下载:

  1. 将S3对象复制到GCS(跳过哈希校验):
gsutil -h "x-goog-skip-hash-check: true" cp s3://bucket-name/image.png gs://your-gcs-bucket/temp-image.png
  1. 从GCS下载到本地:
gsutil cp gs://your-gcs-bucket/temp-image.png ./
  1. 可选:删除GCS临时文件:
gsutil rm gs://your-gcs-bucket/temp-image.png

内容的提问来源于stack exchange,提问作者Shashank motruri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 21:15:42