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

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

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

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

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

新しく作成されたサービス アカウントにプロジェクトへのアクセス権を付与するには、プロジェクト IAM 管理者(roles/resourcemanager.projectIamAdmin)ロールも必要です。

サービス アカウントを作成するときは、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. Google Cloud プロジェクトを選択します。
  3. Google Cloud コンソールに表示するサービス アカウント名を入力します。

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

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

    Cloud Shell をアクティブにする

    Google Cloud コンソールの下部で Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。Cloud Shell はシェル環境です。Google Cloud CLI がすでにインストールされており、現在のプロジェクトの値もすでに設定されています。セッションが初期化されるまで数秒かかることがあります。

  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 コマンドを実行して、サービス アカウントのサービス アカウント ユーザーロール(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: ユーザーのメールアドレス

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

リクエストを送信するには、次のいずれかのオプションを展開します。

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts"

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts" | Select-Object -Expand Content

リクエスト本文をコピーして、メソッド リファレンス ページを開きます。ページの右側に [API Explorer] パネルが開きます。このツールを操作してリクエストを送信できます。このツールにリクエスト本文を貼り付け、その他の必須フィールドに入力して、[Execute] をクリックします。

次のような 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"
}

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

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;
   
}
}

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
}

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;
 
}
}

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

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

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

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

無料で開始