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

时间:2017-09-12 06:05:55

标签: python-requests google-cloud-platform

我一直在尝试使用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"
      }
    ]
  }
}

1 个答案:

答案 0 :(得分:1)

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

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

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

如果您从/serviceAccounts移除base_url,它应该可以使用。

修改了由于您的修改而添加更多信息的响应

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

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。