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

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

このガイドの前提条件

必要な権限

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

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

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

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

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

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

Console

  1. Cloud Console で [IAM と管理] ページを開きます。

    [IAM と管理] ページを開く

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

  3. 左側のナビゲーション メニューで [サービス アカウント] をクリックします。

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

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

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

リクエスト:

    POST https://iam.googleapis.com/v1/projects/[PROJECT-ID]/serviceAccounts/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com/keys
    

レスポンス:

{
        "name":"projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com/keys/90c48f61c65cd56224a12ab18e6ee9ca9c3aee7c",
        "privateKeyType": "TYPE_GOOGLE_CREDENTIALS_FILE",
        "privateKeyData":"MIIJqAIB . . .",
        "validBeforeTime": "2028-05-08T21:00:00Z",
        "validAfterTime": "2016-01-25T18:38:09.000Z",
        "keyAlgorithm": "KEY_ALG_RSA_2048"
    }
    

C#

このサンプルを試す前に、Cloud IAM クイックスタート: クライアント ライブラリの使用に掲載されている C# 向けの手順に従って設定を行ってください。詳細については、Cloud 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

このサンプルを試す前に、Cloud IAM クイックスタート: クライアント ライブラリの使用に掲載されている Go 向けの手順に従って設定を行ってください。詳細については、Cloud 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

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

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
    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 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 projectId = "my-project-id";

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

        try {
          ServiceAccountKey key =
              service
                  .projects()
                  .serviceAccounts()
                  .keys()
                  .create(
                      "projects/-/serviceAccounts/your-service-account-name@"
                          + projectId
                          + ".iam.gserviceaccount.com",
                      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
        GoogleCredential credential =
            GoogleCredential.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(),
                    credential)
                .setApplicationName("service-account-keys")
                .build();
        return service;
      }
    }

Python

このサンプルを試す前に、Cloud IAM クイックスタート: クライアント ライブラリの使用に掲載されている Python 向けの手順に従って設定を行ってください。詳細については、Cloud 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 呼び出しを実行する際に必要となります。

新しく作成されたキーが認証に使用できるようになるまでに最長で 60 秒かかります。新しいキーを作成した直後に認証に失敗した場合は、60 秒以上経過してから再試行してください。

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

{
    "type": "service_account",
    "project_id": "[PROJECT-ID]",
    "private_key_id": "[KEY-ID]",
    "private_key": "-----BEGIN PRIVATE KEY-----\n[PRIVATE-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 エンコードの文字列表現で返します。

書式はメソッドごとに異なるため、今後 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 で [IAM と管理] ページを開きます。

    [IAM と管理] ページを開く

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

  3. 左側のナビゲーション メニューで [サービス アカウント] をクリックします。すべてのサービス アカウントと対応するキーが一覧表示されます。

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

serviceAccount.keys.list() を呼び出して、サービス アカウントのキーを一覧表示します。

リクエスト:

    GET https://iam.googleapis.com/v1/projects/[PROJECT-ID]/serviceAccounts/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com/keys
    

レスポンス:

{
        "keys": [
        {
            "name": "projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com/keys/90c48f61c65cd56224a12ab18e6ee9ca9c3aee7c",
            "validAfterTime": "2016-01-25T18:38:09.000Z",
            "validBeforeTime": "2026-01-22T18:38:09.000Z",
            "keyAlgorithm": "KEY_ALG_RSA_2048"
        },
        {
            "name": "projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com/keys/e5e3800831ac1adc8a5849da7d827b4724b1fce8",
            "validAfterTime": "2016-01-25T13:43:27.000Z",
            "validBeforeTime": "2016-01-26T13:43:27.000Z",
            "keyAlgorithm": "KEY_ALG_RSA_2048"
        },
        {
            "name": "projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com/keys/b97699f042b8eee6a846f4f96259fbcd13e2682e",
            "validAfterTime": "2016-01-26T13:28:27.000Z",
            "validBeforeTime": "2016-01-27T13:28:27.000Z",
            "keyAlgorithm": "KEY_ALG_RSA_2048"
        }
      ]
    }
    

C#

このサンプルを試す前に、Cloud IAM クイックスタート: クライアント ライブラリの使用に掲載されている C# 向けの手順に従って設定を行ってください。詳細については、Cloud 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

このサンプルを試す前に、Cloud IAM クイックスタート: クライアント ライブラリの使用に掲載されている Go 向けの手順に従って設定を行ってください。詳細については、Cloud 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

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

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
    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 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 projectId = "my-project-id";

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

        try {
          List<ServiceAccountKey> keys =
              service
                  .projects()
                  .serviceAccounts()
                  .keys()
                  .list(
                      "projects/-/serviceAccounts/"
                          + "your-service-account-name@"
                          + projectId
                          + ".iam.gserviceaccount.com")
                  .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
        GoogleCredential credential =
            GoogleCredential.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(),
                    credential)
                .setApplicationName("service-account-keys")
                .build();
        return service;
      }
    }

Python

このサンプルを試す前に、Cloud IAM クイックスタート: クライアント ライブラリの使用に掲載されている Python 向けの手順に従って設定を行ってください。詳細については、Cloud 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 が管理する鍵ペアの代わりにユーザーが管理する鍵ペアを使う場合は、定期的にローテーションして管理してください。

公開鍵をアップロードする前に、RSA_X509_PEM 形式であることを確認してください。証明書を用意していない場合は、openssl などのツールを使用して、適切な形式の自己署名 X.509 を生成できます。openssl ツールを使用する場合は、次のようにして有効な証明書を生成できます。

openssl req -x509 -nodes -newkey rsa:2048 -keyout /output/path/to/private/key \
        -out /output/path/to/public/key -subj "/CN=unused"
    

openssl を使用して生成した X.509 証明書の有効期限は、デフォルトで 30 日である点に注意してください。ただし有効期限は、-n フラグを使用して延長または短縮できます。

gcloud コマンド

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

コマンド:

    gcloud alpha iam service-accounts keys upload /path/to/public/key \
      --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

serviceAccount.keys.upload() を呼び出して、サービス アカウントの公開鍵をアップロードします。

リクエスト:

    POST https://iam.googleapis.com/v1/projects/[PROJECT-ID]/serviceAccounts/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com/keys:upload
    

リクエスト本文:

{
      "publicKeyData": "LS0tLS1CRUdJTiBDRVJUSUZJQ...jlsCjVjMXUzVlVqS3AtLS0tXG4="
    }
    

リクエスト本文には、RSA_X509_PEM 形式の公開鍵データを含める必要があります。

レスポンス:

{
      "name": "projects/[PROJECT-ID]/serviceAccounts/[SERVICE-ACCOUNT-EMAIL]/keys/c7b74879da78e4cdcbe7e1bf5e129375c0bfa8d0",
      "keyAlgorithm": "KEY_ALG_RSA_2048",
      "keyOrigin": "USER_PROVIDED",
    }
    

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

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

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

Console

  1. Cloud Console で [IAM と管理] ページを開きます。

    [IAM と管理] ページを開く

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

  3. 左側のナビゲーション メニューで [サービス アカウント] をクリックします。すべてのサービス アカウントと対応するキーが一覧表示されます。

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

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

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

リクエスト:

    DELETE https://iam.googleapis.com/v1/projects/[PROJECT-ID]/serviceAccounts/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com/keys/[KEY-ID]
    

C#

このサンプルを試す前に、Cloud IAM クイックスタート: クライアント ライブラリの使用に掲載されている C# 向けの手順に従って設定を行ってください。詳細については、Cloud 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

このサンプルを試す前に、Cloud IAM クイックスタート: クライアント ライブラリの使用に掲載されている Go 向けの手順に従って設定を行ってください。詳細については、Cloud 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

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

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
    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 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 projectId = "my-project-id";

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

        try {
          // First, get the name of the key using List() or Get()
          List<ServiceAccountKey> keys =
              service
                  .projects()
                  .serviceAccounts()
                  .keys()
                  .list(
                      "projects/-/serviceAccounts/"
                          + "your-service-account-name@"
                          + projectId
                          + ".iam.gserviceaccount.com")
                  .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
        GoogleCredential credential =
            GoogleCredential.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(),
                    credential)
                .setApplicationName("service-account-keys")
                .build();
        return service;
      }
    }

Python

このサンプルを試す前に、Cloud IAM クイックスタート: クライアント ライブラリの使用に掲載されている Python 向けの手順に従って設定を行ってください。詳細については、Cloud 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)