サービス アカウントの削除と削除取り消し

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

始める前に

  • Enable the IAM API.

    Enable the 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#

    ローカル開発環境でこのページの .NET サンプルを使用するには、gcloud CLI をインストールして初期化し、ユーザー認証情報を使用してアプリケーションのデフォルト認証情報を設定します。

    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

      gcloud init
    3. If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

    詳細については、Google Cloud の認証に関するドキュメントのローカル開発環境の認証の設定をご覧ください。

    C++

    ローカル開発環境でこのページの C++ サンプルを使用するには、gcloud CLI をインストールして初期化し、ユーザー認証情報を使用してアプリケーションのデフォルト認証情報を設定します。

    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

      gcloud init
    3. If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

    詳細については、Google Cloud の認証に関するドキュメントのローカル開発環境の認証の設定をご覧ください。

    Go

    ローカル開発環境でこのページの Go サンプルを使用するには、gcloud CLI をインストールして初期化し、ユーザー認証情報を使用してアプリケーションのデフォルト認証情報を設定します。

    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

      gcloud init
    3. If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

    詳細については、Google Cloud の認証に関するドキュメントのローカル開発環境の認証の設定をご覧ください。

    Java

    ローカル開発環境でこのページの Java サンプルを使用するには、gcloud CLI をインストールして初期化し、ユーザー認証情報を使用してアプリケーションのデフォルト認証情報を設定します。

    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

      gcloud init
    3. If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

    詳細については、Google Cloud の認証に関するドキュメントのローカル開発環境の認証の設定をご覧ください。

    Python

    ローカル開発環境でこのページの Python サンプルを使用するには、gcloud CLI をインストールして初期化し、ユーザー認証情報を使用してアプリケーションのデフォルト認証情報を設定します。

    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

      gcloud init
    3. If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

    詳細については、Google Cloud の認証に関するドキュメントのローカル開発環境の認証の設定をご覧ください。

    REST

    このページの REST API サンプルをローカル開発環境で使用するには、gcloud CLI に指定した認証情報を使用します。

      Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init

    詳細については、Google Cloud 認証ドキュメントの REST を使用して認証するをご覧ください。

  • IAM サービス アカウントについて理解する。

必要なロール

サービス アカウントの削除と削除取り消しに必要な権限を取得するには、プロジェクトに関する次の IAM ロールを付与するよう管理者に依頼してください。

ロールの付与の詳細については、アクセスの管理をご覧ください。

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

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

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

サービス アカウントを削除する

サービスアカウントを削除すると、アプリケーションでそのサービス アカウントから Google Cloud リソースにアクセスできなくなります。デフォルトの App Engine サービス アカウントや Compute Engine サービス アカウントを削除すると、それらのサービス アカウントを使用する App Engine アプリと Compute Engine VM インスタンスはプロジェクト内のリソースにアクセスできなくなります。

サービス アカウントの削除は慎重に行ってください。サービス アカウントを削除する前に、重要なアプリケーションがそのサービス アカウントを使用していないことを確認してください。サービス アカウントが使用されているかどうかわからない場合は、削除するのではなく、サービス アカウントを無効にすることをおすすめします。無効になっているサービス アカウントがまだ必要である場合は、再度有効にすることができます。

削除したサービス アカウントを復元する場合は、サービス アカウントを削除してから 30 日以内であれば、削除を取り消すことができます。30 日を過ぎると、IAM はサービス アカウントを完全に削除します。サービス アカウントが完全に削除された後は、サポート リクエストを送信していても、Google Cloud でサービス アカウントを復元できません。

必要なサービス アカウントが削除されるリスクをさらに軽減するために、変更リスクの推奨事項を有効にすることもできます。変更リスクの推奨事項では、Google Cloud が重要と識別したサービス アカウントを削除しようとすると、警告が生成されます。

サービス アカウントを削除した後に同じ名前で新しいサービス アカウントを作成した場合、新しいサービス アカウントは別の ID として扱われます。削除されたサービス アカウントに付与されているロールは継承されません。一方、サービス アカウントを削除してからその削除を取り消しても、サービス アカウントの ID は変更されず、サービス アカウントのロールは維持されます。

サービス アカウントが削除されても、ロールのバインディングはすぐには削除されません。最大期間の 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.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.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

public class DeleteServiceAccount {

  // Deletes a service account.
  public static void deleteServiceAccount(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;
    }

    String serviceAccountEmail = serviceAccountName + "@" + projectId + ".iam.gserviceaccount.com";
    try {
      service
          .projects()
          .serviceAccounts()
          .delete("projects/-/serviceAccounts/" + serviceAccountEmail)
          .execute();

      System.out.println("Deleted service account: " + serviceAccountEmail);
    } catch (IOException e) {
      System.out.println("Unable to delete 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 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。これは、サービス アカウントのメールアドレス(SA_NAME@PROJECT_ID.iam.gserviceaccount.com の形式)、またはサービス アカウントの一意の数値 ID のいずれかです。

HTTP メソッドと URL:

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 を探して書き留めます。

    • 検索結果に 1 つの DeleteServiceAccount オペレーションしか含まれていない場合、[ログのフィールド] ペインの [一意の ID] フィールドで数値 ID を探します。

    • 検索結果に複数のログが表示される場合は、次のようにします。

      1. 正しいログエントリを見つけます。正しいログエントリを見つけるには、ログエントリの横にある 展開矢印をクリックします。ログエントリの詳細を確認し、元に戻すオペレーションのログエントリがあるかどうかを確認します。正しいログエントリが見つかるまでこの手順を繰り返します。

      2. 正しいログエントリで、サービス アカウントの数値 ID を見つけます。数値 ID を確認するには、ログエントリの protoPayload フィールドを展開して、resourceName フィールドを探します。

        resourceName フィールドの serviceAccounts より後すべてが数値 ID です。

サービス アカウントの数値 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 メソッドと URL:

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

無料で開始