授予、更改和撤消对资源的访问权限

本页介绍了如何授予、更改和撤消对资源的访问权限。对于您所拥有的资源,您可以使用精确的 IAM 角色,将不同级别的访问权限授予不同的用户。

本页中的示例展示了如何修改对项目的访问权限。不过,您可以调整这些步骤,修改对支持 IAM 政策的任何 Google Cloud 资源的访问权限。如需详细了解如何修改对特定资源的访问权限,请参阅相应资源的参考文档。

您可以通过 Cloud Console、gcloud 命令行工具、REST API 或客户端库管理用户角色。使用 Cloud Console 是最简单的一种方法,本文前半部分将介绍此方法以及如何使用 gcloud 命令行工具进行快速更新。后半部分将介绍如何使用编程方法处理较为复杂的场景。

如果要将 IAM 与 Identity-Aware Proxy (IAP) 配合使用,以确保对应用的访问安全无虞,请参阅 IAP 文档

准备工作

使用 Cloud Console

使用 Cloud Console 是管理用户角色的一种快速、简便的方法。

授予访问权限

要将团队成员添加到项目并授予他们 IAM 角色,请执行以下操作:

  1. 在 Cloud Console 中,转到 IAM 页面。

    转到 IAM 页面

  2. 点击添加

  3. 输入电子邮件地址。您可以将个人、服务帐号或 Google 网上论坛群组添加为成员,但每个项目必须至少有一名个人成员。

  4. 选择角色。角色可赋予成员相应级别的权限。按照确保安全性的最佳做法,我们强烈建议向成员授予其所需的最小权限。拥有“Owner”级别权限的成员同时也是项目所有者,可以管理项目的所有方面,包括关停项目。

  5. 点击保存

要向成员授予多个项目的角色,请执行以下操作:

  1. 在 Cloud Console 中,转到管理资源页面。

    打开“管理资源”页面

  2. 选择要授予权限的所有项目。

  3. 点击显示信息面板,然后点击权限标签页。

  4. 新成员字段中输入电子邮件地址,然后从下拉菜单中选择所需角色。

  5. 点击保存。系统会在各个选中的项目中将已选定的角色授予相应成员。

撤消访问权限

  1. 在 Cloud Console 中,转到 IAM 页面。

    转到 IAM 页面

  2. 找到要撤消其访问权限的成员,然后点击右侧的修改 按钮。

  3. 点击要撤消的每个角色对应的删除 按钮,然后点击保存

修改访问权限

修改访问权限没有特殊程序。您只需按照授予和撤消访问权限的步骤操作,直到用户具有相应角色即可。

使用 gcloud 快速更新

您可以使用 gcloud 命令行工具add-iam-policy-bindingremove-iam-policy-binding 命令添加或撤消单个角色。

授予访问权限

要快速向成员授予角色,请运行 gcloud 工具的 add-iam-policy-binding 命令:

gcloud group add-iam-policy-binding resource \
    --member=member --role=role-id

请提供以下值:

  • group:您要更新的资源的 gcloud 工具组。例如,您可以使用 projectsorganizations
  • resource:资源的名称。
  • member:成员的标识符,通常其格式如下:member-type:id。例如 user:my-user@example.com。如需 member 可以采用的值的完整列表,请参阅政策绑定参考文档

  • role-id:角色的名称。

例如,要针对项目 my-project 向用户 my-user@example.com 授予“Viewer”角色,请使用以下命令:

gcloud projects add-iam-policy-binding my-project \
    --member=user:my-user@example.com --role=roles/viewer

撤消访问权限

要快速撤消用户的角色,请运行 gcloud 工具的 remove-iam-policy-binding 命令:

gcloud group remove-iam-policy-binding resource \
    --member=member --role=role-id

请提供以下值:

  • group:您要更新的资源的 gcloud 工具组。例如,您可以使用 projectsorganizations
  • resource:资源的名称。
  • member:成员的标识符,通常其格式如下:member-type:id。例如 user:my-user@example.com。如需 member 可以采用的值的完整列表,请参阅政策绑定参考文档

  • role-id:角色的名称。

例如,如需撤消项目 my-project 的用户 my-user@example.comViewer 角色,请使用以下命令:

gcloud projects remove-iam-policy-binding my-project \
    --member=user:my-user@example.com --role=roles/viewer

以编程方式控制访问权限

在某些使用场景中,以编程方式管理访问权限控制更加轻松。您可以使用 gcloud 命令行工具REST API客户端库以编程方式控制访问权限。在以下场景中,编程方法非常有用:在 Cloud Console 中执行大规模更新或自动更新(这很耗时),或对每个成员运行 gcloud 命令。

IAM 政策概览

您可以通过 IAM 政策管理对资源的访问权限。政策是将成员(例如用户帐号或服务帐号)与角色关联起来的多个绑定的统称。政策使用 JSON 或 YAML 表示。

以下示例显示了一个政策,其中 fatima@example.com 已被授予“Owner”角色,wei@example.comservice-account-13@appspot.gserviceaccount.com 已被授予“Editor”角色:

{
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:fatima@example.com"
      ]
    },
    {
      "role": "roles/editor",
      "members": [
        "serviceAccount:service-account-13@appspot.gserviceaccount.com",
        "user:wei@example.com"
      ]
    }
  ],
  "etag": "BwUjMhCsNvY=",
  "version": 1
}

您可以使用“读取-修改-写入”模式更新资源的政策。也就是说,创建、修改或撤消用户访问权限所采用的方法并无不同。相反,所有修改均通过以下方式进行:

  1. 通过调用 getIamPolicy() 读取当前政策。
  2. 使用文本编辑器或以编程方式修改返回的政策,以添加或移除任何目标成员以及为其授予的角色。
  3. 通过调用 setIamPolicy() 写入更新后的政策。

为整个项目或组织授予权限是很常见的做法。但是,您还可以针对各种 Google Cloud 资源(例如 Compute Engine 实例Cloud Storage 存储分区)更精细地设置政策。如需查看角色的完整列表以及可以授予各角色的最低资源级别,请参阅了解角色

以下几个部分展示了如何获取、修改和设置项目的政策。不过,您可以调整这些说明,获取、修改和设置可拥有自己的 IAM 政策的任何资源的政策。要修改除项目之外的资源的政策,请找到相应资源的 get-iam-policyset-iam-policy gcloud 命令,或 getIamPolicy()setIamPolicy() REST API 方法。然后,在本页面的获取当前政策设置政策部分中使用这些命令或方法。

获取当前政策

gcloud 命令

运行资源的 get-iam-policy 命令。以下示例展示了项目的 get-iam-policy 命令:

gcloud projects get-iam-policy project-id --format=format > filepath

请提供以下值:

  • project-id:要更新的项目(例如 my-project)。
  • format:值 jsonyaml
  • filepath:指向政策的新输出文件的路径。

例如,以下命令以 JSON 格式获取项目 my-project 的政策,并将其保存到用户的主目录:

gcloud projects get-iam-policy my-project --format json > ~/policy.json

REST API

Resource Manager API 的 projects.getIamPolicy 方法可获取项目的 IAM 政策。

在使用下面的任何请求数据之前,请先进行以下替换:

  • project-id:您的 Google Cloud 项目 ID。
  • policy-version:要返回的政策版本。请求应指定最新的政策版本,即政策版本 3。如需了解详情,请参阅在获取政策时指定政策版本

HTTP 方法和网址:

POST https://cloudresourcemanager.googleapis.com/v1/projects/project-id:getIamPolicy

请求 JSON 正文:

{
  "options": {
    "requestedPolicyVersion": policy-version
  }
}

如需发送您的请求,请展开以下选项之一:

您应该会收到类似以下内容的 JSON 响应:

{
  "version": 1,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:project-owner@example.com"
      ]
    },
    {
      "role": "roles/iam.securityReviewer",
      "members": [
        "user:fatima@example.com"
      ]
    }
  ]
}

C#

在试用此示例之前,请按照《IAM 快速入门:使用客户端库》中的 C# 设置说明进行操作。如需了解详情,请参阅 IAM C# API 参考文档


using Google.Apis.Auth.OAuth2;
using Google.Apis.CloudResourceManager.v1;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy GetPolicy(string projectId)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(CloudResourceManagerService.Scope.CloudPlatform);
        var service = new CloudResourceManagerService(
            new CloudResourceManagerService.Initializer
            {
                HttpClientInitializer = credential
            });

        var policy = service.Projects.GetIamPolicy(new GetIamPolicyRequest(),
            projectId).Execute();
        return policy;
    }
}

Java

在试用此示例之前,请按照《IAM 快速入门:使用客户端库》中的 Java 设置说明进行操作。如需了解详情,请参阅 IAM Java API 参考文档

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.cloudresourcemanager.CloudResourceManager;
import com.google.api.services.cloudresourcemanager.model.GetIamPolicyRequest;
import com.google.api.services.cloudresourcemanager.model.Policy;
import com.google.api.services.iam.v1.IamScopes;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

public class GetPolicy {

  // Gets a project's policy.
  public static Policy getPolicy(String projectId) {
    // projectId = "my-project-id"

    Policy policy = null;

    CloudResourceManager service = null;
    try {
      service = createCloudResourceManagerService();
    } catch (IOException | GeneralSecurityException e) {
      System.out.println("Unable to initialize service: \n" + e.toString());
      return policy;
    }

    try {
      GetIamPolicyRequest request = new GetIamPolicyRequest();
      policy = service.projects().getIamPolicy(projectId, request).execute();
      System.out.println("Policy retrieved: " + policy.toString());
      return policy;
    } catch (IOException e) {
      System.out.println("Unable to get policy: \n" + e.toString());
      return policy;
    }
  }

  public static CloudResourceManager createCloudResourceManagerService()
      throws IOException, GeneralSecurityException {
    // Use the Application Default Credentials strategy for authentication. For more info, see:
    // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));

    CloudResourceManager service =
        new CloudResourceManager.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

在试用此示例之前,请按照《IAM 快速入门:使用客户端库》中的 Python 设置说明进行操作。如需了解详情,请参阅 IAM Python API 参考文档

def get_policy(project_id, version=1):
    """Gets IAM policy for a project."""

    credentials = service_account.Credentials.from_service_account_file(
        filename=os.environ["GOOGLE_APPLICATION_CREDENTIALS"],
        scopes=["https://www.googleapis.com/auth/cloud-platform"],
    )
    service = googleapiclient.discovery.build(
        "cloudresourcemanager", "v1", credentials=credentials
    )
    policy = (
        service.projects()
        .getIamPolicy(
            resource=project_id,
            body={"options": {"requestedPolicyVersion": version}},
        )
        .execute()
    )
    print(policy)
    return policy

修改政策

通过编程或文本编辑器修改项目政策的本地副本,以反映您要针对给定用户授予或撤消的角色。

授予角色

要向成员授予角色,请修改政策中的角色绑定。如需了解您可以授予哪些角色,请参阅了解角色

要授予政策中已包含的角色,请执行以下操作:

gcloud 命令

通过修改由 get-iam-policy 命令返回的 JSON 或 YAML 政策来授予角色。请注意,此政策更改在您设置更新后的政策后才会生效。

以下示例会向 wei@example.com 授予 Security Reviewer 角色 (roles/iam.securityReviewer)。要授予此角色,请将用户附加到 members 数组进行绑定:

{
  "role": "roles/iam.securityReviewer",
  "members": [
    "user:fatima@example.com",
    "user:wei@example.com"
  ]
}

REST API

通过修改由 get-iam-policy 命令返回的 JSON 或 YAML 政策来授予角色。请注意,此政策更改在您设置更新后的政策后才会生效。

以下示例会向 wei@example.com 授予 Security Reviewer 角色 (roles/iam.securityReviewer)。要授予此角色,请将用户附加到 members 数组进行绑定:

{
  "role": "roles/iam.securityReviewer",
  "members": [
    "user:fatima@example.com",
    "user:wei@example.com"
  ]
}

C#

在试用此示例之前,请按照《IAM 快速入门:使用客户端库》中的 C# 设置说明进行操作。如需了解详情,请参阅 IAM C# API 参考文档


using System.Linq;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy AddMember(Policy policy, string role, string member)
    {
        var binding = policy.Bindings.First(x => x.Role == role);
        binding.Members.Add(member);
        return policy;
    }
}

Java

在试用此示例之前,请按照《IAM 快速入门:使用客户端库》中的 Java 设置说明进行操作。如需了解详情,请参阅 IAM Java API 参考文档

import com.google.api.services.cloudresourcemanager.model.Binding;
import com.google.api.services.cloudresourcemanager.model.Policy;
import java.util.List;

public class AddMember {

  // Adds a member to a preexisting role.
  public static void addMember(Policy policy) {
    // policy = service.Projects.GetIAmPolicy(new GetIamPolicyRequest(), your-project-id).Execute();

    String role = "roles/existing-role";
    String member = "user:member-to-add@example.com";

    List<Binding> bindings = policy.getBindings();

    for (Binding b : bindings) {
      if (b.getRole().equals(role)) {
        b.getMembers().add(member);
        System.out.println("Member " + member + " added to role " + role);
        return;
      }
    }

    System.out.println("Role not found in policy; member not added");
  }
}

Python

在试用此示例之前,请按照《IAM 快速入门:使用客户端库》中的 Python 设置说明进行操作。如需了解详情,请参阅 IAM Python API 参考文档

def modify_policy_add_member(policy, role, member):
    """Adds a new member to a role binding."""

    binding = next(b for b in policy["bindings"] if b["role"] == role)
    binding["members"].append(member)
    print(binding)
    return policy

要授予政策中未包含的角色,请添加新的 binding

gcloud 命令

通过修改由 get-iam-policy 命令返回的 JSON 或 YAML 政策来添加新绑定。请注意,此政策更改在您设置更新后的政策后才会生效。

以下示例会向 fatima@example.com 授予 Reader 角色。如需授予此角色,请向政策的 bindings 数组添加新绑定:

{
  "role": "roles/reader",
  "members": [
    "user:fatima@example.com"
  ]
}

REST API

通过修改由 get-iam-policy 命令返回的 JSON 或 YAML 政策来添加新绑定。请注意,此政策更改在您设置更新后的政策后才会生效。

以下示例会向 fatima@example.com 授予 Reader 角色。如需授予此角色,请向政策的 bindings 数组添加新绑定:

{
  "role": "roles/reader",
  "members": [
    "user:fatima@example.com"
  ]
}

C#

在试用此示例之前,请按照《IAM 快速入门:使用客户端库》中的 C# 设置说明进行操作。如需了解详情,请参阅 IAM C# API 参考文档


using System.Collections.Generic;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy AddBinding(Policy policy, string role, string member)
    {
        var binding = new Binding
        {
            Role = role,
            Members = new List<string> { member }
        };
        policy.Bindings.Add(binding);
        return policy;
    }
}

Java

在试用此示例之前,请按照《IAM 快速入门:使用客户端库》中的 Java 设置说明进行操作。如需了解详情,请参阅 IAM Java API 参考文档

import com.google.api.services.cloudresourcemanager.model.Binding;
import com.google.api.services.cloudresourcemanager.model.Policy;
import java.util.ArrayList;
import java.util.List;

public class AddBinding {

  // Adds a member to a role with no previous members.
  public static void addBinding(Policy policy) {
    // policy = service.Projects.GetIAmPolicy(new GetIamPolicyRequest(), your-project-id).Execute();

    String role = "roles/role-to-add";
    List<String> members = new ArrayList<String>();
    members.add("user:member-to-add@example.com");

    Binding binding = new Binding();
    binding.setRole(role);
    binding.setMembers(members);

    policy.getBindings().add(binding);
    System.out.println("Added binding: " + binding.toString());
  }
}

Python

在试用此示例之前,请按照《IAM 快速入门:使用客户端库》中的 Python 设置说明进行操作。如需了解详情,请参阅 IAM Python API 参考文档

def modify_policy_add_role(policy, role, member):
    """Adds a new role binding to a policy."""

    binding = {"role": role, "members": [member]}
    policy["bindings"].append(binding)
    print(policy)
    return policy

您只能授予与已激活的 API 服务相关的角色。如果某项服务(例如 Compute Engine)未处于活动状态,则无法授予与其(例如 Compute Engine)相关的特定角色。如需了解详情,请参阅启用和停用 API

在项目上授予权限时有一些独特的限制,授予“Owner”角色时尤其如此。如需了解详情,请参阅 projects.setIamPolicy() 参考文档

撤消角色

如需撤消角色,请运行以下命令:

gcloud 命令

通过修改由 get-iam-policy 命令返回的 JSON 或 YAML 政策来撤消角色。此政策更改将在设置更新后的政策后才会生效。

如需撤消成员的角色,请在政策的 bindings 数组中删除所需的成员或绑定。

REST API

通过修改由 get-iam-policy 命令返回的 JSON 或 YAML 政策来撤消角色。此政策更改将在设置更新后的政策后才会生效。

如需撤消成员的角色,请在政策的 bindings 数组中删除所需的成员或绑定。

C#

在试用此示例之前,请按照《IAM 快速入门:使用客户端库》中的 C# 设置说明进行操作。如需了解详情,请参阅 IAM C# API 参考文档


using System.Linq;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy RemoveMember(Policy policy, string role, string member)
    {
        try
        {
            var binding = policy.Bindings.First(x => x.Role == role);
            if (binding.Members.Count != 0 && binding.Members.Contains(member))
            {
                binding.Members.Remove(member);
            }
            if (binding.Members.Count == 0)
            {
                policy.Bindings.Remove(binding);
            }
            return policy;
        }
        catch (System.InvalidOperationException e)
        {
            System.Diagnostics.Debug.WriteLine("Role does not exist in policy: \n" + e.ToString());
            return policy;
        }
    }
}

Java

在试用此示例之前,请按照《IAM 快速入门:使用客户端库》中的 Java 设置说明进行操作。如需了解详情,请参阅 IAM Java API 参考文档

import com.google.api.services.cloudresourcemanager.model.Binding;
import com.google.api.services.cloudresourcemanager.model.Policy;
import java.util.List;

public class RemoveMember {

  // Removes member from a role; removes binding if binding contains 0 members.
  public static void removeMember(Policy policy) {
    // policy = service.Projects.GetIAmPolicy(new GetIamPolicyRequest(), your-project-id).Execute();

    String role = "roles/existing-role";
    String member = "user:member-to-remove@example.com";

    List<Binding> bindings = policy.getBindings();
    Binding binding = null;
    for (Binding b : bindings) {
      if (b.getRole().equals(role)) {
        binding = b;
      }
    }
    if (binding.getMembers().contains(member)) {
      binding.getMembers().remove(member);
      System.out.println("Member " + member + " removed from " + role);
      if (binding.getMembers().isEmpty()) {
        policy.getBindings().remove(binding);
      }
      return;
    }

    System.out.println("Role not found in policy; member not removed");
    return;
  }
}

Python

在试用此示例之前,请按照《IAM 快速入门:使用客户端库》中的 Python 设置说明进行操作。如需了解详情,请参阅 IAM Python API 参考文档

def modify_policy_remove_member(policy, role, member):
    """Removes a  member from a role binding."""
    binding = next(b for b in policy["bindings"] if b["role"] == role)
    if "members" in binding and member in binding["members"]:
        binding["members"].remove(member)
    print(binding)
    return policy

设置政策

修改了政策以授予相应角色后,请调用 setIamPolicy() 进行更新。

gcloud 命令

使用 set-iam-policy 命令,并提供包含更新后政策的 JSON 文件的路径。以下示例展示了项目的 set-iam-policy 命令

gcloud projects set-iam-policy project-id filepath

请提供以下值:

  • project-id:要更新的项目(例如 my-project)。
  • filepath:包含新政策的文件的路径。

响应中包含更新后的政策。

REST API

Resource Manager API 的 projects.setIamPolicy 方法会将请求中的政策设置为项目的新 IAM 政策。

在使用下面的任何请求数据之前,请先进行以下替换:

  • project-id:您的 Google Cloud 项目 ID。
  • policy:您要设置的政策的 JSON 格式。如需详细了解政策的格式,请参阅政策参考

HTTP 方法和网址:

POST https://cloudresourcemanager.googleapis.com/v1/projects/project-id:setIamPolicy

请求 JSON 正文:

{
  "policy": {
    policy
  }
}

如需发送您的请求,请展开以下选项之一:

响应中包含更新后的政策。


C#


using Google.Apis.Auth.OAuth2;
using Google.Apis.CloudResourceManager.v1;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy SetPolicy(string projectId, Policy policy)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(CloudResourceManagerService.Scope.CloudPlatform);
        var service = new CloudResourceManagerService(
            new CloudResourceManagerService.Initializer
            {
                HttpClientInitializer = credential
            });

        return service.Projects.SetIamPolicy(new SetIamPolicyRequest
        {
            Policy = policy
        }, projectId).Execute();
    }
}

Java

在试用此示例之前,请按照《IAM 快速入门:使用客户端库》中的 Java 设置说明进行操作。如需了解详情,请参阅 IAM Java API 参考文档

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.cloudresourcemanager.CloudResourceManager;
import com.google.api.services.cloudresourcemanager.model.Policy;
import com.google.api.services.cloudresourcemanager.model.SetIamPolicyRequest;
import com.google.api.services.iam.v1.IamScopes;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

public class SetPolicy {

  // Sets a project's policy.
  public static void setPolicy(Policy policy, String projectId) {
    // policy = service.Projects.GetIAmPolicy(new GetIamPolicyRequest(), your-project-id).Execute();
    // projectId = "my-project-id"

    CloudResourceManager service = null;
    try {
      service = createCloudResourceManagerService();
    } catch (IOException | GeneralSecurityException e) {
      System.out.println("Unable to initialize service: \n" + e.toString());
      return;
    }

    try {
      SetIamPolicyRequest request = new SetIamPolicyRequest();
      request.setPolicy(policy);
      Policy response = service.projects().setIamPolicy(projectId, request).execute();
      System.out.println("Policy set: " + response.toString());
    } catch (IOException e) {
      System.out.println("Unable to set policy: \n" + e.toString());
    }
  }

  public static CloudResourceManager createCloudResourceManagerService()
      throws IOException, GeneralSecurityException {
    // Use the Application Default Credentials strategy for authentication. For more info, see:
    // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));

    CloudResourceManager service =
        new CloudResourceManager.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

在试用此示例之前,请按照《IAM 快速入门:使用客户端库》中的 Python 设置说明进行操作。如需了解详情,请参阅 IAM Python API 参考文档

def set_policy(project_id, policy):
    """Sets IAM policy for a project."""

    credentials = service_account.Credentials.from_service_account_file(
        filename=os.environ["GOOGLE_APPLICATION_CREDENTIALS"],
        scopes=["https://www.googleapis.com/auth/cloud-platform"],
    )
    service = googleapiclient.discovery.build(
        "cloudresourcemanager", "v1", credentials=credentials
    )

    policy = (
        service.projects()
        .setIamPolicy(resource=project_id, body={"policy": policy})
        .execute()
    )
    print(policy)
    return policy

为防止多个源同时尝试更新政策而发生冲突,政策会包含 etag 值。当您调用 setIamPolicy() 时,IAM 会将请求中的 etag 值与现有的 etag 进行比较,并且仅在值一致时才会写入政策。

后续步骤