创建服务帐号

本页面介绍如何使用 Identity and Access Management (IAM) API、Google Cloud 控制台和 gcloud 命令行工具创建服务帐号。

默认情况下,每个项目最多可以有 100 个控制对资源的访问权限的服务帐号。如有必要,您可以申请增加配额。详细了解配额和限制

准备工作

所需的角色

如需获得创建服务帐号所需的权限,请让管理员向您授予项目的 Create Service Accounts (roles/iam.serviceAccountCreator) IAM 角色。 如需详细了解如何授予角色,请参阅管理访问权限

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

如果您想要授予新创建的服务帐号对项目的访问权限,您还需要 Project IAM Admin (roles/resourcemanager.projectIamAdmin) 角色。

创建服务帐号

创建服务帐号时,您必须提供字母数字 ID(在下面的示例中为 SA_NAME),例如 my-service-account。ID 必须介于 6 到 30 个字符之间,且可以包含小写字母数字字符和短划线。在服务帐号创建完毕后,无法再更改其名称。

服务帐号的名称将显示在创建过程中预配的电子邮件地址中,格式为 SA_NAME@PROJECT_ID.iam.gserviceaccount.com

每个服务帐号还有一个自动生成的永久性唯一数字 ID。

您还可以在创建服务帐号时提供如下信息:

  • SA_DESCRIPTION 是可选的服务帐号说明。
  • SA_DISPLAY_NAME 是服务帐号的易记名称。
  • PROJECT_ID 是您的 Google Cloud 项目的 ID。

创建服务帐号后,您可能需要等待 60 秒或更长时间才能使用该服务帐号。出现这种行为的原因是读取操作是最终一致的;新服务帐号可能需要一段时间才能显示。如果您在创建服务帐号后立即尝试读取或使用服务帐号,并且收到错误消息,则可以使用指数退避算法重试请求

控制台

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

    转到“创建服务帐号”

    其余步骤将自动显示在 Google Cloud 控制台中。

  2. 选择 Google Cloud 项目。
  3. 输入要在 Google Cloud 控制台中显示的服务帐号名称。

    Google Cloud 控制台会根据此名称生成服务帐号 ID。如有必要,请修改 ID。此 ID 创建后便无法更改。

  4. 可选:输入服务帐号的说明。
  5. 如果您现在不想设置访问权限控制,请点击完成以完成服务帐号的创建过程。如需立即设置访问权限控制,请点击创建并继续,然后继续执行下一步。
  6. 可选:选择要在项目上向服务帐号授予的一个或多个 IAM 角色
  7. 完成添加角色后,点击继续
  8. 可选:在服务帐号用户角色字段中,添加可以模拟服务帐号的成员。
  9. 可选:在服务帐号管理员角色字段中,添加可管理服务帐号的成员。
  10. 点击完成以完成服务帐号的创建过程。

gcloud

  1. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

    Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。

  2. 如需创建服务帐号,请运行 gcloud iam service-accounts create 命令:

    gcloud iam service-accounts create SA_NAME \
        --description="DESCRIPTION" \
        --display-name="DISPLAY_NAME"

    替换以下值:

    • SA_NAME:服务帐号的名称

    • DESCRIPTION:服务帐号的可选说明

    • DISPLAY_NAME:要在 Google Cloud 控制台中显示的服务帐号名称

  3. 可选:如需向您的服务帐号授予项目的 IAM 角色,请运行 gcloud projects add-iam-policy-binding 命令:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:SA_NAME@PROJECT_ID.iam.gserviceaccount.com" \
        --role="ROLE_NAME"

    替换以下值:

    • PROJECT_ID:项目 ID

    • SA_NAME:服务帐号的名称

    • ROLE_NAME:角色名称,例如 roles/compute.osLogin

  4. 可选:如需允许用户模拟服务帐号,请运行 gcloud iam service-accounts add-iam-policy-binding 命令以向用户授予服务帐号的 Service Account User 角色 (roles/iam.serviceAccountUser):

    gcloud iam service-accounts add-iam-policy-binding \
        SA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --member="user:USER_EMAIL" \
        --role="roles/iam.serviceAccountUser"

    替换以下值:

    • PROJECT_ID:项目 ID

    • SA_NAME:服务帐号的名称

    • USER_EMAIL:用户的电子邮件地址

REST

serviceAccounts.create 方法可创建服务帐号。

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

  • PROJECT_ID:您的 Google Cloud 项目 ID。项目 ID 是字母数字字符串,例如 my-project
  • SA_NAME:您的服务帐号的字母数字 ID。此名称必须介于 6 到 30 个字符之间,且可以包含小写字母数字字符和短划线。
  • SA_DESCRIPTION:可选。服务帐号说明。
  • SA_DISPLAY_NAME:服务帐号的人类可读名称。

HTTP 方法和网址:

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

请求 JSON 正文:

{
  "accountId": "SA_NAME",
  "serviceAccount": {
    "description": "SA_DESCRIPTION",
    "displayName": "SA_DISPLAY_NAME"
  }
}

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

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

{
  "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"
}

C++

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

如需向 IAM 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

namespace iam = ::google::cloud::iam_admin_v1;
[](std::string const& project_id, std::string const& account_id,
   std::string const& display_name, std::string const& description) {
  iam::IAMClient client(iam::MakeIAMConnection());
  google::iam::admin::v1::ServiceAccount service_account;
  service_account.set_display_name(display_name);
  service_account.set_description(description);
  auto response = client.CreateServiceAccount("projects/" + project_id,
                                              account_id, service_account);
  if (!response) throw std::move(response).status();
  std::cout << "ServiceAccount successfully created: "
            << response->DebugString() << "\n";
}

C#

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

如需向 IAM 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证


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

public partial class ServiceAccounts
{
    public static ServiceAccount CreateServiceAccount(string projectId,
        string name, string displayName)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(IamService.Scope.CloudPlatform);
        var service = new IamService(new IamService.Initializer
        {
            HttpClientInitializer = credential
        });

        var request = new CreateServiceAccountRequest
        {
            AccountId = name,
            ServiceAccount = new ServiceAccount
            {
                DisplayName = displayName
            }
        };
        var serviceAccount = service.Projects.ServiceAccounts.Create(
            request, "projects/" + projectId).Execute();
        Console.WriteLine("Created service account: " + serviceAccount.Email);
        return serviceAccount;
    }
}

Go

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

如需向 IAM 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

import (
	"context"
	"fmt"
	"io"

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

// createServiceAccount creates a service account.
func createServiceAccount(w io.Writer, projectID, name, displayName string) (*iam.ServiceAccount, error) {
	ctx := context.Background()
	service, err := iam.NewService(ctx)
	if err != nil {
		return nil, fmt.Errorf("iam.NewService: %w", 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: %w", err)
	}
	fmt.Fprintf(w, "Created service account: %v", account)
	return account, nil
}

Java

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

如需向 IAM 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.iam.v1.Iam;
import com.google.api.services.iam.v1.IamScopes;
import com.google.api.services.iam.v1.model.CreateServiceAccountRequest;
import com.google.api.services.iam.v1.model.ServiceAccount;
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 CreateServiceAccount {

  // Creates a service account.
  public static void createServiceAccount(String projectId, String serviceAccountName) {
    // String projectId = "my-project-id";
    // String serviceAccountName = "my-service-account-name";

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

    try {
      ServiceAccount serviceAccount = new ServiceAccount();
      serviceAccount.setDisplayName("your-display-name");
      CreateServiceAccountRequest request = new CreateServiceAccountRequest();
      request.setAccountId(serviceAccountName);
      request.setServiceAccount(serviceAccount);

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

      System.out.println("Created service account: " + serviceAccount.getEmail());
    } catch (IOException e) {
      System.out.println("Unable to create service account: \n" + e.toString());
    }
  }

  private static Iam initService() throws GeneralSecurityException, IOException {
    // 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));
    // Initialize the IAM service, which can be used to send requests to the IAM API.
    Iam service =
        new Iam.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                GsonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

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

如需向 IAM 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

import os

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

def create_service_account(project_id: str, name: str, display_name: str) -> dict:
    """Creates 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)

    my_service_account = service.projects().serviceAccounts().create(
        name='projects/' + project_id,
        body={
            'accountId': name,
            'serviceAccount': {
                'displayName': display_name
            }
        }).execute()

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

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

此外,如果服务帐号需要访问其他项目中的资源,则您通常必须在创建服务帐号的项目中为这些资源启用 API

后续步骤

自行试用

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

免费开始使用