服务帐户没有 storage.objects.get 对 Google 云存储的访问权限
service account does not have storage.objects.get access for Google Cloud Storage
我在 Google Cloud Console 中创建了一个服务帐户并选择了角色 Storage
/ Storage Admin
(即完全控制 GCS 资源)。
gcloud projects get-iam-policy my_project
似乎 实际选择了该角色:
- members:
- serviceAccount:my_sa@my_project.iam.gserviceaccount.com
role: roles/storage.admin
- members:
- serviceAccount:my_sa@my_project.iam.gserviceaccount.com
role: roles/storage.objectAdmin
- members:
- serviceAccount:my_sa@my_project.iam.gserviceaccount.com
role: roles/storage.objectCreator
并且 documentation 清楚地表明角色 roles/storage.admin
包含权限 storage.objects.*
(以及 storage.buckets.*
)。
但是当我尝试将该服务帐户与 Python 的 Google 云存储客户端库结合使用时,我收到此错误消息:
my_sa@my_project.iam.gserviceaccount.com does not have
storage.objects.get access to my_project/my_bucket.
那么为什么选择的角色在这种情况下还不够?
问题显然是服务帐户与太多角色相关联,这可能是之前配置尝试的结果。
这些步骤解决了问题:
- 删除了
IAM & Admin
/ IAM
下违规服务帐户(成员)my_sa
的所有(三个)角色
- 删除
my_sa
下的 IAM & Admin
/ Service accounts
- 重新创建
my_sa
(再次使用角色 Storage
/ Storage Admin
)
效果是这样的:
my_sa
在 IAM & Admin
/ IAM
下出现一个角色 (Storage Admin
)
my_sa
在 Storage
/ Browser
/ my_bucket
/ Edit bucket permissions
下显示为成员
值得注意的是,您需要等待几分钟 才能使权限生效,以防您刚刚分配权限。至少那是我之后发生的事情:
gcloud projects add-iam-policy-binding xxx --member
"serviceAccount:xxx@xxx.iam.gserviceaccount.com" --role "roles/storage.objectViewer"
转到您的存储桶的权限部分并打开您的存储桶的添加权限部分。例如gcloud告诉你的服务不足是;
1234567890-compute@developer.gserviceaccount.com
将此服务添加为用户,然后赋予这些角色;
- 云存储 - 存储管理员
- 云存储 - 存储对象管理
- 云存储 - 存储对象创建器
那么您应该有足够的权限来更改您的存储桶。
对我来说,这是因为部署了 "default-bucket"
作为存储模拟器所需的参数。
admin.storage().bucket('default-bucket'); // do not deploy that
为了修复它,我在 firebase 管理员初始化时设置了默认存储桶名称。
const admin = require('firebase-admin');
const config = process.env.FUNCTIONS_EMULATOR ? {
storageBucket: 'default-bucket',
} : {
storageBucket: 'YOUT_FIREBASE_STORAGE_BUCKET',
};
admin.initializeApp(config);
const bucket = admin.storage().bucket();
我在 Google Cloud Console 中创建了一个服务帐户并选择了角色 Storage
/ Storage Admin
(即完全控制 GCS 资源)。
gcloud projects get-iam-policy my_project
似乎
- members:
- serviceAccount:my_sa@my_project.iam.gserviceaccount.com
role: roles/storage.admin
- members:
- serviceAccount:my_sa@my_project.iam.gserviceaccount.com
role: roles/storage.objectAdmin
- members:
- serviceAccount:my_sa@my_project.iam.gserviceaccount.com
role: roles/storage.objectCreator
并且 documentation 清楚地表明角色 roles/storage.admin
包含权限 storage.objects.*
(以及 storage.buckets.*
)。
但是当我尝试将该服务帐户与 Python 的 Google 云存储客户端库结合使用时,我收到此错误消息:
my_sa@my_project.iam.gserviceaccount.com does not have storage.objects.get access to my_project/my_bucket.
那么为什么选择的角色在这种情况下还不够?
问题显然是服务帐户与太多角色相关联,这可能是之前配置尝试的结果。
这些步骤解决了问题:
- 删除了
IAM & Admin
/IAM
下违规服务帐户(成员) - 删除
my_sa
下的IAM & Admin
/Service accounts
- 重新创建
my_sa
(再次使用角色Storage
/Storage Admin
)
my_sa
的所有(三个)角色
效果是这样的:
my_sa
在IAM & Admin
/IAM
下出现一个角色 (my_sa
在Storage
/Browser
/my_bucket
/Edit bucket permissions
下显示为成员
Storage Admin
)
值得注意的是,您需要等待几分钟 才能使权限生效,以防您刚刚分配权限。至少那是我之后发生的事情:
gcloud projects add-iam-policy-binding xxx --member
"serviceAccount:xxx@xxx.iam.gserviceaccount.com" --role "roles/storage.objectViewer"
转到您的存储桶的权限部分并打开您的存储桶的添加权限部分。例如gcloud告诉你的服务不足是;
1234567890-compute@developer.gserviceaccount.com
将此服务添加为用户,然后赋予这些角色;
- 云存储 - 存储管理员
- 云存储 - 存储对象管理
- 云存储 - 存储对象创建器
那么您应该有足够的权限来更改您的存储桶。
对我来说,这是因为部署了 "default-bucket"
作为存储模拟器所需的参数。
admin.storage().bucket('default-bucket'); // do not deploy that
为了修复它,我在 firebase 管理员初始化时设置了默认存储桶名称。
const admin = require('firebase-admin');
const config = process.env.FUNCTIONS_EMULATOR ? {
storageBucket: 'default-bucket',
} : {
storageBucket: 'YOUT_FIREBASE_STORAGE_BUCKET',
};
admin.initializeApp(config);
const bucket = admin.storage().bucket();