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

このページでは、Google Cloud Console、gcloud コマンドライン ツールIdentity and Access Management API、または Google Cloud クライアント ライブラリを使用して、サービス アカウント キーの作成と管理を行う方法について説明します。

このガイドの前提条件

必要な権限

ユーザーがサービス アカウント キーを管理できるようにするには、サービス アカウント キー管理者ロール(roles/iam.serviceAccountKeyAdmin)を付与します。IAM の基本ロールにもサービス アカウント キーを管理する権限が含まれていますが、他の Google Cloud リソースへの不要なアクセスを防ぐため、このロールを使用することをおすすめします。

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

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

他のプラットフォームやオンプレミスなど、Google Cloud の外部でサービス アカウントを使用するには、最初にサービス アカウントの ID を設定する必要があります。公開鍵 / 秘密鍵ペアを使用すると、これを安全に設定できます。

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

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

Console

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

    [サービス アカウント] ページに移動

  2. [プロジェクトを選択] をクリックし、プロジェクトを選択して [開く] をクリックします。

  3. キーを作成するサービス アカウントの行を見つけます。その行で、、[キーを作成] の順にクリックします。

  4. [キーのタイプ] を選択して、[作成] をクリックします。

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

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

gcloud コマンド

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

コマンド:

gcloud iam service-accounts keys create ~/key.json \
  --iam-account sa-name@project-id.iam.gserviceaccount.com

出力:

created key [e44da1202f82f8f4bdd9d92bc412d1d8a837fa83] of type [json] as
[/usr/home/username/key.json] for
[sa-name@project-id.iam.gserviceaccount.com]

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

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

REST API

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

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

  • project-id: Google Cloud プロジェクト ID。
  • sa-name: キーを作成するサービス アカウントの名前。
  • private-key-type: 省略可。秘密鍵の出力形式。デフォルト値は TYPE_GOOGLE_CREDENTIALS_FILE(base64 でエンコードされた JSON キーファイル)です。使用できるすべての値のリストについては、ServiceAccountPrivateKeyType リファレンスをご覧ください。
  • 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 本文のリクエスト:

{
  "privateKeyType": "private-key-type",
  "keyAlgorithm": "key-algorithm"
}

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

レスポンスには、サービス アカウント キーが含まれます。例:

{
    "name":"projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com/keys/90c48f61c65cd56224a12ab18e6ee9ca9c3aee7c",
    "privateKeyType": "TYPE_GOOGLE_CREDENTIALS_FILE",
    "privateKeyData":"MIIJqAIB . . .",
    "validAfterTime": "2020-05-17T18:48:27Z",
    "validBeforeTime": "9999-12-31T23:59:59Z",
    "keyAlgorithm": "KEY_ALG_RSA_2048",
    "keyOrigin": "GOOGLE_PROVIDED",
    "keyType": "USER_MANAGED"
}

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

C#

このサンプルを試す前に、IAM クイックスタート: クライアント ライブラリの使用の C# の設定手順を実施してください。詳細については、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 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();
        Console.WriteLine("Created key: " + key.Name);
        return key;
    }
}

Go

このサンプルを試す前に、IAM クイックスタート: クライアント ライブラリの使用の Go の手順に従って設定を行ってください。詳細については、IAM Go API のリファレンス ドキュメントをご覧ください。

import (
	"context"
	"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)
	}
	fmt.Fprintf(w, "Created key: %v", key.Name)
	return key, nil
}

Java

このサンプルを試す前に、IAM クイックスタート: クライアント ライブラリの使用の Java の設定手順を実施してください。詳細については、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.Collections;

public class CreateServiceAccountKey {

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

    String serviceAccountEmail = serviceAccountName + "@" + projectId + ".iam.gserviceaccount.com";
    try {
      ServiceAccountKey key =
          service
              .projects()
              .serviceAccounts()
              .keys()
              .create(
                  "projects/-/serviceAccounts/" + serviceAccountEmail,
                  new CreateServiceAccountKeyRequest())
              .execute();

      System.out.println("Created key: " + key.getName());
    } catch (IOException e) {
      System.out.println("Unable to create service account key: \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 クイックスタート: クライアント ライブラリの使用の Python の手順に従って設定を行ってください。詳細については、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()

    print('Created key: ' + key['name'])

privateKeyData は、TYPE_GOOGLE_CREDENTIALS_FILE の値(JSON または P12 キー / 認証情報)を base64 エンコードの文字列表現で返します。

サービス アカウント キーを作成すると、新しい公開鍵 / 秘密鍵のペアが生成され、マシンにダウンロードされます。これは秘密鍵の唯一のコピーとして機能します。この秘密鍵は、お客様の責任で安全に保管する必要があります。その場所をメモし、アプリケーションがこの秘密鍵にアクセスできるようにします。この秘密鍵は、アプリケーションが認証 API 呼び出しを実行する際に必要となります。

鍵の形式は、生成方法によって異なる場合があります。Cloud Console または gcloud コマンドライン ツールを使用して作成されたキーは次のようになります。

{
  "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 API またはクライアント ライブラリで生成したキーは次のようになります。

{
  "name": "projects/project-id/serviceAccounts/service-account-email/keys/key-id",
  "privateKeyType": "TYPE_GOOGLE_CREDENTIALS_FILE",
  "privateKeyData": "private-key",
  "validAfterTime": "date",
  "validBeforeTime": "date",
  "keyAlgorithm": "KEY_ALG_RSA_2048"
}

ここでも、privateKeyData は、TYPE_GOOGLE_CREDENTIALS_FILE の値(JSON または P12 キー / 認証情報)を base64 エンコードの文字列表現で返します。base64 デコードの privateKeyData を適切な拡張子(.p12 または .json)のファイルに保存し、クライアント ライブラリへの入力または gcloud auth activate-service-account コマンドで使用できます。

各メソッド間で書式が異なるため、将来 API 呼び出しを行うときに使用するのと同じメソッドを使用してキーを生成するのが最も簡単です。たとえば、gcloud を使用している場合は、gcloud を使用してキーも生成します。別のメソッドを使用して(gcloud で REST で生成されたキーを使用して)生成されたあるメソッドに対してキーを使用するには、適切な書式と一致するようにキーを編集する必要があります。

Google は、すべてのサービス アカウントのすべての公開鍵に誰でもアクセスできるようにしており、秘密鍵を使って作成された署名の検証に公開鍵を使用できます。公開鍵は次の URL で公開されています。

  • x.509 証明書: https://www.googleapis.com/service_accounts/v1/metadata/x509/sa-name@project-id.iam.gserviceaccount.com
  • JSON ウェブキー(JWK): https://www.googleapis.com/service_accounts/v1/jwk/sa-name@project-id.iam.gserviceaccount.com
  • RAW エンドポイント: https://www.googleapis.com/service_accounts/v1/metadata/raw/sa-name@project-id.iam.gserviceaccount.com

サービス アカウント キーの一覧表示

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

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

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

作成していないキーが一覧表示されることがあります。これは、App Engine や Compute Engine などの Google Cloud サービスで使用される Google Cloud 管理キーです。ユーザーキーと Google Cloud 管理キーの違いの詳細については、サービス アカウントについてをご覧ください。

Console

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

    [サービス アカウント] ページに移動

  2. [プロジェクトを選択] をクリックし、プロジェクトを選択して [開く] をクリックします。プロジェクトのすべてのサービス アカウントとそれに対応するキーが Console に表示されます。

gcloud コマンド

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

コマンド:

gcloud iam service-accounts keys list \
  --iam-account sa-name@project-id.iam.gserviceaccount.com

出力:

KEY_ID CREATED_AT EXPIRES_AT
8e6e3936d7024646f8ceb39792006c07f4a9760c 2016-01-26T21:01:42.000Z 2026-01-23T21:01:42.000Z
937c98f870f5c8db970af527aa3c12fd88b1c20a 2016-01-26T20:55:40.000Z 2026-01-23T20:55:40.000Z

REST API

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

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

  • project-id: Google Cloud プロジェクト ID。
  • 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"
    }
  ]
}

C#

このサンプルを試す前に、IAM クイックスタート: クライアント ライブラリの使用の C# の設定手順を実施してください。詳細については、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 クイックスタート: クライアント ライブラリの使用の Go の手順に従って設定を行ってください。詳細については、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 クイックスタート: クライアント ライブラリの使用の Java の設定手順を実施してください。詳細については、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 クイックスタート: クライアント ライブラリの使用の Python の手順に従って設定を行ってください。詳細については、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'])

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

サービス アカウント キーの秘密鍵を取得できるのは、キーが最初に作成されるときのみです。

キーの基本情報(ID、アルゴリズム、公開鍵データなど)は、projects.serviceAccounts.keys.get() REST API メソッドを使用して取得できます。Cloud Console や gcloud コマンドライン ツールの使用はサポートされていません。

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

ユーザーが管理する鍵ペアの公開鍵の部分を、サービス アカウントにアップロードできます。公開鍵をアップロードすると、サービス アカウントに永続的に関連付けられ、他のユーザー管理サービス アカウント キーと同じように使用されます。プロジェクトのキーのアップロードを無効にする方法については、サービス アカウント キーのアップロードを制限するをご覧ください。

Google が管理する鍵ペアの代わりにユーザーが管理する鍵ペアを使う場合には、定期的にローテーションして管理してください。

アップロードする鍵は、X.509 v3 証明書でラップされ、base64 でエンコードされた RSA 公開鍵である必要があります。OpenSSL などのツールを使用して、この形式の鍵と証明書を生成できます。たとえば、次のコマンドは 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 ファイルをアップロードできます。

gcloud コマンド

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

コマンド:

gcloud iam service-accounts keys upload /path/to/public_key.pem \
  --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
c7b74879da78e4cdcbe7e1bf5e129375c0bfa8d0 2019-06-26T21:01:42.000Z 2029-06-23T21:01:42.000Z

REST API

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

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

  • project-id: Google Cloud プロジェクト ID。
  • 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"
}

サービス アカウント キーの削除

サービス アカウント キーは、Cloud Console、gcloud ツール、serviceAccount.keys.delete() メソッド、いずれかのクライアント ライブラリを使用して作成できます。

サービス アカウント キーを削除すると、アプリケーションはそのキーを使用して Google Cloud リソースにアクセスできなくなります。セキュリティの観点から推奨されるベスト プラクティスは、サービス アカウント キーを定期的にローテーションする方法です。キーをローテーションするには、新しいキーを作成し、アプリケーションでその新しいキーを使用するよう切り替えた後、古いキーを削除します。serviceAccount.keys.create() メソッドと serviceAccount.keys.delete() メソッドを一緒に使用して、ローテーションを自動化します。

Console

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

    [サービス アカウント] ページに移動

  2. [プロジェクトを選択] をクリックし、プロジェクトを選択して [開く] をクリックします。プロジェクトのすべてのサービス アカウントとそれに対応するキーが Console に表示されます。

  3. キーを作成するサービス アカウントの行を見つけます。その行で、をクリックし、[編集] をクリックします。

  4. キーの一覧で、削除するキーの [削除] をクリックします。

gcloud コマンド

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

コマンド:

gcloud iam service-accounts keys delete key-id \
  --iam-account sa-name@project-id.iam.gserviceaccount.com

出力:

Deleted key [8e6e3936d7024646f8ceb39792006c07f4a9760c] for
service account [sa-name@project-id.iam.gserviceaccount.com]

REST API

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

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

  • project-id: Google Cloud プロジェクト ID。
  • sa-name: キーを削除するサービス アカウントの名前。
  • key-id: 削除するキーの 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 クイックスタート: クライアント ライブラリの使用の C# の設定手順を実施してください。詳細については、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 クイックスタート: クライアント ライブラリの使用の Go の手順に従って設定を行ってください。詳細については、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 クイックスタート: クライアント ライブラリの使用の Java の設定手順を実施してください。詳細については、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 DeleteServiceAccountKey {

  // Deletes a service account key.
  public static void deleteKey(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 {
      // First, get the name of the key using List() or Get()
      List<ServiceAccountKey> keys =
          service
              .projects()
              .serviceAccounts()
              .keys()
              .list("projects/-/serviceAccounts/" + serviceAccountEmail)
              .execute()
              .getKeys();
      String keyToDelete = keys.get(0).getName();

      // 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.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 クイックスタート: クライアント ライブラリの使用の Python の手順に従って設定を行ってください。詳細については、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)