无法通过 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 角色的主要内容,如果未能解决你的问题,请参考以下文章

无法使用服务帐户授权连接到自己的 GAE 端点 API

允许通过 API v3 访问 Google 服务帐户 YouTube 上传访问权限

如何使用 REST API 从服务帐户凭据创建访问令牌?

通过服务帐户在 APP 脚本上使用 BigQuery API

无法将PayPal沙盒帐户链接到第三方权限

Kubernetes 集群中的 Cloud SQL 代理:需要哪些服务帐户权限?