删除和恢复删除的服务账号

本页面介绍如何使用 Identity and Access Management (IAM) API、Google Cloud 控制台和 gcloud 命令行工具删除和恢复删除的服务账号。

准备工作

  • 启用 IAM API。

    启用 API

  • 设置身份验证。

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

    C++

    如需在本地开发环境中使用本页面上的 C++ 示例,请安装并初始化 gcloud CLI,然后使用您的用户凭据设置应用默认凭据。

    1. 安装 Google Cloud CLI。
    2. 如需初始化 gcloud CLI,请运行以下命令:

      gcloud init
    3. 为您的 Google 账号创建本地身份验证凭据:

      gcloud auth application-default login

    如需了解详情,请参阅 Google Cloud 身份验证文档中的为本地开发环境设置身份验证

    C#

    如需在本地开发环境中使用本页面上的 .NET 示例,请安装并初始化 gcloud CLI,然后使用您的用户凭据设置应用默认凭据。

    1. 安装 Google Cloud CLI。
    2. 如需初始化 gcloud CLI,请运行以下命令:

      gcloud init
    3. 为您的 Google 账号创建本地身份验证凭据:

      gcloud auth application-default login

    如需了解详情,请参阅 Google Cloud 身份验证文档中的为本地开发环境设置身份验证

    Go

    如需在本地开发环境中使用本页面上的 Go 示例,请安装并初始化 gcloud CLI,然后使用您的用户凭据设置应用默认凭据。

    1. 安装 Google Cloud CLI。
    2. 如需初始化 gcloud CLI,请运行以下命令:

      gcloud init
    3. 为您的 Google 账号创建本地身份验证凭据:

      gcloud auth application-default login

    如需了解详情,请参阅 Google Cloud 身份验证文档中的为本地开发环境设置身份验证

    Java

    如需在本地开发环境中使用本页面上的 Java 示例,请安装并初始化 gcloud CLI,然后使用您的用户凭据设置应用默认凭据。

    1. 安装 Google Cloud CLI。
    2. 如需初始化 gcloud CLI,请运行以下命令:

      gcloud init
    3. 为您的 Google 账号创建本地身份验证凭据:

      gcloud auth application-default login

    如需了解详情,请参阅 Google Cloud 身份验证文档中的为本地开发环境设置身份验证

    Python

    如需在本地开发环境中使用本页面上的 Python 示例,请安装并初始化 gcloud CLI,然后使用您的用户凭据设置应用默认凭据。

    1. 安装 Google Cloud CLI。
    2. 如需初始化 gcloud CLI,请运行以下命令:

      gcloud init
    3. 为您的 Google 账号创建本地身份验证凭据:

      gcloud auth application-default login

    如需了解详情,请参阅 Google Cloud 身份验证文档中的为本地开发环境设置身份验证

    REST

    如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。

      安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init

    如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证

  • 了解 IAM 服务账号

所需的角色

如需获得删除和恢复删除的服务账号所需的权限,请让管理员向您授予项目的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

如需详细了解这些角色,请参阅服务账号角色

IAM 基本角色也具有管理服务账号的权限。您不应在生产环境中授予基本角色,但可以在开发或测试环境中授予这些角色。

删除服务账号

您删除服务账号后,应用将无法再通过该服务账号访问 Google Cloud 资源。如果您删除默认的 App Engine 和 Compute Engine 服务账号,则使用这些服务账号的 App Engine 应用和 Compute Engine 虚拟机实例将无法再访问项目中的资源。

请谨慎删除服务账号。在删除之前,请确保您的关键应用不再使用该服务账号。如果您不确定某个服务账号是否正在使用,Google 建议您停用该服务账号,而不是将其删除。已停用的服务账号可以在需要时重新启用。

如果您要恢复已删除的服务账号,可以恢复删除(如果自删除服务账号后已过去 30 天或更短时间)。30 天后,IAM 会永久移除该服务账号。服务账号被永久移除后,即使您提交支持请求,Google Cloud 也无法将其恢复。

如需进一步降低删除必要服务账号的风险,您还可以启用更改风险建议。如果您尝试删除 Google Cloud 已确定为重要账号的服务账号,更改风险建议会生成警告。

如果您删除服务账号,然后创建一个具有相同名称的新服务账号,新服务账号将被视为单独的身份;它不会继承那些授予已删除的服务账号的角色。相反,如果您删除某个服务账号,然后恢复删除,那么该服务账号的身份不会更改,并且服务账号会保留其角色。

删除服务账号时,其角色绑定不会立即移除;它们将在 60 天内自动从系统中清除。在此之前,该服务账号显示在角色绑定中,并且带有 deleted: 前缀和 ?uid=NUMERIC_ID 后缀,其中 NUMERIC_ID 是服务账号的唯一数字 ID。

已删除的服务账号不计入您的服务账号配额

控制台

  1. 在 Google Cloud 控制台中,转到服务账号页面。

    转到“服务账号”

  2. 选择一个项目。

  3. 选择要删除的服务账号,然后点击删除

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. 执行 gcloud iam service-accounts delete 命令可删除服务账号。

    命令:

    gcloud iam service-accounts delete \
        SA_NAME@PROJECT_ID.iam.gserviceaccount.com

    输出如下:

    Deleted service account SA_NAME@PROJECT_ID.iam.gserviceaccount.com

C++

如需了解如何安装和使用 IAM 客户端库,请参阅 IAM 客户端库。如需了解详情,请参阅 IAM C++ API 参考文档

如需向 IAM 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅准备工作

namespace iam = ::google::cloud::iam_admin_v1;
[](std::string const& name) {
  iam::IAMClient client(iam::MakeIAMConnection());
  auto response = client.DeleteServiceAccount(name);
  if (!response.ok()) throw std::runtime_error(response.message());
  std::cout << "ServiceAccount successfully deleted.\n";
}

C#

如需了解如何安装和使用 IAM 客户端库,请参阅 IAM 客户端库。如需了解详情,请参阅 IAM C# API 参考文档

如需向 IAM 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅准备工作


using System;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Iam.v1;

public partial class ServiceAccounts
{
    public static void DeleteServiceAccount(string email)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(IamService.Scope.CloudPlatform);
        var service = new IamService(new IamService.Initializer
        {
            HttpClientInitializer = credential
        });

        string resource = "projects/-/serviceAccounts/" + email;
        service.Projects.ServiceAccounts.Delete(resource).Execute();
        Console.WriteLine("Deleted service account: " + email);
    }
}

Go

如需了解如何安装和使用 IAM 客户端库,请参阅 IAM 客户端库。如需了解详情,请参阅 IAM Go API 参考文档

如需向 IAM 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅准备工作

import (
	"context"
	"fmt"
	"io"

	iam "google.golang.org/api/iam/v1"
)

// deleteServiceAccount deletes a service account.
func deleteServiceAccount(w io.Writer, email string) error {
	ctx := context.Background()
	service, err := iam.NewService(ctx)
	if err != nil {
		return fmt.Errorf("iam.NewService: %w", err)
	}

	_, err = service.Projects.ServiceAccounts.Delete("projects/-/serviceAccounts/" + email).Do()
	if err != nil {
		return fmt.Errorf("Projects.ServiceAccounts.Delete: %w", err)
	}
	fmt.Fprintf(w, "Deleted service account: %v", email)
	return nil
}

Java

如需了解如何安装和使用 IAM 客户端库,请参阅 IAM 客户端库。如需了解详情,请参阅 IAM Java API 参考文档

如需向 IAM 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅准备工作

import com.google.cloud.iam.admin.v1.IAMClient;
import com.google.iam.admin.v1.DeleteServiceAccountRequest;
import com.google.iam.admin.v1.ServiceAccountName;
import java.io.IOException;

public class DeleteServiceAccount {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace the variables before running the sample.
    String projectId = "your-project-id";
    String serviceAccountName = "my-service-account-name";

    deleteServiceAccount(projectId, serviceAccountName);
  }

  // Deletes a service account.
  public static void deleteServiceAccount(String projectId, String serviceAccountName)
          throws IOException {
    // Initialize client that will be used to send requests.
    // This client only needs to be created once, and can be reused for multiple requests.
    try (IAMClient client = IAMClient.create()) {
      String accountName = ServiceAccountName.of(projectId, serviceAccountName).toString();
      String accountEmail = String.format("%s@%s.iam.gserviceaccount.com", accountName, projectId);
      DeleteServiceAccountRequest request = DeleteServiceAccountRequest.newBuilder()
              .setName(accountEmail)
              .build();
      client.deleteServiceAccount(request);

      System.out.println("Deleted service account: " + serviceAccountName);
    }
  }
}

Python

如需了解如何安装和使用 IAM 客户端库,请参阅 IAM 客户端库。如需了解详情,请参阅 IAM Python API 参考文档

如需向 IAM 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅准备工作

import os

from google.oauth2 import service_account  # type: ignore
import googleapiclient.discovery  # type: ignore

def delete_service_account(email: str) -> None:
    """Deletes a service account."""

    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("iam", "v1", credentials=credentials)

    service.projects().serviceAccounts().delete(
        name="projects/-/serviceAccounts/" + email
    ).execute()

    print("Deleted service account: " + email)

REST

serviceAccounts.delete 方法可删除服务账号。

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

  • PROJECT_ID:您的 Google Cloud 项目 ID。项目 ID 是字母数字字符串,例如 my-project
  • SA_ID:您的服务账号的 ID。此 ID 可以是服务账号的电子邮件地址(格式为 SA_NAME@PROJECT_ID.iam.gserviceaccount.com)或服务账号的唯一数字 ID。

HTTP 方法和网址:

DELETE https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_ID

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

如果成功,则响应正文将为空。

恢复删除的服务账号

在某些情况下,您可以使用 undelete 命令恢复已删除的服务账号。如果已删除的服务账号满足以下条件,则通常可以对该服务账号恢复删除:

  • 服务账号删除的时间不超过 30 天。

    30 天后,IAM 会永久移除该服务账号。服务账号被永久移除后,即使您提交支持请求,Google Cloud 也无法将其恢复。

  • 现有服务账号与已删除的服务账号的名称不同。

    例如,假设您意外删除了服务账号 my-service-account@project-id.iam.gserviceaccount.com。您仍需要具有此名称的服务账号,因此您创建了一个具有相同名称的新服务账号 my-service-account@project-id.iam.gserviceaccount.com

    新服务账号不会继承已删除的服务账号的权限。实际上,它与已删除的服务账号完全没有关系。但是,您无法恢复删除的原始服务账号,因为新服务账号使用了与它相同的名称。

    要解决此问题,请删除新服务账号,然后尝试恢复删除的原始服务账号。

如果您无法恢复已删除的服务账号,可以创建一个具有相同名称的新服务账号;撤消已删除的服务账号中的所有角色;然后向新服务账号授予相同的角色。如需了解详情,请参阅包含已删除主账号的政策

查找已删除服务账号的数字 ID

当您恢复删除的服务账号时,必须提供其数字 ID。数字 ID 是唯一标识服务账号的 21 位数字,例如 123456789012345678901。例如,如果您删除某一服务账号,然后创建一个具有相同名称的新服务账号,原始服务账号和新服务账号将具有不同的数字 ID。

如果您知道某项允许政策中的绑定包含已删除的服务账号,则可以获取允许政策,然后在允许政策中找到相应的数字 ID。数字 ID 附加在已删除的服务账号的名称的后面。例如,在此允许政策中,已删除的服务账号的数字 ID 为 123456789012345678901

{
  "version": 1,
  "etag": "BwUjMhCsNvY=",
  "bindings": [
    {
      "members": [
        "deleted:serviceAccount:my-service-account@project-id.iam.gserviceaccount.com?uid=123456789012345678901"
      ],
      "role": "roles/iam.serviceAccountUser"
    },
  ]
}

数字 ID 仅附加到已删除主账号的名称中。

或者,您可以在审核日志中搜索删除了服务账号的 DeleteServiceAccount 操作:

  1. 在 Google Cloud 控制台中,转到日志浏览器页面。

    转到日志浏览器

  2. 在查询编辑器中输入以下查询,将 SERVICE_ACCOUNT_EMAIL 替换为您的服务账号的电子邮件地址(例如 my-service-account@project-id.iam.gserviceaccount.com):

    resource.type="service_account"
    resource.labels.email_id="SERVICE_ACCOUNT_EMAIL"
    "DeleteServiceAccount"
    
  3. 如果服务账号已被删除超过 1 小时,请点击 schedule 过去 1 小时,从下拉列表中选择更长的时间段,然后点击应用

  4. 点击运行查询。日志浏览器会显示具有您指定的名称的影响服务账号的 DeleteServiceAccount 操作。

  5. 执行以下任一操作,找到并记下已删除服务账号的数字 ID:

    • 如果搜索结果仅包含一项 DeleteServiceAccount 操作,请在日志字段窗格的唯一 ID 字段中查找数字 ID。

    • 如果搜索结果显示多个日志,请执行以下操作:

      1. 找到正确的日志条目。如需查找正确的日志条目,请点击日志条目旁边的 展开箭头。查看日志条目的详细信息,并确定日志条目是否显示您要撤消的操作。重复此过程,直至找到正确的日志条目。

      2. 在正确的日志条目中,找到服务账号的数字 ID。如需查找数字 ID,请展开日志条目的 protoPayload 字段,然后找到 resourceName 字段。

        数字 ID 是 resourceName 字段中 serviceAccounts 之后的所有内容。

按数字 ID 恢复删除的服务账号

找到已删除的服务账号的数字 ID 后,您可以尝试恢复删除的服务账号。

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. 执行 gcloud beta iam service-accounts undelete 命令可恢复删除的服务账号。

    命令:

    gcloud beta iam service-accounts undelete ACCOUNT_ID

    输出:

    restoredAccount:
        email: SA_NAME@PROJECT_ID.iam.gserviceaccount.com
        etag: BwWWE7zpApg=
        name: projects/PROJECT_ID/serviceAccounts/SA_NAME@PROJECT_ID.iam.gserviceaccount.com
        oauth2ClientId: '123456789012345678901'
        projectId: PROJECT_ID
        uniqueId: 'ACCOUNT_ID'

REST

serviceAccounts.undelete 方法可恢复已删除的服务账号。

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

  • PROJECT_ID:您的 Google Cloud 项目 ID。项目 ID 是字母数字字符串,例如 my-project
  • SA_NUMERIC_ID:服务账号的唯一数字 ID。

HTTP 方法和网址:

POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_NUMERIC_ID:undelete

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

如果可以恢复删除的账号,您会收到一个 200 OK 响应代码,其中包含已恢复服务账号的详细信息,如下所示:

{
  "restoredAccount": {
    "name": "projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com",
    "projectId": "my-project",
    "uniqueId": "123456789012345678901",
    "email": "my-service-account@my-project.iam.gserviceaccount.com",
    "displayName": "My service account",
    "etag": "BwUp3rVlzes=",
    "description": "A service account for running jobs in my project",
    "oauth2ClientId": "987654321098765432109"
  }
}

后续步骤

自行试用

如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。

免费开始使用