使用gcloud storage rsync同步GCP与S3桶时遇AccessDenied错误求助
我正尝试同步GCP存储桶与AWS S3存储桶的内容,已完成以下配置:
- GCP本地认证:
gcloud auth application-default login - AWS SSO认证:
aws sso login --sso-session mysession - 设置AWS假定身份并配置安全令牌:
aws configure export-credentials export AWS_SECURITY_TOKEN=$AWS_SESSION_TOKEN
执行同步命令时持续报错:
gcloud storage rsync gs://gcp_bucket_name s3://aws_s3_name --recursive
错误信息:
⠏ERROR: AccessDenied: Access Denied4GiB | 24.2B/s ⠏ERROR: AccessDenied: Access Denied4GiB | 24.2B/s ⠧ERROR: AccessDenied: Access Denied4GiB | 24.2B/s
请问我遗漏了什么配置?是否需要为AWS登录分配额外权限?
1. 确认AWS身份的S3权限
AccessDenied最常见的原因是当前AWS身份权限不足,需根据同步方向确保SSO角色具备对应权限:
- 从GCP同步到S3:需要
s3:ListBucket(查看桶内容)、s3:PutObject(上传文件),若启用同步删除还需s3:DeleteObject - 双向同步:额外添加
s3:GetObject(下载S3文件)权限
可通过以下命令验证当前身份权限:
aws s3api get-bucket-acl --bucket aws_s3_name
若该命令也返回AccessDenied,需联系AWS管理员为SSO角色添加对应S3权限策略。
2. 验证AWS环境变量是否正确加载
手动设置AWS_SECURITY_TOKEN可能遗漏其他必要凭证,建议直接用命令自动导出所有有效变量:
eval $(aws configure export-credentials --format env)
执行后用以下命令确认变量存在:
env | grep AWS_
需确保AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_SESSION_TOKEN三个变量均有有效值(AWS_SECURITY_TOKEN为旧变量名,部分工具仅识别AWS_SESSION_TOKEN)。
3. 检查GCP凭据权限(若涉及S3到GCP同步)
如果同步包含从S3到GCP的方向,需确认GCP应用默认凭据对应的账号有GCS的storage.objects.get(读取)、storage.objects.create(写入)权限,可通过以下命令验证:
curl -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" https://storage.googleapis.com/storage/v1/b/gcp_bucket_name/o
若返回403,需为对应GCP服务账号添加Storage Object Admin或更细粒度的权限。
4. 排查S3桶的访问限制
部分S3桶可能通过桶策略或VPC端点规则限制访问:
- 检查桶策略是否存在拒绝当前身份访问的条目
- 确认本地终端IP不在桶的访问黑名单中,或桶未限制仅允许特定VPC内访问
5. 用AWS CLI直接验证S3访问权限
跳过gcloud工具,先用AWS CLI测试S3操作,定位问题来源:
# 列出桶内容 aws s3 ls s3://aws_s3_name # 上传测试文件 echo "test" > test.txt aws s3 cp test.txt s3://aws_s3_name/test.txt # 下载测试文件 aws s3 cp s3://aws_s3_name/test.txt test_download.txt
若这些命令均报错AccessDenied,问题出在AWS身份权限或凭证;若能正常操作,再排查gcloud工具的兼容性问题。
6. 更新gcloud到最新版本
旧版本gcloud storage可能存在AWS SSO凭证兼容问题,执行以下命令更新:
gcloud components update
内容的提问来源于stack exchange,提问作者j45612

