创建和管理服务帐号

本页介绍了如何使用 Cloud Identity and Access Management API、Google Cloud Platform Console 和 gcloud 命令行工具创建和管理服务帐号。

创建新的 Cloud 项目时,Google Cloud Platform (GCP) 会自动在该项目下创建一个 Compute Engine 服务帐号和一个 App Engine 服务帐号。您最多可以为项目创建 98 个额外的服务帐号,以控制对资源的访问权限。

准备工作

所需权限

要允许用户管理服务帐号,请授予以下角色之一:

  • 服务帐号用户 (roles/iam.serviceAccountUser):授予获取、列出或模拟服务帐号的权限。
  • 服务帐号管理员 (roles/iam.serviceAccountAdmin):包括服务帐号用户权限,还可为服务帐号授予创建、更新、删除以及设置或获取 Cloud IAM 政策的权限。

Cloud IAM 初始角色还包含管理服务帐号的权限。不过,我们建议授予上述预定义角色之一,以预防对其他 Google Cloud Platform (GCP) 资源的不必要访问。

要详细了解与服务帐号相关的角色,请参阅服务帐号角色主题。

创建服务帐号

创建服务帐号与为项目添加成员类似,但服务帐号属于您的应用,而非某个最终用户。

在下面的示例中,[SA-NAME] 是您提供的服务帐号的名称,例如 my-service-account。这是一个唯一标识符,将显示在创建过程中预配的服务帐号的电子邮件地址中,例如 my-service-account@project-name.iam.gserviceaccount.com。您还会将其用于使用其他 API 更新服务帐号。该名称一经创建便无法更改。[SA-DISPLAY-NAME] 是您提供的服务帐号的易记名称。[PROJECT-ID] 是您的 Google Cloud Platform 项目的 ID。

要创建服务帐号,必须至少为用户授予服务帐号管理员角色 (roles/iam.serviceAccountAdmin) 或编辑者初始角色 (roles/editor)。

Console

  1. 打开 GCP Console 中的服务帐号页面。

    打开“服务帐号”页面

  2. 点击选择项目

  3. 选择您的项目,然后点击打开

  4. 点击创建服务帐号

  5. 输入服务帐号名称,选择您希望授予服务帐号的角色,然后点击保存

GCLOUD 命令

执行 gcloud iam service-accounts create 命令以创建服务帐号。

命令:

gcloud iam service-accounts create [SA-NAME]
    --display-name "[SA-DISPLAY-NAME]"

输出是服务帐号:

Created service account [SA-NAME].

REST API

调用 serviceAccounts.create() 以创建服务帐号。

POST https://iam.googleapis.com/v1/projects/[PROJECT-ID]/serviceAccounts

请求正文应包含服务帐号的属性。

{
    "accountId": "[SA-NAME]",
    "serviceAccount": {
        "displayName": "[SA-DISPLAY-NAME]",
    }
}

响应:

{
    "name": "projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com",
    "projectId": "PROJECT-ID",
    "uniqueId": "113948692397867021414",
    "email": "SA-NAME@PROJECT-ID.iam.gserviceaccount.com",
    "displayName": "SA-DISPLAY-NAME",
    "etag": "BwUp3rVlzes=",
    "oauth2ClientId": "117249000288840666939"
}

C#

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

public static ServiceAccount CreateServiceAccount(string projectId,
    string name, string displayName)
{
    var request = new CreateServiceAccountRequest
    {
        AccountId = name,
        ServiceAccount = new ServiceAccount
        {
            DisplayName = displayName
        }
    };

    ServiceAccount serviceAccount = s_iam.Projects.ServiceAccounts
        .Create(request, "projects/" + projectId).Execute();

    Console.WriteLine("Created service account: " + serviceAccount.Email);
    return serviceAccount;
}

Go

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

import (
	"context"
	"fmt"
	"io"

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

// createServiceAccount creates a service account.
func createServiceAccount(w io.Writer, projectID, name, displayName string) (*iam.ServiceAccount, error) {
	client, err := google.DefaultClient(context.Background(), iam.CloudPlatformScope)
	if err != nil {
		return nil, fmt.Errorf("google.DefaultClient: %v", err)
	}
	service, err := iam.New(client)
	if err != nil {
		return nil, fmt.Errorf("iam.New: %v", err)
	}

	request := &iam.CreateServiceAccountRequest{
		AccountId: name,
		ServiceAccount: &iam.ServiceAccount{
			DisplayName: displayName,
		},
	}
	account, err := service.Projects.ServiceAccounts.Create("projects/"+projectID, request).Do()
	if err != nil {
		return nil, fmt.Errorf("Projects.ServiceAccounts.Create: %v", err)
	}
	fmt.Fprintf(w, "Created service account: %v", account)
	return account, nil
}

Java

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

public ServiceAccount createServiceAccount(String projectId, String name, String displayName)
    throws IOException {

  ServiceAccount serviceAccount = new ServiceAccount();
  serviceAccount.setDisplayName(displayName);
  CreateServiceAccountRequest request = new CreateServiceAccountRequest();
  request.setAccountId(name);
  request.setServiceAccount(serviceAccount);

  serviceAccount =
      service.projects().serviceAccounts().create("projects/" + projectId, request).execute();

  System.out.println("Created service account: " + serviceAccount.getEmail());
  return serviceAccount;
}

Python

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

def create_service_account(project_id, name, display_name):
    """Creates a service account."""

    # pylint: disable=no-member
    service_account = service.projects().serviceAccounts().create(
        name='projects/' + project_id,
        body={
            'accountId': name,
            'serviceAccount': {
                'displayName': display_name
            }
        }).execute()

    print('Created service account: ' + service_account['email'])
    return service_account

在创建服务帐号后,为服务帐号授予一个或多个角色,以使其代表您执行操作。

列出服务帐号

列出服务帐号时,您可以指定参数来限制要包含在响应中的服务帐号数量。然后,您可以在后续请求中使用 ListServiceAccountsResponse.next_page_token 来列出其余的服务帐号。

使用此方法可审核服务帐号和密钥,或者构建用于管理服务帐号的自定义工具。

要列出服务帐号,必须至少为用户授予服务帐号用户角色 (roles/iam.serviceAccountUser) 或查看者初始角色 (roles/viewer)。

Console

  1. 打开 GCP Console 中的服务帐号页面。

    打开“服务帐号”页面

  2. 点击选择项目

  3. 选择您的项目,然后点击打开。所有服务帐号都列在“服务帐号”页面中。

GCLOUD 命令

执行 gcloud iam service-accounts list 命令以列出项目中的所有服务帐号。

命令:

gcloud iam service-accounts list

输出是项目中所有服务帐号的列表:

NAME                    EMAIL
SA-DISPLAY-NAME-1       SA-NAME-1@PROJECT-ID.iam.gserviceaccount.com
SA-DISPLAY-NAME-2       SA-NAME-2@PROJECT-ID.iam.gserviceaccount.com

REST API

调用 serviceAccounts.list() 方法。

请求:

GET https://iam.googleapis.com/v1/projects/[PROJECT-ID]/serviceAccounts

响应:

{
    "accounts": [
    {
        "name": "projects/PROJECT-ID/serviceAccounts/SA-NAME-1@PROJECT-ID.iam.gserviceaccount.com",
        "projectId": "PROJECT-ID",
        "uniqueId": "108979773878059201436",
        "email": "SA-NAME-1@PROJECT-ID.iam.gserviceaccount.com",
        "displayName": "SA-DISPLAY-NAME-1",
        "etag": "BwUpTsLVUkQ=",
        "oauth2ClientId": "102240834887833340852"
    },
    {
        "name": "projects/PROJECT-ID/serviceAccounts/SA-NAME-2@PROJECT-ID.iam.gserviceaccount.com",
        "projectId": "PROJECT-ID",
        "uniqueId": "108979773878059201436",
        "email": "SA-NAME-2@PROJECT-ID.iam.gserviceaccount.com",
        "displayName": "SA-DISPLAY-NAME-2",
        "etag": "BwUpTsLVUkQ=",
        "oauth2ClientId": "102240834887833340852"
    }]
}

C#

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

public static IList<ServiceAccount> ListServiceAccounts(string projectId)
{
    ListServiceAccountsResponse response = s_iam.Projects.ServiceAccounts
        .List("projects/" + projectId).Execute();
    IList<ServiceAccount> serviceAccounts = response.Accounts;

    foreach (ServiceAccount account in serviceAccounts)
    {
        Console.WriteLine("Name: " + account.Name);
        Console.WriteLine("Display Name: " + account.DisplayName);
        Console.WriteLine("Email: " + account.Email);
        Console.WriteLine();
    }
    return serviceAccounts;
}

Go

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

import (
	"context"
	"fmt"
	"io"

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

// listServiceAccounts lists a project's service accounts.
func listServiceAccounts(w io.Writer, projectID string) ([]*iam.ServiceAccount, error) {
	client, err := google.DefaultClient(context.Background(), iam.CloudPlatformScope)
	if err != nil {
		return nil, fmt.Errorf("google.DefaultClient: %v", err)
	}
	service, err := iam.New(client)
	if err != nil {
		return nil, fmt.Errorf("iam.New: %v", err)
	}

	response, err := service.Projects.ServiceAccounts.List("projects/" + projectID).Do()
	if err != nil {
		return nil, fmt.Errorf("Projects.ServiceAccounts.List: %v", err)
	}
	for _, account := range response.Accounts {
		fmt.Fprintf(w, "Listing service account: %v\n", account.Name)
	}
	return response.Accounts, nil
}

Java

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

public List<ServiceAccount> listServiceAccounts(String projectId) throws IOException {

  ListServiceAccountsResponse response =
      service.projects().serviceAccounts().list("projects/" + projectId).execute();
  List<ServiceAccount> serviceAccounts = response.getAccounts();

  for (ServiceAccount account : serviceAccounts) {
    System.out.println("Name: " + account.getName());
    System.out.println("Display Name: " + account.getDisplayName());
    System.out.println("Email: " + account.getEmail());
    System.out.println();
  }
  return serviceAccounts;
}

Python

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

def list_service_accounts(project_id):
    """Lists all service accounts for the current project."""

    # pylint: disable=no-member
    service_accounts = service.projects().serviceAccounts().list(
        name='projects/' + project_id).execute()

    for account in service_accounts['accounts']:
        print('Name: ' + account['name'])
        print('Email: ' + account['email'])
        print(' ')
    return service_accounts

重命名服务帐号

服务帐号的显示名称通常用于捕获有关该服务帐号的其他信息,例如服务帐号的用途或该帐号的联系人。

要重命名服务帐号,必须至少为用户授予服务帐号管理员角色 (roles/iam.serviceAccountAdmin) 或编辑者初始角色 (roles/editor)。

Console

  1. 打开 GCP Console 中的服务帐号页面。

    打开“服务帐号”页面

  2. 点击选择项目
  3. 选择您的项目,然后点击打开
  4. 找到要重命名的服务帐号,点击该行中的更多 more_vert 按钮,然后点击修改
  5. 输入新名称,然后点击保存

GCLOUD 命令

执行 gcloud iam service-accounts update 命令以更新服务帐号。

命令:

gcloud iam service-accounts update
    [SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com
    --display-name "[UPDATED-DISPLAY-NAME]"

输出是重命名后的服务帐号:

displayName: Updated display name
email: SA-NAME@PROJECT-ID.iam.gserviceaccount.com
etag: BwUqQpHDCw8=
name: projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com
oauth2ClientId: '112984177383228986143'
projectId: PROJECT-ID
uniqueId: '112984177383228986143'

REST API

使用 serviceAccounts.update() 方法。

请求:

PUT https://iam.googleapis.com/v1/projects/[PROJECT-ID]/serviceAccounts/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com

请求正文必须包含新的显示名称、项目 ID、服务帐号的唯一 ID 和服务帐号电子邮件。

{
    "displayName":"[UPDATED-DISPLAY-NAME]",
    "etag":"BwUpVKjgNtE=",
    "projectId":"[PROJECT-ID]",
    "uniqueId":"107522985251862639552",
    "email":"[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com",
}

响应:

{
    "name": "projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com",
    "projectId": "PROJECT-ID",
    "uniqueId": "107522985251862639552",
    "email": "SA-NAME@PROJECT-ID.iam.gserviceaccount.com",
    "displayName": "Updated display name",
    "etag": "BwUqLK4bL9U=",
    "oauth2ClientId": "105236325228757713905"
}

C#

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

public static ServiceAccount RenameServiceAccount(string email,
    string newDisplayName)
{
    // First, get a ServiceAccount using List() or Get()
    string resource = "projects/-/serviceAccounts/" + email;
    ServiceAccount serviceAccount = s_iam.Projects.ServiceAccounts
        .Get(resource).Execute();

    // Then you can update the display name
    serviceAccount.DisplayName = newDisplayName;
    serviceAccount = s_iam.Projects.ServiceAccounts.Update(
        serviceAccount, resource).Execute();

    Console.WriteLine($"Updated display name for {serviceAccount.Email} " +
        "to: " + serviceAccount.DisplayName);
    return serviceAccount;
}

Go

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

import (
	"context"
	"fmt"
	"io"

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

// renameServiceAccount renames a service account.
func renameServiceAccount(w io.Writer, email, newDisplayName string) (*iam.ServiceAccount, error) {
	client, err := google.DefaultClient(context.Background(), iam.CloudPlatformScope)
	if err != nil {
		return nil, fmt.Errorf("google.DefaultClient: %v", err)
	}
	service, err := iam.New(client)
	if err != nil {
		return nil, fmt.Errorf("iam.New: %v", err)
	}

	// First, get a ServiceAccount using List() or Get().
	resource := "projects/-/serviceAccounts/" + email
	serviceAccount, err := service.Projects.ServiceAccounts.Get(resource).Do()
	if err != nil {
		return nil, fmt.Errorf("Projects.ServiceAccounts.Get: %v", err)
	}
	// Then you can update the display name.
	serviceAccount.DisplayName = newDisplayName
	serviceAccount, err = service.Projects.ServiceAccounts.Update(resource, serviceAccount).Do()
	if err != nil {
		return nil, fmt.Errorf("Projects.ServiceAccounts.Update: %v", err)
	}

	fmt.Fprintf(w, "Updated service account: %v", serviceAccount.Email)
	return serviceAccount, nil
}

Java

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

public ServiceAccount renameServiceAccount(String email, String newDisplayName)
    throws IOException {

  // First, get a service account using List() or Get()
  ServiceAccount serviceAccount =
      service.projects().serviceAccounts().get("projects/-/serviceAccounts/" + email).execute();

  // Then you can update the display name
  serviceAccount.setDisplayName(newDisplayName);
  service.projects().serviceAccounts().update(serviceAccount.getName(), serviceAccount).execute();

  System.out.println(
      "Updated display name for " + serviceAccount.getName() + " to: " + newDisplayName);
  return serviceAccount;
}

Python

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

def rename_service_account(email, new_display_name):
    """Changes a service account's display name."""

    # First, get a service account using List() or Get()
    resource = 'projects/-/serviceAccounts/' + email
    # pylint: disable=no-member
    service_account = service.projects().serviceAccounts().get(
        name=resource).execute()

    # Then you can update the display name
    service_account['displayName'] = new_display_name
    service_account = service.projects().serviceAccounts().update(
        name=resource, body=service_account).execute()

    print('Updated display name for {} to: {}'.format(
        service_account['email'], service_account['displayName']))
    return service_account

删除服务帐号

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

请谨慎删除;在删除之前,请确保您的关键应用不再使用该服务帐号。此外,所删除的服务帐号的角色绑定不会立即解除;它们会在最多 60 天后自动从系统中清除。

要删除服务帐号,必须至少为用户授予服务帐号管理员角色 (roles/iam.serviceAccountAdmin) 或编辑者初始角色 (roles/editor)。

Console

  1. 打开 GCP Console 中的服务帐号页面。

    打开“服务帐号”页面

  2. 点击选择项目

  3. 选择您的项目,然后点击打开

  4. 选择您想要删除的服务帐号,然后点击删除 delete

GCLOUD 命令

执行 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

REST API

使用 serviceAccounts.delete() 方法。

DELETE https://iam.googleapis.com/v1/projects/[PROJECT-ID]/serviceAccounts/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com

C#

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

public static void DeleteServiceAccount(string email)
{
    string resource = "projects/-/serviceAccounts/" + email;
    s_iam.Projects.ServiceAccounts.Delete(resource).Execute();

    Console.WriteLine("Deleted service account: " + email);
}

Go

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

import (
	"context"
	"fmt"
	"io"

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

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

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

Java

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

public void deleteServiceAccount(String email) throws IOException {

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

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

Python

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

def delete_service_account(email):
    """Deletes a service account."""

    # pylint: disable=no-member
    service.projects().serviceAccounts().delete(
        name='projects/-/serviceAccounts/' + email).execute()

    print('Deleted service account: ' + email)

删除服务帐号之后,请避免使用相同的名称创建新的服务帐号。这可能会导致意外行为。如需了解详情,请参阅删除和重新创建服务帐号

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Cloud Identity and Access Management Documentation