当使用gcloud iam service-accounts list
时,我只看到那些由我创建的服务帐户。但由于脚本原因,我希望也获得GCP创建的那些帐户。
特别是我在找815330817453@cloudbuild.gserviceaccount.com
。由于我使用terraform创建GCP基础设施,因此我可以而不是依赖815330817453
作为标识符,因此需要通过gcloud
手动查找服务帐户。
然而,gcloud iam service-accounts list
没有列出cloudbuild.gserviceaccount.com
服务帐户(也没有任何其他类似的compute.gserviceaccount.com`
检查您的IAM角色,首先将角色IAM admin/Viewer添加到您的用户中,不要忘记将命令与筛选器一起使用--项目gcloud iam service-accounts list --project=PROJECTID
。还检查IAM&管理员界面->服务帐户如果你可以看到所有的服务帐户,这意味着你可以使用gcloud
命令列出它们,如果不是,你的用户正在扰乱角色
您的问题有几个重要的限定条件。
服务帐户在谷歌云平台中具有双重作用。服务帐户是(两者(资源和可以用作标识。
1.资源
服务帐户是在谷歌云平台项目中创建(拥有(的资源。
注意服务帐户也可以应用于非项目资源,以下内容不包括(不包括(这些绑定。
项目foo
拥有零个或多个服务帐户。对于项目(PROJECT
(,可以列举以下内容:
gcloud iam service-accounts list
--project=${PROJECT}
2.身份
项目foo
包括IAM策略,该策略可能引用零个或多个服务帐户。这些服务帐户可以在任何谷歌云平台项目中创建(归其所有((而不仅仅是引用它们的项目策略(。这些服务帐户包括谷歌管理的服务帐户,例如域gserviceaccount.com
中的服务帐户。
要枚举这些服务帐户,需要一个不同的命令。对于项目(PROJECT
(,可以列举以下内容:
gcloud projects get-iam-policy ${PROJECT}
--flatten="bindings[].members[]"
--filter="bindings.members~"serviceAccount:""
--format="value(bindings.members.split(sep=":").slice(1))"
这有点粗糙:
--flatten
将bindings
切片分解为更易于使用的块--filter
筛选组块以仅包括服务帐户--format
将serviceAccount:foo
解析为foo
gcloud
提供了不错的过滤和格式化,但是,如果您更喜欢像jq
这样的通用工具,那么:
FILTER='
.bindings[].members[]
|select(. | startswith("serviceAccount:"))
|.[15:]
'
gcloud projects get-iam-policy ${PROJECT}
--format="json"
| jq -r "${FILTER}"
说明:
- 这些对象的
.binding[].members[]
select(. | startswith("serviceAccount:"))
选择serviceAccount:
.[15:]
剥离serviceAccount:
(15(离开账户电子邮件