无法通过 api 为服务帐户创建 cloudsql 角色

Posted

技术标签:

【中文标题】无法通过 api 为服务帐户创建 cloudsql 角色【英文标题】:Can't create cloudsql role for Service Account via api 【发布时间】:2018-02-20 11:35:22 【问题描述】:

我一直在尝试使用 api 在 GCP 中创建服务帐户。

要创建服务帐户,我发送以下发布请求:

base_url = f"https://iam.googleapis.com/v1/projects/project/serviceAccounts"
auth = f"?access_token=access_token"
data = "accountId": name
# Create a service Account
r = requests.post(base_url + auth, json=data)

这会返回 200 并创建一个服务帐户:

然后,这是我用来创建特定角色的代码:

sa = f"name@dotmudus-service.iam.gserviceaccount.com"
sa_url = base_url + f'/sa:setIamPolicy' + auth
data = "policy":
    "bindings": [
        
            "role": roles,
            "members":
                [
                    f"serviceAccount:sa"
                ]
        
    ]

如果角色设置为roles/viewerroles/editorroles/owner 之一,则此方法确实有效。 但是,如果我想使用,特别是roles/cloudsql.viewer api 告诉我不支持此选项。

这里是角色。 https://cloud.google.com/iam/docs/understanding-roles

我不想为此服务帐户授予我项目的完整查看者权限,这违反了最小权限原则。

如何通过 api 设置特定角色?

编辑:

这是使用资源管理器 api 的响应:roles/cloudsql.admin 作为角色

POST https://cloudresourcemanager.googleapis.com/v1/projects/project:setIamPolicy?key=YOUR_API_KEY


 "policy": 
  "bindings": [
   
    "members": [
     "serviceAccount:sa@project.iam.gserviceaccount.com"
    ],
    "role": "roles/cloudsql.viewer"
   
  ]
 




  "error": 
    "code": 400,
    "message": "Request contains an invalid argument.",
    "status": "INVALID_ARGUMENT",
    "details": [
      
        "@type": "type.googleapis.com/google.cloudresourcemanager.projects.v1beta1.ProjectIamPolicyError",
        "type": "SOLO_REQUIRE_TOS_ACCEPTOR",
        "role": "roles/owner"
      
    ]
  

【问题讨论】:

我在这里面临同样的问题。您是如何解决这个问题的? 我通过roles.get 提取整个策略对象解决了这个问题。然后将所需角色附加到对象并使用 data = 整个 json 对象调用此 api。 【参考方案1】:

使用提供的代码,您似乎附加到第一个base_url,这不是修改项目角色的正确上下文。

这将尝试将附加路径放置到:https://iam.googleapis.com/v1/projects/project/serviceAccount

添加角色的POST路径需为:https://cloudresourcemanager.googleapis.com/v1/projects/project]:setIamPolicy

如果您从base_url 中删除/serviceAccounts,它应该可以工作。

编辑回复以添加更多信息

好的,我在这里看到了问题,抱歉,我必须设置一个新项目来测试它。

cloudresourcemanager.projects.setIamPolicy 需要替换整个策略。看来您可以为更改的内容添加约束,但您必须为项目提交完整的 json 策略。

请注意,gcloud 有一个 --log-http 选项,可以帮助您解决其中的一些问题。如果你运行

gcloud projects add-iam-policy-binding $PROJECT --member serviceAccount:$NAME --role roles/cloudsql.viewer --log-http 

它将向您展示它如何提取现有的现有策略、附加新角色并添加它。

如果您不想使用 gcloud 或控制台将角色添加给用户,我建议您使用 example code provided here 进行这些更改,因为这可能会影响整个项目。

希望他们改进 API 以满足这一需求。

【讨论】:

请查看我更新的问题。似乎我为服务帐户创建角色的格式错误。虽然我找不到更好的文档。 由于 cmets 空间不足,我在帖子中添加了更多信息。 感谢--log-http option。真的很有帮助。

以上是关于无法通过 api 为服务帐户创建 cloudsql 角色的主要内容,如果未能解决你的问题,请参考以下文章