サービス アカウント キーの作成と管理

このページでは、Google Cloud コンソール、Google Cloud CLIIdentity and Access Management APIGoogle Cloud クライアント ライブラリのいずれかを使用して、サービス アカウント キーを作成、管理する方法について説明します。

始める前に

必要なロール

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

詳しくは、サービス アカウントのロールをご覧ください。

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

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

他のプラットフォームやオンプレミスなど、Google Cloud の外部でサービス アカウントを使用するには、最初にサービス アカウントの ID を設定する必要があります。公開鍵 / 秘密鍵ペアを使用すると、これを安全に設定できます。サービス アカウント キーを作成すると、公開部分は Google Cloud に保存され、非公開の部分は自分だけが使用できます。公開鍵 / 秘密鍵のペアの詳細については、サービス アカウント キーをご覧ください。

サービス アカウント キーは、Google Cloud コンソール、gcloud CLI、serviceAccounts.keys.create() メソッド、いずれかのクライアント ライブラリを使用して作成できます。サービス アカウントには最大 10 個の鍵を設定できます。

以下の例で、SA_NAME はサービス アカウントの名前、PROJECT_ID は Google Cloud プロジェクトの ID です。SA_NAME@PROJECT_ID.iam.gserviceaccount.com 文字列は、Google Cloud コンソールの [サービス アカウント] ページから取得できます。

コンソール

  1. Google Cloud コンソールで [サービス アカウント] ページに移動します。

    [サービス アカウント] に移動
    残りの手順は Google Cloud コンソールに自動的に表示されます。

  2. プロジェクトを選択します。
  3. キーを作成するサービス アカウントのメールアドレスをクリックします。
  4. [キー] タブをクリックします。 tab.
  5. [鍵を追加] プルダウン メニューをクリックして、[新しい鍵を作成] を選択します。
  6. 鍵のタイプとして [JSON] を選択し、[作成] をクリックします。

[作成] をクリックすると、サービス アカウント キーファイルがダウンロードされます。鍵ファイルをダウンロードした後、再度ダウンロードすることはできません。

ダウンロードされる鍵の形式は次のとおりです。ここで PRIVATE_KEY は公開鍵 / 秘密鍵ペアの非公開部分です。

{
  "type": "service_account",
  "project_id": "PROJECT_ID",
  "private_key_id": "KEY_ID",
  "private_key": "-----BEGIN PRIVATE KEY-----\nPRIVATE_KEY\n-----END PRIVATE KEY-----\n",
  "client_email": "SERVICE_ACCOUNT_EMAIL",
  "client_id": "CLIENT_ID",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://accounts.google.com/o/oauth2/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/SERVICE_ACCOUNT_EMAIL"
}

鍵ファイルは、サービス アカウントとしての認証で使用できるため、安全な場所に保管してください。このファイルは任意の場所に移動できます。名前の変更も可能です。

サービス アカウント キー ファイルを使用すると、アプリケーションをサービス アカウントとして認証できます。

gcloud CLI

gcloud iam service-accounts keys create コマンドを実行して、サービス アカウント キーを作成します。

次の値を置き換えます。

  • KEY_FILE: 秘密鍵の新しい出力ファイルのパス(例: ~/sa-private-key.json)。
  • SA_NAME: 鍵を作成するサービス アカウントの名前。
  • PROJECT_ID: Google Cloud プロジェクト ID。
gcloud iam service-accounts keys create KEY_FILE \
    --iam-account=SA_NAME@PROJECT_ID.iam.gserviceaccount.com

出力:

created key [e44da1202f82f8f4bdd9d92bc412d1d8a837fa83] of type [json] as
[/usr/home/username/KEY_FILE] for
[SA_NAME@PROJECT_ID.iam.gserviceaccount.com]

これで、マシンにサービス アカウント キーファイルがダウンロードされました。鍵ファイルをダウンロードした後、再度ダウンロードすることはできません。

ダウンロードされる鍵の形式は次のとおりです。ここで PRIVATE_KEY は公開鍵 / 秘密鍵ペアの非公開部分です。

{
  "type": "service_account",
  "project_id": "PROJECT_ID",
  "private_key_id": "KEY_ID",
  "private_key": "-----BEGIN PRIVATE KEY-----\nPRIVATE_KEY\n-----END PRIVATE KEY-----\n",
  "client_email": "SERVICE_ACCOUNT_EMAIL",
  "client_id": "CLIENT_ID",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://accounts.google.com/o/oauth2/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/SERVICE_ACCOUNT_EMAIL"
}

鍵ファイルは、サービス アカウントとしての認証で使用できるため、安全な場所に保管してください。このファイルは任意の場所に移動できます。名前の変更も可能です。

サービス アカウント キー ファイルを使用すると、アプリケーションをサービス アカウントとして認証できます。

REST

projects.serviceAccounts.keys.create メソッドは、サービス アカウントのキーを作成します。

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
  • SA_NAME: 鍵を作成するサービス アカウントの名前。
  • KEY_ALGORITHM: 省略可。鍵に使用する鍵アルゴリズム。デフォルトは、2,048 ビットの RSA 鍵です(変更されることがあります)。使用できるすべての値のリストについては、ServiceAccountKeyAlgorithm リファレンスをご覧ください。

HTTP メソッドと URL:

POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_NAME@PROJECT_ID.iam.gserviceaccount.com/keys

JSON 本文のリクエスト:

{
  "keyAlgorithm": "KEY_ALGORITHM"
}

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

レスポンスにはサービス アカウント キーが含まれています。返される鍵の形式は次のとおりです。ここで ENCODED_PRIVATE_KEY は、公開鍵 / 秘密鍵ペアの非公開部分であり、Base64 でエンコードされています。

{
  "name": "projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_EMAIL/keys/KEY_ID",
  "privateKeyType": "TYPE_GOOGLE_CREDENTIALS_FILE",
  "privateKeyData": "ENCODED_PRIVATE_KEY",
  "validAfterTime": "DATE",
  "validBeforeTime": "DATE",
  "keyAlgorithm": "KEY_ALG_RSA_2048"
}

サービス アカウントとして認証するために使用する鍵ファイルを作成するには、秘密鍵データをデコードし、ファイルに保存します。

Linux

次のコマンドを実行します。

echo 'ENCODED_PRIVATE_KEY' | base64 --decode > PATH

PATH は、鍵を保存するファイルのパスで置き換えます。ファイル拡張子に .json を使用します。

macOS

次のコマンドを実行します。

echo 'ENCODED_PRIVATE_KEY' | base64 --decode > PATH

PATH は、鍵を保存するファイルのパスで置き換えます。ファイル拡張子に .json を使用します。

PowerShell

  1. エンコードされた秘密鍵データ(ENCODED_PRIVATE_KEY)をファイルに保存します。

  2. certutil を使用して、ファイルをデコードします。

    certutil -decode ENCODED_FILE DECODED_FILE

    次の値を置き換えます。

    • ENCODED_FILE: エンコードされた秘密鍵データを含むファイルのパス。
    • DECODED_FILE: 鍵を保存するファイルのパス。ファイル拡張子に .json を使用します。

鍵データは、サービス アカウントとしての認証で使用されるため、安全な場所に保管してください。

サービス アカウント キー ファイルを使用すると、アプリケーションをサービス アカウントとして認証できます。

C++

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

namespace iam = ::google::cloud::iam;
return [](std::string const& name) {
  iam::IAMClient client(iam::MakeIAMConnection());
  auto response = client.CreateServiceAccountKey(
      name,
      google::iam::admin::v1::ServiceAccountPrivateKeyType::
          TYPE_GOOGLE_CREDENTIALS_FILE,
      google::iam::admin::v1::ServiceAccountKeyAlgorithm::KEY_ALG_RSA_2048);
  if (!response) throw std::move(response).status();
  std::cout << "ServiceAccountKey successfully created: "
            << response->DebugString() << "\n"
            << "Please save the key in a secure location, as they cannot "
               "be downloaded later\n";
  return response->name();
}

C#

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


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

public partial class ServiceAccountKeys
{
    public static ServiceAccountKey CreateKey(string serviceAccountEmail)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(IamService.Scope.CloudPlatform);
        var service = new IamService(new IamService.Initializer
        {
            HttpClientInitializer = credential
        });

        var key = service.Projects.ServiceAccounts.Keys.Create(
            new CreateServiceAccountKeyRequest(),
            "projects/-/serviceAccounts/" + serviceAccountEmail)
            .Execute();

        // The PrivateKeyData field contains the base64-encoded service account key
        // in JSON format.
        // TODO(Developer): Save the below key (jsonKeyFile) to a secure location.
        //  You cannot download it later.
        byte[] valueBytes = System.Convert.FromBase64String(key.PrivateKeyData);
        string jsonKeyContent = Encoding.UTF8.GetString(valueBytes);

        Console.WriteLine("Key created successfully");
        return key;
    }
}

Go

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

import (
	"context"
	// "encoding/base64"
	"fmt"
	"io"

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

// createKey creates a service account key.
func createKey(w io.Writer, serviceAccountEmail string) (*iam.ServiceAccountKey, error) {
	ctx := context.Background()
	service, err := iam.NewService(ctx)
	if err != nil {
		return nil, fmt.Errorf("iam.NewService: %v", err)
	}

	resource := "projects/-/serviceAccounts/" + serviceAccountEmail
	request := &iam.CreateServiceAccountKeyRequest{}
	key, err := service.Projects.ServiceAccounts.Keys.Create(resource, request).Do()
	if err != nil {
		return nil, fmt.Errorf("Projects.ServiceAccounts.Keys.Create: %v", err)
	}
	// The PrivateKeyData field contains the base64-encoded service account key
	// in JSON format.
	// TODO(Developer): Save the below key (jsonKeyFile) to a secure location.
	// You cannot download it later.
	// jsonKeyFile, _ := base64.StdEncoding.DecodeString(key.PrivateKeyData)
	fmt.Fprintf(w, "Key created successfully")
	return key, 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.CreateServiceAccountKeyRequest;
import com.google.api.services.iam.v1.model.ServiceAccountKey;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Base64;
import java.util.Collections;

public class CreateServiceAccountKey {

  // Creates a key for a service account.
  public static String createKey(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);
      return null;
    }

    // Construct the service account email.
    // You can modify the ".iam.gserviceaccount.com" to match the service account name in which
    // you want to create the key.
    // See, https://cloud.google.com/iam/docs/creating-managing-service-account-keys?hl=en#creating
    String serviceAccountEmail = serviceAccountName + "@" + projectId + ".iam.gserviceaccount.com";
    try {
      ServiceAccountKey key =
          service
              .projects()
              .serviceAccounts()
              .keys()
              .create(
                  "projects/-/serviceAccounts/" + serviceAccountEmail,
                  new CreateServiceAccountKeyRequest())
              .execute();

      // The privateKeyData field contains the base64-encoded service account key
      // in JSON format.
      // TODO(Developer): Save the below key (jsonKeyFile) to a secure location.
      //  You cannot download it later.
      String jsonKeyFile = new String(Base64.getDecoder().decode(key.getPrivateKeyData()));

      System.out.println("Key created successfully");
      String keyName = key.getName();
      return keyName.substring(keyName.lastIndexOf("/") + 1).trim();
    } catch (IOException e) {
      System.out.println("Unable to create service account key: \n" + e);
      return null;
    }
  }

  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-account-keys")
            .build();
    return service;
  }
}

Python

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

import os

from google.oauth2 import service_account
import googleapiclient.discovery

def create_key(service_account_email):
    """Creates a key for 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)

    key = service.projects().serviceAccounts().keys().create(
        name='projects/-/serviceAccounts/' + service_account_email, body={}
        ).execute()

    # The privateKeyData field contains the base64-encoded service account key
    # in JSON format.
    # TODO(Developer): Save the below key {json_key_file} to a secure location.
    #  You cannot download it again later.
    # import base64
    # json_key_file = base64.b64decode(key['privateKeyData']).decode('utf-8')

    if not key['disabled']:
        print('Created json key')

サービス アカウント キーを一覧表示する

Google Cloud コンソール、gcloud CLI、serviceAccount.keys.list() メソッド、いずれかのクライアント ライブラリを使用して、サービス アカウントのサービス アカウント キーを一覧表示できます。

serviceAccount.keys.list() メソッドは、サービス アカウントと鍵の監査や、サービス アカウント管理用のカスタムツールの作成に広く使用されています。

鍵の所属先プロジェクトを確認するには、鍵を JSON ファイルとしてダウンロードし、そのファイルの内容を確認します。

作成していない鍵が一覧表示されることがあります。これらは Google が作成したキーであり、Service Account Credentials API で使用されます。詳細については、Google 管理の鍵ペアをご覧ください。

コンソール

  1. Google Cloud コンソールで [サービス アカウント] ページに移動します。

    [サービス アカウント] に移動
    残りの手順は Google Cloud コンソールに自動的に表示されます。

  2. プロジェクトを選択します。
  3. [サービス アカウント] ページで、キーを一覧表示するサービス アカウントのメールアドレスをクリックします。
  4. [] をクリックします。Google Cloud コンソールに、サービス アカウント キーのリストが表示されます。

gcloud CLI

gcloud iam service-accounts keys list コマンドを実行して、サービス アカウント キーを一覧表示します。

次の値を置き換えます。

  • SA_NAME: 鍵を一覧表示するサービス アカウントの名前。
  • PROJECT_ID: Google Cloud プロジェクト ID。
gcloud iam service-accounts keys list \
    --iam-account=SA_NAME@PROJECT_ID.iam.gserviceaccount.com

出力:

KEY_ID CREATED_AT EXPIRES_AT DISABLED
8e6e3936d7024646f8ceb39792006c07f4a9760c 2021-01-01T21:01:42Z 9999-12-31T23:59:59Z  
937c98f870f5c8db970af527aa3c12fd88b1c20a 2021-01-01T20:55:40Z 9999-12-31T23:59:59Z True

REST

projects.serviceAccounts.keys.list メソッドは、サービス アカウントのすべてのサービス アカウント キーを一覧表示します。

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
  • SA_NAME: キーを一覧表示するサービス アカウントの名前。
  • KEY_TYPES: 省略可。レスポンスに含めるキータイプのカンマ区切りのリスト。キータイプは、キーがユーザー管理(USER_MANAGED)かシステム管理(SYSTEM_MANAGED)かを示します。空白のままにすると、すべてのキーが返されます。

HTTP メソッドと URL:

GET https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_NAME@PROJECT_ID.iam.gserviceaccount.com/keys?keyTypes=KEY_TYPES

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

次のような JSON レスポンスが返されます。

{
  "keys": [
    {
      "name": "projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com/keys/90c48f61c65cd56224a12ab18e6ee9ca9c3aee7c",
      "validAfterTime": "2020-03-04T17:39:47Z",
      "validBeforeTime": "9999-12-31T23:59:59Z",
      "keyAlgorithm": "KEY_ALG_RSA_2048",
      "keyOrigin": "GOOGLE_PROVIDED",
      "keyType": "USER_MANAGED"
    },
    {
      "name": "projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com/keys/e5e3800831ac1adc8a5849da7d827b4724b1fce8",
      "validAfterTime": "2020-03-31T23:50:09Z",
      "validBeforeTime": "9999-12-31T23:59:59Z",
      "keyAlgorithm": "KEY_ALG_RSA_2048",
      "keyOrigin": "GOOGLE_PROVIDED",
      "keyType": "USER_MANAGED"
    },
    {
      "name": "projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com/keys/b97699f042b8eee6a846f4f96259fbcd13e2682e",
      "validAfterTime": "2020-05-17T18:58:13Z",
      "validBeforeTime": "9999-12-31T23:59:59Z",
      "keyAlgorithm": "KEY_ALG_RSA_2048",
      "keyOrigin": "GOOGLE_PROVIDED",
      "keyType": "USER_MANAGED",
      "disabled": true
    }
  ]
}

C++

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

namespace iam = ::google::cloud::iam;
[](std::string const& service_account_name,
   std::vector<std::string> const& key_type_labels) {
  iam::IAMClient client(iam::MakeIAMConnection());
  std::vector<google::iam::admin::v1::ListServiceAccountKeysRequest::KeyType>
      key_types;
  for (auto const& type : key_type_labels) {
    if (type == "USER_MANAGED") {
      key_types.push_back(google::iam::admin::v1::
                              ListServiceAccountKeysRequest::USER_MANAGED);
    } else if (type == "SYSTEM_MANAGED") {
      key_types.push_back(google::iam::admin::v1::
                              ListServiceAccountKeysRequest::SYSTEM_MANAGED);
    }
  }
  auto response =
      client.ListServiceAccountKeys(service_account_name, key_types);
  if (!response) throw std::move(response).status();
  std::cout << "ServiceAccountKeys successfully retrieved: "
            << response->DebugString() << "\n";
}

C#

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


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

public partial class ServiceAccountKeys
{
    public static IList<ServiceAccountKey> ListKeys(string serviceAccountEmail)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(IamService.Scope.CloudPlatform);
        var service = new IamService(new IamService.Initializer
        {
            HttpClientInitializer = credential
        });

        var response = service.Projects.ServiceAccounts.Keys
            .List($"projects/-/serviceAccounts/{serviceAccountEmail}")
            .Execute();
        foreach (ServiceAccountKey key in response.Keys)
        {
            Console.WriteLine("Key: " + key.Name);
        }
        return response.Keys;
    }
}

Go

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

import (
	"context"
	"fmt"
	"io"

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

// listKey lists a service account's keys.
func listKeys(w io.Writer, serviceAccountEmail string) ([]*iam.ServiceAccountKey, error) {
	ctx := context.Background()
	service, err := iam.NewService(ctx)
	if err != nil {
		return nil, fmt.Errorf("iam.NewService: %v", err)
	}

	resource := "projects/-/serviceAccounts/" + serviceAccountEmail
	response, err := service.Projects.ServiceAccounts.Keys.List(resource).Do()
	if err != nil {
		return nil, fmt.Errorf("Projects.ServiceAccounts.Keys.List: %v", err)
	}
	for _, key := range response.Keys {
		fmt.Fprintf(w, "Listing key: %v", key.Name)
	}
	return response.Keys, 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.ServiceAccountKey;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;
import java.util.List;

public class ListServiceAccountKeys {

  // Lists all keys for a service account.
  public static void listKeys(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 {
      List<ServiceAccountKey> keys =
          service
              .projects()
              .serviceAccounts()
              .keys()
              .list("projects/-/serviceAccounts/" + serviceAccountEmail)
              .execute()
              .getKeys();

      for (ServiceAccountKey key : keys) {
        System.out.println("Key: " + key.getName());
      }
    } catch (IOException e) {
      System.out.println("Unable to list service account keys: \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-account-keys")
            .build();
    return service;
  }
}

Python

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

import os

from google.oauth2 import service_account
import googleapiclient.discovery

def list_keys(service_account_email):
    """Lists all keys for 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)

    keys = service.projects().serviceAccounts().keys().list(
        name='projects/-/serviceAccounts/' + service_account_email).execute()

    for key in keys['keys']:
        print('Key: ' + key['name'])

サービス アカウントの鍵を取得

gcloud CLI または REST API を使用して、サービス アカウント キーの公開鍵データを取得できます。さらに、Google Cloud コンソール、gcloud CLI、または REST API を使用して、鍵のメタデータ(鍵が使用しているアルゴリズムや、鍵がユーザー管理か Google 管理かなど)を取得できます。

コンソール

サービス アカウント キーの公開鍵データを取得するには:

代わりに gcloud CLI または REST API を使用してください。このデータは Google Cloud コンソールでは使用できません。

サービス アカウント キーのメタデータを取得するには:

  1. Google Cloud コンソールで [サービス アカウント] ページに移動します。

    [サービス アカウント] に移動
    残りの手順は Google Cloud コンソールに自動的に表示されます。

  2. プロジェクトを選択します。
  3. [サービス アカウント] ページで、キーを一覧表示するサービス アカウントのメールアドレスをクリックします。
  4. [] をクリックします。Google Cloud コンソールに、サービス アカウント キーのリストと各鍵のメタデータが表示されます。

gcloud CLI

サービス アカウント キーの公開鍵データを取得するには:

gcloud beta iam service-accounts keys get-public-key コマンドを実行します。

gcloud beta iam service-accounts keys get-public-key KEY_ID \
    --iam-account=SA_NAME --output-file=FILENAME

次の値を指定します。

  • KEY_ID: 取得する公開鍵の ID。鍵の ID を確認するには、サービス アカウントのすべての鍵を一覧表示し、取得する鍵を特定してその ID をコピーします。
  • SA_NAME: 公開鍵を取得するサービス アカウントの名前。
  • FILENAME: 公開鍵データを保存するファイル。

デフォルトでは、公開鍵データは X.509 PEM 形式で保存されます。未加工の公開鍵を取得するには、追加のフラグ --type=raw を指定してコマンドを実行します。

たとえば、次のコマンドは、サービス アカウント my-service-account@my-project.iam.gserviceaccount.com に属しているキー c97cc34494c07c9b483701f28368f20145b9ef97 の公開鍵データを取得して、公開鍵データをファイル public_key.pem に保存します。

gcloud beta iam service-accounts keys get-public-key \
    c97cc34494c07c9b483701f28368f20145b9ef97 \
    --iam-account=my-service-account@my-project.iam.gserviceaccount.com \
    --output-file=public_key.pem

サービス アカウント キーのメタデータを取得するには:

gcloud iam service-accounts keys list コマンドを実行します。

gcloud iam service-accounts keys list --iam-account=SA_NAME \
    --filter="name~KEY_ID" --format=json

次の値を指定します。

  • SA_NAME: 鍵のメタデータが必要なサービス アカウントの名前。
  • KEY_ID: メタデータを取得する鍵の ID。

たとえば、次のコマンドは、サービス アカウント my-service-account@my-project.iam.gserviceaccount.com に属する鍵 c97cc34494c07c9b483701f28368f20145b9ef97 のメタデータを取得します。

gcloud iam service-accounts keys list \
    --iam-account=my-service-account@my-project.iam.gserviceaccount.com \
    --filter="name~c97cc34494c07c9b483701f28368f20145b9ef97" --format=json

REST

projects.serviceAccounts.keys.get メソッドは、サービス アカウントの公開鍵に関する情報を返します。

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
  • SA_NAME: 公開鍵を取得するサービス アカウントの名前。
  • KEY_ID: 取得する公開鍵の ID。鍵の ID を確認するには、サービス アカウントのすべての鍵を一覧表示して、取得する鍵を特定し、name の最後からその ID をコピーします。keys/ より後のすべての部分が鍵の一意の ID になります。
  • KEY_TYPE: 公開鍵を返す形式。X.509 PEM 形式の場合は TYPE_X509_PEM_FILE を使用し、未加工の公開鍵の場合は TYPE_RAW_PUBLIC_KEY を使用します。このクエリ パラメータを省略すると、メソッドは鍵のメタデータを返しますが、公開鍵データは返しません。

HTTP メソッドと URL:

GET https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_NAME@PROJECT_ID.iam.gserviceaccount.com/keys/KEY_ID?publicKeyType=KEY_TYPE

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

次のような JSON レスポンスが返されます。

{
  "name": "projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com/keys/f4a83933ac07cf52bb74e0e66d99662a09f51a36",
  "validAfterTime": "2021-12-10T17:32:06Z",
  "validBeforeTime": "9999-12-31T23:59:59Z",
  "publicKeyData": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvRENDQWVTZ0F3SUJBZ0lJT2lCdm9hR09nV0F3RFFZSktvWklodmNOQVFFRkJRQXdJREVlTUJ3R0ExVUUKQXhNVk1UQXhNVGsxTlRFMk5UWXlPRGszTmpFek1qQXpNQ0FYRFRJeE1USXhNREUzTXpJd05sb1lEems1T1RreApNak14TWpNMU9UVTVXakFnTVI0d0hBWURWUVFERXhVeE1ERXhPVFUxTVRZMU5qSTRPVGMyTVRNeU1ETXdnZ0VpCk1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQzdzeDBFcXVUMGNwSXhlczl1SW0yRy9DS3EKdnc4YTl2a2JkaWZZbDZHSDh1ZUxEWDhGNHVUeEVQMkNzU3JLTHZtOFo2My9IVUxnWjBtQXByb0JlM08vaVR1ZwpmYVZ0NVNtakhvWm9YQ1lpbjR0MS93SkpvdDhrRFdPeDZhOEdieUdqZ215ak8yYk1XdEtaQ2dqeGZ3cUV0MmN3CklnajA5VzJKYTlHTWRsdVA0VGVubTRKSkJoaFpFbTJ1bVAwYVZZdkRnUWF5d0RCYnJuNG8yY0EzSWplRDZGM1gKK0VHRDNKU0s4VW02Sk5sM21adGp6VWNZSHBrYkF0U1A2ZDI5d1RmZkdIRFY0THJRWlM3bG15d3hsb3p5WnpaawpCOFpHckMzSkF1MVNVRTdQOTN6bWtFb1B6MlRUNWhaYXZMWFQ5TGM2SExiRklRVHFnVEJVWHlNMkpIcGZBZ01CCkFBR2pPREEyTUF3R0ExVWRFd0VCL3dRQ01BQXdEZ1lEVlIwUEFRSC9CQVFEQWdlQU1CWUdBMVVkSlFFQi93UU0KTUFvR0NDc0dBUVVGQndNQ01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQkhPNXlpUDY3NkE4UEN2RjdRSzdFMApYZVljbzdsSStFZkowaGJrWVlmdUtnSENPcXcvd3FBbCtOSithanljT2FPWDFPMlRZN3ZOc05pR2t3eWc2QXdqCklhL1NHVjd3NkxpS2JldFRuSVp4UlhRY25lcnVvZEwycUR5eWphMDJJSXJVTmVKY1o0MVJBNXRTL3NkcTFGNm4KM0NjSXFoZTI1OTA4TUNna3cwaFB1K0VLbFF6R1B5T3pVRHBLdXg0cnRBaHJTYTBUVW1wbEMxdTJnUk1YRkF6aApWUjU0V2dNa2tabURyalBNeWdBS3JmNkd0bHo2VHRTYTVLb1BWdGpsWExUQkxaSnlhdk4zc1F2dFlBK1NFQWpWCnA1N1ZabFBYZmR0dWN4ekJaOC9zS25SOHNyYU5hVWFjamg1NEE1Nm1URTE3b0IyUWkrTHBJUTYvNnVqVnNXaUYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=",
  "keyAlgorithm": "KEY_ALG_RSA_2048",
  "keyOrigin": "GOOGLE_PROVIDED",
  "keyType": "USER_MANAGED"
}

サービス アカウントの公開鍵をアップロードする

ユーザーが管理する鍵ペアの公開鍵の部分をアップロードして、サービス アカウントに関連付けることができます。公開鍵をアップロードすると、鍵ペアの秘密鍵をサービス アカウント キーとして使用できます。

アップロードする鍵は、X.509 v3 証明書でラップされ、base64 でエンコードされた RSA 公開鍵である必要があります。OpenSSL などのツールを使用して、この形式の鍵と証明書を生成できます。

X.509 証明書に個人情報を含めないでください。一般的なサブジェクトを使用してください。また、省略可能な属性は追加しないでください。証明書は一般公開されています。証明書に含まれる個人情報は、証明書を取得するすべての人に開示されます。詳しくは、アップロードされる X.509 証明書に機密情報を含めないをご覧ください。

たとえば、次のコマンドは 2,048 ビットの RSA 鍵ペアを生成し、公開鍵を 365 日間有効な自己署名証明書にラップします。

openssl req -x509 -nodes -newkey rsa:2048 -days 365 \
    -keyout /path/to/private_key.pem \
    -out /path/to/public_key.pem \
    -subj "/CN=unused"

その後、サービス アカウントの公開鍵として public_key.pem ファイルをアップロードできます。

プロジェクトのキーのアップロードを無効にする方法については、サービス アカウント キーのアップロードを制限するをご覧ください。

コンソール

  1. Google Cloud コンソールで [サービス アカウント] ページに移動します。

    [サービス アカウント] に移動
    残りの手順は Google Cloud コンソールに自動的に表示されます。

  2. プロジェクトを選択します。
  3. [サービス アカウント] ページで、キーをアップロードするサービス アカウントのメールアドレスをクリックします。
  4. [キー] タブをクリックします。
  5. [鍵を追加] プルダウン メニューをクリックして、[既存の鍵をアップロード] を選択します。
  6. [参照] をクリックし、公開鍵ファイルを見つけて選択します。または、[既存の鍵を貼り付け] ボックスに公開鍵の内容をコピーして貼り付けることもできます。
  7. [アップロード] をクリックします。

gcloud CLI

gcloud iam service-accounts keys upload コマンドを実行して、サービス アカウント キーに署名するための公開鍵をアップロードします。

次の値を置き換えます。

  • KEY_FILE: アップロードする鍵データを含むファイルのパス(./public_key.pem など)。
  • SA_NAME: 鍵をアップロードするサービス アカウントの名前。
  • PROJECT_ID: Google Cloud プロジェクト ID。
gcloud iam service-accounts keys upload KEY_FILE \
    --iam-account=SA_NAME@PROJECT_ID.iam.gserviceaccount.com

アップロードした鍵の一意な ID が出力されます。

Name: projects/PROJECT_ID/serviceAccounts/SA_NAME@PROJECT_ID.iam.gserviceaccount.com/keys/c7b74879da78e4cdcbe7e1bf5e129375c0bfa8d0

コマンドが成功したかどうかを確認するには、gcloud iam service-accounts keys list コマンドを実行します。

gcloud iam service-accounts keys list \
    --iam-account=SA_NAME@PROJECT_ID.iam.gserviceaccount.com

次のように、出力にはキーの作成後に返された一意な ID が含まれます。

KEY_ID CREATED_AT EXPIRES_AT DISABLED
c7b74879da78e4cdcbe7e1bf5e129375c0bfa8d0 2019-06-26T21:01:42Z 9999-12-31T23:59:59Z  

REST

projects.serviceAccounts.keys.upload メソッドは、ユーザーが管理する鍵ペアから公開鍵をアップロードし、この鍵をサービス アカウントに追加します。

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
  • SA_NAME: 鍵を関連付けるサービス アカウントの名前。
  • PUBLIC_KEY_DATA: 鍵ペアの公開鍵データ。X.509 v3 証明書でラップされた RSA 公開鍵である必要があります。最初の行(-----BEGIN CERTIFICATE-----)と最後の行(-----END CERTIFICATE-----)を含め、公開鍵データを base64 でエンコードします。

HTTP メソッドと URL:

POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_NAME@PROJECT_ID.iam.gserviceaccount.com/keys:upload

JSON 本文のリクエスト:

{
  "publicKeyData": "PUBLIC_KEY_DATA"
}

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

次のような JSON レスポンスが返されます。

{
  "name": "projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com/keys/c7b74879da78e4cdcbe7e1bf5e129375c0bfa8d0",
  "validAfterTime": "2020-05-17T19:31:19Z",
  "validBeforeTime": "2021-05-17T19:31:19Z",
  "keyAlgorithm": "KEY_ALG_RSA_2048",
  "keyOrigin": "USER_PROVIDED",
  "keyType": "USER_MANAGED"
}

サービス アカウント キーを無効にする

サービス アカウント キーを無効にすると、Google API の認証に鍵を使用できなくなります。無効にしたキーはいつでも有効にできます。

サービス アカウント キーを削除する前に、そのキーを無効にし、キーが不要になるまで待つことをおすすめします。その後、キーを削除できます。

無効にした鍵は Google Cloud コンソールで確認できますが、Google Cloud コンソールで鍵を無効にすることはできません。代わりに gcloud CLI または REST API を使用してください。

gcloud CLI

gcloud iam service-accounts keys disable コマンドを実行して、サービス アカウント キーを無効にします。

次の値を置き換えます。

  • KEY_ID: 無効にする鍵の ID。鍵の ID を確認するには、サービス アカウントのすべての鍵を一覧表示し、無効にする鍵を特定して、その ID をコピーします。
  • SA_NAME: 鍵が属するサービス アカウントの名前。
  • PROJECT_ID: Google Cloud プロジェクト ID。
gcloud iam service-accounts keys disable KEY_ID \
    --iam-account=SA_NAME@PROJECT_ID.iam.gserviceaccount.com

出力:

Disabled key [KEY_ID] for service account
[SA_NAME@PROJECT_ID.iam.gserviceaccount.com]

REST

projects.serviceAccounts.keys.disable メソッドはサービス アカウント キーを無効にします。

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
  • SA_NAME: 鍵を無効にするサービス アカウントの名前。
  • KEY_ID: 無効にする鍵の ID。鍵の ID を確認するには、サービス アカウントのすべての鍵を一覧表示して、無効にする鍵を特定し、name フィールドの最後からその ID をコピーします。keys/ より後のすべての部分が鍵の一意の ID になります。

HTTP メソッドと URL:

POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_NAME@PROJECT_ID.iam.gserviceaccount.com/keys/KEY_ID:disable

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

次のような JSON レスポンスが返されます。

{
}

サービス アカウント キーを有効にする

無効にしたサービス アカウント キーはいつでも有効にできます。有効にした後、その鍵を使用して Google API で認証できます。

Google Cloud コンソールでサービス アカウント キーを有効にすることはできません。代わりに gcloud CLI または REST API を使用してください。

gcloud CLI

gcloud iam service-accounts keys enable コマンドを実行して、サービス アカウント キーを有効にします。

次の値を置き換えます。

  • KEY_ID: 有効にする鍵の ID。鍵の ID を確認するには、サービス アカウントのすべての鍵を一覧表示し、有効にする鍵を特定して、その ID をコピーします。
  • SA_NAME: 鍵が属するサービス アカウントの名前。
  • PROJECT_ID: Google Cloud プロジェクト ID。
gcloud iam service-accounts keys enable KEY_ID \
    --iam-account=SA_NAME@PROJECT_ID.iam.gserviceaccount.com

出力:

Enabled key [KEY_ID] for service account
[SA_NAME@PROJECT_ID.iam.gserviceaccount.com]

REST

projects.serviceAccounts.keys.enable メソッドはサービス アカウント キーを有効にします。

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
  • SA_NAME: 鍵を有効にするサービス アカウントの名前。
  • KEY_ID: 有効にする鍵の ID。鍵の ID を確認するには、サービス アカウントのすべての鍵を一覧表示して、有効にする鍵を特定し、name の最後からその ID をコピーします。keys/ より後のすべての部分が鍵の一意の ID になります。

HTTP メソッドと URL:

POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_NAME@PROJECT_ID.iam.gserviceaccount.com/keys/KEY_ID:enable

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

次のような JSON レスポンスが返されます。

{
}

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

サービス アカウント キーを完全に削除すると、その鍵を使用して Google API で認証できなくなります。

キーの削除を取り消すことはできません。キーを削除する前にキーを無効にして、そのキーが不要になるまで待つことをおすすめします。その後、キーを削除できます。

サービス アカウント キーを定期的にローテーションすることをおすすめします。キーをローテーションするには、次のようにします。

  1. 新しいキーを作成します。
  2. 新しいキーを使用するようにアプリケーションを更新します。
  3. 古いキーを無効にします。
  4. しばらく待ってから、古いキーが使用されなくなったことを確認します。
  5. 古いキーを削除します。

コンソール

  1. Google Cloud コンソールで [サービス アカウント] ページに移動します。

    [サービス アカウント] に移動
    残りの手順は Google Cloud コンソールに自動的に表示されます。

  2. プロジェクトを選択します。
  3. [サービス アカウント] ページで、キーを削除するサービス アカウントのメールアドレスをクリックします。
  4. [キー] タブをクリックします。
  5. キーの一覧で、削除するキーの [削除] をクリックします。

gcloud CLI

gcloud iam service-accounts keys delete コマンドを実行して、サービス アカウント キーを削除します。

次の値を置き換えます。

  • KEY_ID: 削除する鍵の ID。鍵の ID を確認するには、サービス アカウントのすべての鍵を一覧表示し、削除する鍵を特定して、その ID をコピーします。
  • SA_NAME: 鍵が属するサービス アカウントの名前。
  • PROJECT_ID: Google Cloud プロジェクト ID。
gcloud iam service-accounts keys delete KEY_ID \
    --iam-account=SA_NAME@PROJECT_ID.iam.gserviceaccount.com

出力:

Deleted key [KEY_ID] for service account
[SA_NAME@PROJECT_ID.iam.gserviceaccount.com]

REST

projects.serviceAccounts.keys.delete メソッドはサービス アカウント キーを削除します。

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
  • SA_NAME: 鍵を削除するサービス アカウントの名前。
  • KEY_ID: 削除する鍵の ID。鍵の ID を確認するには、サービス アカウントのすべての鍵を一覧表示して、削除する鍵を特定し、name フィールドの最後からその ID をコピーします。keys/ より後のすべての部分が鍵の一意の ID になります。

HTTP メソッドと URL:

DELETE https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_NAME@PROJECT_ID.iam.gserviceaccount.com/keys/KEY_ID

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

次のような JSON レスポンスが返されます。

{
}

C++

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

namespace iam = ::google::cloud::iam;
[](std::string const& name) {
  iam::IAMClient client(iam::MakeIAMConnection());
  auto response = client.DeleteServiceAccountKey(name);
  if (!response.ok()) throw std::runtime_error(response.message());
  std::cout << "ServiceAccountKey successfully deleted.\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 ServiceAccountKeys
{
    public static void DeleteKey(string fullKeyName)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(IamService.Scope.CloudPlatform);
        var service = new IamService(new IamService.Initializer
        {
            HttpClientInitializer = credential
        });

        service.Projects.ServiceAccounts.Keys.Delete(fullKeyName).Execute();
        Console.WriteLine("Deleted key: " + fullKeyName);
    }
}

Go

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

import (
	"context"
	"fmt"
	"io"

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

// deleteKey deletes a service account key.
func deleteKey(w io.Writer, fullKeyName string) error {
	ctx := context.Background()
	service, err := iam.NewService(ctx)
	if err != nil {
		return fmt.Errorf("iam.NewService: %v", err)
	}

	_, err = service.Projects.ServiceAccounts.Keys.Delete(fullKeyName).Do()
	if err != nil {
		return fmt.Errorf("Projects.ServiceAccounts.Keys.Delete: %v", err)
	}
	fmt.Fprintf(w, "Deleted key: %v", fullKeyName)
	return 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.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

public class DeleteServiceAccountKey {

  // Deletes a service account key.
  public static void deleteKey(String projectId, String serviceAccountName,
      String serviceAccountKey) {
    // String projectId = "my-project-id";
    // String serviceAccountName = "my-service-account-name";
    // String serviceAccountKey = "key-name";

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

    // Construct the service account email.
    // You can modify the ".iam.gserviceaccount.com" to match the service account name in which
    // you want to delete the key.
    // See, https://cloud.google.com/iam/docs/creating-managing-service-account-keys?hl=en#deleting
    String serviceAccountEmail = serviceAccountName + "@" + projectId + ".iam.gserviceaccount.com";
    try {
      String keyToDelete = String.format("projects/-/serviceAccounts/%s/keys/%s",
          serviceAccountEmail, serviceAccountKey);

      // Then you can delete the key
      service.projects().serviceAccounts().keys().delete(keyToDelete).execute();

      System.out.println("Deleted key: " + keyToDelete);
    } catch (IOException e) {
      System.out.println("Unable to delete service account key: \n" + e);
    }
  }

  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-account-keys")
            .build();
    return service;
  }
}

Python

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

import os

from google.oauth2 import service_account
import googleapiclient.discovery

def delete_key(full_key_name):
    """Deletes a service account key."""

    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().keys().delete(
        name=full_key_name).execute()

    print('Deleted key: ' + full_key_name)

次のステップ

使ってみる

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

無料で開始