サービス アカウントを作成する

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

このページでは、Identity and Access Management(IAM)API、Google Cloud コンソール、gcloud コマンドライン ツールを使用してサービス アカウントを作成する方法について説明します。

デフォルトでは、各プロジェクトには最大 100 個のサービス アカウントを設定し、リソースへのアクセスを制御できます。必要な場合は、割り当ての増加をリクエストできます。割り当てと上限をご覧ください。

始める前に

必要なロール

サービス アカウントの作成に必要な権限を取得するには、プロジェクトに対するサービス アカウントの作成roles/iam.serviceAccountCreator)IAM ロールを付与するよう管理者に依頼してください。ロールの付与の詳細については、アクセスの管理をご覧ください。

このロールの詳細については、サービス アカウントのロールをご覧ください。

IAM の基本ロールには、サービス アカウントを管理する権限も含まれています。本番環境では基本ロールを付与すべきではありません。基本ロールは、開発環境またはテスト環境で付与してください。

サービス アカウントを作成する

サービス アカウントを作成するときは、my-service-account など、英数字の ID(以下のサンプルでは SA_NAME)を指定する必要があります。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. Cloud プロジェクトを選択します。
  3. Google Cloud コンソールに表示するサービス アカウント名を入力します。

    この名前に基づいてサービス アカウント ID が生成され、Google Cloud コンソールに表示されます。必要に応じて ID を編集します。後で ID を変更することはできません。

  4. (省略可)サービス アカウントの説明を入力します。
  5. アクセス制御を今すぐ設定しない場合は、[完了] をクリックしてサービス アカウントの作成を終了します。アクセス制御を今すぐ設定するには、[作成して続行] をクリックして次に進みます。
  6. (省略可)プロジェクトのサービス アカウントに付与する 1 つ以上の IAM ロールを選択します。
  7. ロールの追加が完了したら、[続行] をクリックします。
  8. (省略可)[サービス アカウント ユーザーロール] フィールドに、サービス アカウントの権限を借用できるメンバーを追加します。
  9. (省略可)[サービス アカウント管理者ロール] フィールドに、サービス アカウントを管理するユーザーを追加します。
  10. [完了] をクリックして、サービス アカウントの作成を完了します。

gcloud CLI

  1. サービス アカウントを作成するには、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 コンソールに表示するサービス アカウント名
  2. (省略可)サービス アカウントにプロジェクトの 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
  3. (省略可)ユーザーにサービス アカウントの権限借用を許可するには、gcloud iam service-accounts add-iam-policy-binding コマンドを実行して、サービス アカウントのサービス アカウント ユーザーロール(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 メソッドと URL:

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 のリファレンス ドキュメントをご覧ください。

namespace iam = ::google::cloud::iam;
[](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 のリファレンス ドキュメントをご覧ください。


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 のリファレンス ドキュメントをご覧ください。

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: %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

IAM のクライアント ライブラリをインストールして使用する方法については、IAM クライアント ライブラリをご覧ください。詳細については、IAM Java API のリファレンス ドキュメントをご覧ください。

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
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(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

IAM のクライアント ライブラリをインストールして使用する方法については、IAM クライアント ライブラリをご覧ください。詳細については、IAM Python API のリファレンス ドキュメントをご覧ください。

import os

from google.oauth2 import service_account
import googleapiclient.discovery

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

サービス アカウントを作成したら、そのサービス アカウントに 1 つ以上のロールを付与し、自分を代行できるようにします。

また、サービス アカウントが他のプロジェクトのリソースにアクセスする必要がある場合は、サービス アカウントを作成したプロジェクトのリソースで API を有効にする必要があります。

次のステップ

使ってみる

Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。

無料で開始