我正在尝试将 gzipped postgres 转储文件上传到 gcp 存储。我在带有图像的 docker 容器中运行它
google/cloud-sdk:alpine
(我也尝试过本地 gcloud 安装):
gcloud storage mv file.dump.gz gs://my-bucket/
我通过将
gcloud
环境变量指向 json 密钥文件来使用 CLOUDSDK_AUTH_CREDENTIAL_FILE_OVERRIDE
的服务帐户身份验证(我也尝试过 GOOGLE_APPLICATION_CREDENTIALS
和 GOOGLE_GHA_CREDS_PATH
)。
服务帐户具有“存储对象管理员”角色。
该存储桶具有“Nearline”存储类别,生命周期删除时间为 5 天。
当我尝试上传一个小文件(我测试的最大文件是 14MB)时,它可以工作,但是当我尝试上传一个大文件(我测试失败的最小文件是 201MB)时,它会失败并出现错误
错误:(gcloud.storage.mv)用户[无]无权访问b实例[my-bucket](或者可能不存在):没有storage.buckets.get访问Google Cloud Storage存储桶的权限。资源上的权限“storage.buckets.get”被拒绝(或者它可能不存在)。
如何上传大文件而不出现权限错误?
看来您需要“存储管理员”角色才能上传大文件!
对于任何测试者来说,添加权限(例如从“存储对象管理”到“存储管理”)似乎会立即发生,而删除权限(例如从“存储管理”到“存储对象管理”)可能会立即发生几分钟即可应用。
gcloud 使用称为“并行复合上传”的机制来加速文件传输到 GCS,如下所述:https://cloud.google.com/storage/docs/parallel-composite-uploads gcloud 在使用前会检查存储桶的默认存储类别和保留期限与并行复合上传的兼容性。因此,它向存储桶执行
GET
请求。此请求需要调用者服务帐户的
storage.buckets.get
权限。选项1
roles/storage.admin
之类的角色,其中包括
storage.buckets.get
权限。选项2
gcloud config set parallel_composite_upload_enabled false
选项3
gcloud config set parallel_composite_upload_compatibility_check false
这些是我找到的选项,列表可能并不详尽。