서비스 계정 생성 및 관리

이 페이지에서는 Cloud Identity and Access Management API, Google Cloud Console, gcloud 명령줄 도구를 사용하여 서비스 계정을 만들고 관리하는 방법을 설명합니다.

새로운 Cloud 프로젝트를 만들면 Google Cloud는 해당 프로젝트 아래 자동으로 1개의 Compute Engine 서비스 계정과 1개의 App Engine 서비스 계정을 만듭니다. 프로젝트에 서비스 계정을 추가로 98개까지 만들어 리소스에 대한 액세스 권한을 제어할 수 있습니다.

시작하기 전에

필수 권한

사용자가 서비스 계정을 관리할 수 있도록 다음 역할 중 하나를 부여합니다.

  • 서비스 계정 사용자(roles/iam.serviceAccountUser): 서비스 계정을 가져오거나 나열하거나 가장할 수 있는 권한을 부여합니다.
  • 서비스 계정 관리자(roles/iam.serviceAccountAdmin): 서비스 계정 사용자 권한을 포함한 서비스 계정에서 Cloud IAM 정책을 생성, 업데이트, 삭제, 설정하거나 가져올 수 있는 권한을 부여합니다.

Cloud IAM 기본 역할도 서비스 계정을 관리하는 권한을 포함하지만, 다른 Google Cloud 리소스에 불필요하게 액세스하지 못하도록 위의 사전 정의된 역할 중 하나를 부여하는 것이 좋습니다. 이러한 역할에 대한 자세한 내용은 서비스 계정 역할 목록을 참조하세요.

서비스 계정 만들기

서비스 계정 만들기는 프로젝트에 구성원을 추가하는 것과 비슷하지만 서비스 계정은 개별 최종 사용자가 아닌 애플리케이션에 속합니다.

아래 예시에서 [SA-NAME]은 사용자가 지정하는 서비스 계정의 이름입니다(예: my-service-account). 이 이름은 고유 식별자로, 서비스 계정 생성 중에 프로비저닝되는 서비스 계정의 이메일 주소에 나타납니다(예: my-service-account@project-id.iam.gserviceaccount.com). 또한 이 이름을 다른 API와 함께 사용하여 서비스 계정을 업데이트할 수도 있습니다. 한 번 생성된 이름은 변경할 수 없습니다.

다음 값도 지정해야 합니다.

  • [SA-DESCRIPTION]은 선택사항으로, 서비스 계정의 설명입니다.
  • [SA-DISPLAY-NAME]은 서비스 계정의 별칭입니다.
  • [PROJECT-ID]는 Google Cloud 프로젝트의 ID입니다.

서비스 계정을 만들려면 사용자에게 최소한 서비스 계정 관리자 역할(roles/iam.serviceAccountAdmin) 또는 편집자 기본 역할(roles/editor)을 부여해야 합니다.

콘솔

  1. Cloud Console에서 서비스 계정 페이지를 엽니다.

    서비스 계정 페이지 열기

  2. 프로젝트 선택을 클릭하고 프로젝트를 선택한 후 열기를 클릭합니다.

  3. 서비스 계정 만들기를 클릭합니다.

  4. 서비스 계정 이름(별칭 표시 이름)과 설명(선택사항)을 입력하고 서비스 계정에 부여할 역할을 선택한 후 저장을 클릭합니다.

gcloud 명령

gcloud iam service-accounts create 명령어를 실행하여 사용하여 서비스 계정을 만듭니다.

명령어:

gcloud iam service-accounts create [SA-NAME] \
        --description "[SA-DESCRIPTION]" \
        --display-name "[SA-DISPLAY-NAME]"
    

출력에는 서비스 계정의 이름이 포함됩니다.

Created service account [SA-NAME].
    

REST API

serviceAccounts.create()를 호출하여 서비스 계정을 만듭니다.

POST https://iam.googleapis.com/v1/projects/[PROJECT-ID]/serviceAccounts
    

서비스 계정의 속성이 요청 본문에 포함되어야 합니다.

{
        "accountId": "[SA-NAME]",
        "serviceAccount": {
            "description": "[SA-DESCRIPTION]",
            "displayName": "[SA-DISPLAY-NAME]"
        }
    }
    

응답:

{
        "name": "projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com",
        "projectId": "PROJECT-ID",
        "uniqueId": "113948692397867021414",
        "email": "SA-NAME@PROJECT-ID.iam.gserviceaccount.com",
        "description": "SA-DESCRIPTION",
        "displayName": "SA-DISPLAY-NAME",
        "etag": "BwUp3rVlzes=",
        "oauth2ClientId": "117249000288840666939"
    }
    

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 ServiceAccounts
    {
        public static ServiceAccount CreateServiceAccount(string projectId,
            string name, string displayName)
        {
            var credential = GoogleCredential.GetApplicationDefault()
                .CreateScoped(IamService.Scope.CloudPlatform);
            var service = new IamService(new IamService.Initializer
            {
                HttpClientInitializer = credential
            });

            var request = new CreateServiceAccountRequest
            {
                AccountId = name,
                ServiceAccount = new ServiceAccount
                {
                    DisplayName = displayName
                }
            };
            var serviceAccount = service.Projects.ServiceAccounts.Create(
                request, "projects/" + projectId).Execute();
            Console.WriteLine("Created service account: " + serviceAccount.Email);
            return serviceAccount;
        }
    }

Go

이 샘플을 시도해 보기 전에 Cloud IAM 빠른 시작: 클라이언트 라이브러리 사용의 Go 설정 안내를 따르세요. 자세한 내용은 Cloud IAM Go API 참조 문서를 참조하세요.

import (
    	"context"
    	"fmt"
    	"io"

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

    // createServiceAccount creates a service account.
    func createServiceAccount(w io.Writer, projectID, name, displayName string) (*iam.ServiceAccount, error) {
    	ctx := context.Background()
    	service, err := iam.NewService(ctx)
    	if err != nil {
    		return nil, fmt.Errorf("iam.NewService: %v", err)
    	}

    	request := &iam.CreateServiceAccountRequest{
    		AccountId: name,
    		ServiceAccount: &iam.ServiceAccount{
    			DisplayName: displayName,
    		},
    	}
    	account, err := service.Projects.ServiceAccounts.Create("projects/"+projectID, request).Do()
    	if err != nil {
    		return nil, fmt.Errorf("Projects.ServiceAccounts.Create: %v", err)
    	}
    	fmt.Fprintf(w, "Created service account: %v", account)
    	return account, nil
    }
    

자바

이 샘플을 시도하기 전에 Cloud IAM 빠른 시작: 클라이언트 라이브러리 사용의 자바 설정 안내를 따르세요. 자세한 내용은 Cloud IAM 자바 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.CreateServiceAccountRequest;
    import com.google.api.services.iam.v1.model.ServiceAccount;
    import java.io.IOException;
    import java.security.GeneralSecurityException;
    import java.util.Collections;

    public class CreateServiceAccount {

      // Creates a service account.
      public static void createServiceAccount(String projectId) {
        // String 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 {
          ServiceAccount serviceAccount = new ServiceAccount();
          serviceAccount.setDisplayName("your-display-name");
          CreateServiceAccountRequest request = new CreateServiceAccountRequest();
          request.setAccountId("your-service-account-name");
          request.setServiceAccount(serviceAccount);

          serviceAccount =
              service.projects().serviceAccounts().create("projects/" + projectId, request).execute();

          System.out.println("Created service account: " + serviceAccount.getEmail());
        } catch (IOException e) {
          System.out.println("Unable to create service account: \n" + e.toString());
        }
      }

      private static Iam initService() throws GeneralSecurityException, IOException {
        // Use the Application Default Credentials strategy for authentication. For more info, see:
        // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
        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-accounts")
                .build();
        return service;
      }
    }

Python

이 샘플을 시도하기 전에 Cloud IAM 빠른 시작: 클라이언트 라이브러리 사용의 Python 설정 안내를 따르세요. 자세한 내용은 Cloud IAM Python API 참조 문서를 확인하세요.

import os

    from google.oauth2 import service_account
    import googleapiclient.discovery

    def create_service_account(project_id, name, display_name):
        """Creates a service account."""

        credentials = service_account.Credentials.from_service_account_file(
            filename=os.environ['GOOGLE_APPLICATION_CREDENTIALS'],
            scopes=['https://www.googleapis.com/auth/cloud-platform'])

        service = googleapiclient.discovery.build(
            'iam', 'v1', credentials=credentials)

        my_service_account = service.projects().serviceAccounts().create(
            name='projects/' + project_id,
            body={
                'accountId': name,
                'serviceAccount': {
                    'displayName': display_name
                }
            }).execute()

        print('Created service account: ' + my_service_account['email'])
        return my_service_account

생성된 서비스 계정이 자동으로 작동하도록 서비스 계정에 역할을 1개 이상 부여합니다.

서비스 계정 나열

서비스 계정을 나열할 때 매개변수를 지정하여 응답에 포함할 서비스 계정 수를 제한할 수 있습니다. 그런 다음 이후 요청에서 ListServiceAccountsResponse.next_page_token을 사용하여 나머지 서비스 계정을 나열하도록 요청할 수 있습니다.

이 메서드의 용도는 서비스 계정 및 키를 감사하거나 서비스 계정을 관리하는 커스텀 도구를 만드는 것입니다.

서비스 계정을 나열하려면 사용자에게 최소한 서비스 계정 사용자 역할(roles/iam.serviceAccountUser) 또는 뷰어 기본 역할(roles/viewer)을 부여해야 합니다.

콘솔

  1. Cloud Console에서 서비스 계정 페이지를 엽니다.

    서비스 계정 페이지 열기

  2. 프로젝트 선택을 클릭합니다.

  3. 프로젝트를 선택하고 열기를 클릭합니다. 서비스 계정 페이지에 모든 서비스 계정이 나열됩니다.

gcloud 명령

gcloud iam service-accounts list 명령어를 실행하여 프로젝트의 모든 서비스 계정을 나열합니다.

명령어:

gcloud iam service-accounts list
    

프로젝트의 모든 서비스 계정 목록이 출력됩니다.

NAME                    EMAIL
    SA-DISPLAY-NAME-1       SA-NAME-1@PROJECT-ID.iam.gserviceaccount.com
    SA-DISPLAY-NAME-2       SA-NAME-2@PROJECT-ID.iam.gserviceaccount.com
    

REST API

serviceAccounts.list() 메서드를 호출합니다.

요청:

GET https://iam.googleapis.com/v1/projects/[PROJECT-ID]/serviceAccounts
    

응답:

{
        "accounts": [
        {
            "name": "projects/PROJECT-ID/serviceAccounts/SA-NAME-1@PROJECT-ID.iam.gserviceaccount.com",
            "projectId": "PROJECT-ID",
            "uniqueId": "108979773878059201436",
            "email": "SA-NAME-1@PROJECT-ID.iam.gserviceaccount.com",
            "description": "SA-DESCRIPTION-1",
            "displayName": "SA-DISPLAY-NAME-1",
            "etag": "BwUpTsLVUkQ=",
            "oauth2ClientId": "102240834887833340852"
        },
        {
            "name": "projects/PROJECT-ID/serviceAccounts/SA-NAME-2@PROJECT-ID.iam.gserviceaccount.com",
            "projectId": "PROJECT-ID",
            "uniqueId": "108979773878059201436",
            "email": "SA-NAME-2@PROJECT-ID.iam.gserviceaccount.com",
            "description": "SA-DESCRIPTION-2",
            "displayName": "SA-DISPLAY-NAME-2",
            "etag": "BwUpTsLVUkQ=",
            "oauth2ClientId": "102240834887833340852"
        }]
    }
    

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 ServiceAccounts
    {
        public static IList<ServiceAccount> ListServiceAccounts(string projectId)
        {
            var credential = GoogleCredential.GetApplicationDefault()
                .CreateScoped(IamService.Scope.CloudPlatform);
            var service = new IamService(new IamService.Initializer
            {
                HttpClientInitializer = credential
            });

            var response = service.Projects.ServiceAccounts.List(
                "projects/" + projectId).Execute();
            foreach (ServiceAccount account in response.Accounts)
            {
                Console.WriteLine("Name: " + account.Name);
                Console.WriteLine("Display Name: " + account.DisplayName);
                Console.WriteLine("Email: " + account.Email);
                Console.WriteLine();
            }
            return response.Accounts;
        }
    }

Go

이 샘플을 시도해 보기 전에 Cloud IAM 빠른 시작: 클라이언트 라이브러리 사용의 Go 설정 안내를 따르세요. 자세한 내용은 Cloud IAM Go API 참조 문서를 참조하세요.

import (
    	"context"
    	"fmt"
    	"io"

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

    // listServiceAccounts lists a project's service accounts.
    func listServiceAccounts(w io.Writer, projectID string) ([]*iam.ServiceAccount, error) {
    	ctx := context.Background()
    	service, err := iam.NewService(ctx)
    	if err != nil {
    		return nil, fmt.Errorf("iam.NewService: %v", err)
    	}

    	response, err := service.Projects.ServiceAccounts.List("projects/" + projectID).Do()
    	if err != nil {
    		return nil, fmt.Errorf("Projects.ServiceAccounts.List: %v", err)
    	}
    	for _, account := range response.Accounts {
    		fmt.Fprintf(w, "Listing service account: %v\n", account.Name)
    	}
    	return response.Accounts, nil
    }
    

자바

이 샘플을 시도하기 전에 Cloud IAM 빠른 시작: 클라이언트 라이브러리 사용의 자바 설정 안내를 따르세요. 자세한 내용은 Cloud IAM 자바 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.ListServiceAccountsResponse;
    import com.google.api.services.iam.v1.model.ServiceAccount;
    import java.io.IOException;
    import java.security.GeneralSecurityException;
    import java.util.Collections;
    import java.util.List;

    public class ListServiceAccounts {

      // Lists all service accounts for the current project.
      public static void listServiceAccounts(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 {
          ListServiceAccountsResponse response =
              service.projects().serviceAccounts().list("projects/" + projectId).execute();
          List<ServiceAccount> serviceAccounts = response.getAccounts();

          for (ServiceAccount account : serviceAccounts) {
            System.out.println("Name: " + account.getName());
            System.out.println("Display Name: " + account.getDisplayName());
            System.out.println("Email: " + account.getEmail());
            System.out.println();
          }
        } catch (IOException e) {
          System.out.println("Unable to list service accounts: \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-accounts")
                .build();
        return service;
      }
    }

Python

이 샘플을 시도하기 전에 Cloud IAM 빠른 시작: 클라이언트 라이브러리 사용의 Python 설정 안내를 따르세요. 자세한 내용은 Cloud IAM Python API 참조 문서를 확인하세요.

def list_service_accounts(project_id):
        """Lists all service accounts for the current project."""

        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_accounts = service.projects().serviceAccounts().list(
            name='projects/' + project_id).execute()

        for account in service_accounts['accounts']:
            print('Name: ' + account['name'])
            print('Email: ' + account['email'])
            print(' ')
        return service_accounts

서비스 계정 업데이트

서비스 계정의 표시 이름(별칭) 및 설명은 일반적으로 서비스 계정의 용도나 서비스 계정 담당자와 같이 서비스 계정에 대한 추가 정보를 파악하는 데 사용됩니다.

서비스 계정의 이름 또는 설명을 업데이트하려면 최소한 사용자에게 서비스 계정 관리자 역할(roles/iam.serviceAccountAdmin) 또는 편집자 기본 역할(roles/editor)을 부여해야 합니다.

콘솔

  1. Cloud Console에서 서비스 계정 페이지를 엽니다.

    서비스 계정 페이지 열기

  2. 프로젝트 선택을 클릭하고 프로젝트를 선택한 후 열기를 클릭합니다.

  3. 이름을 바꿀 서비스 계정을 찾고 해당 행에서 클릭한 다음 수정을 클릭합니다.

  4. 새 이름을 입력하고 저장을 클릭합니다.

gcloud 명령어

gcloud iam service-accounts update 명령어를 실행하여 서비스 계정을 업데이트합니다.

명령어:

gcloud iam service-accounts update \
        [SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com \
        --description "[UPDATED-SA-DESCRIPTION]" \
        --display-name "[UPDATED-DISPLAY-NAME]"
    

이름이 변경된 서비스 계정이 출력됩니다.

description: Updated description
    displayName: Updated display name
    name: projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com
    

REST API

serviceAccounts.patch() 메서드를 사용합니다.

요청:

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

요청 본문에는 서비스 계정 이메일과 새 표시 이름 또는 설명이 포함되어야 합니다.

{
        "serviceAccount": {
            "email": "[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com",
            "displayName": "[UPDATED-DISPLAY-NAME]",
            "description": "[UPDATED-DESCRIPTION]"
        },
        "updateMask": "displayName,description"
    }
    

응답:

{
        "name": "projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com",
        "projectId": "PROJECT-ID",
        "uniqueId": "107522985251862639552",
        "email": "SA-NAME@PROJECT-ID.iam.gserviceaccount.com",
        "description": "SA-DESCRIPTION",
        "displayName": "Updated display name",
        "etag": "BwUqLK4bL9U=",
        "oauth2ClientId": "105236325228757713905"
    }
    

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 ServiceAccounts
    {
        public static ServiceAccount RenameServiceAccount(string email,
            string newDisplayName)
        {
            var credential = GoogleCredential.GetApplicationDefault()
                .CreateScoped(IamService.Scope.CloudPlatform);
            var service = new IamService(new IamService.Initializer
            {
                HttpClientInitializer = credential
            });

            // First, get a ServiceAccount using List() or Get().
            string resource = "projects/-/serviceAccounts/" + email;
            var serviceAccount = service.Projects.ServiceAccounts.Get(resource)
                .Execute();
            // Then you can update the display name.
            serviceAccount.DisplayName = newDisplayName;
            serviceAccount = service.Projects.ServiceAccounts.Update(
                serviceAccount, resource).Execute();
            Console.WriteLine($"Updated display name for {serviceAccount.Email} " +
                "to: " + serviceAccount.DisplayName);
            return serviceAccount;
        }
    }

Go

이 샘플을 시도해 보기 전에 Cloud IAM 빠른 시작: 클라이언트 라이브러리 사용의 Go 설정 안내를 따르세요. 자세한 내용은 Cloud IAM Go API 참조 문서를 참조하세요.

import (
    	"context"
    	"fmt"
    	"io"

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

    // renameServiceAccount renames a service account.
    func renameServiceAccount(w io.Writer, email, newDisplayName string) (*iam.ServiceAccount, error) {
    	ctx := context.Background()
    	service, err := iam.NewService(ctx)
    	if err != nil {
    		return nil, fmt.Errorf("iam.NewService: %v", err)
    	}

    	// First, get a ServiceAccount using List() or Get().
    	resource := "projects/-/serviceAccounts/" + email
    	serviceAccount, err := service.Projects.ServiceAccounts.Get(resource).Do()
    	if err != nil {
    		return nil, fmt.Errorf("Projects.ServiceAccounts.Get: %v", err)
    	}
    	// Then you can update the display name.
    	serviceAccount.DisplayName = newDisplayName
    	serviceAccount, err = service.Projects.ServiceAccounts.Update(resource, serviceAccount).Do()
    	if err != nil {
    		return nil, fmt.Errorf("Projects.ServiceAccounts.Update: %v", err)
    	}

    	fmt.Fprintf(w, "Updated service account: %v", serviceAccount.Email)
    	return serviceAccount, nil
    }
    

자바

이 샘플을 시도하기 전에 Cloud IAM 빠른 시작: 클라이언트 라이브러리 사용의 자바 설정 안내를 따르세요. 자세한 내용은 Cloud IAM 자바 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.ServiceAccount;
    import java.io.IOException;
    import java.security.GeneralSecurityException;
    import java.util.Collections;

    public class RenameServiceAccount {

      // Changes a service account's display name.
      public static void renameServiceAccount(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 a service account using List() or Get()
          ServiceAccount serviceAccount =
              service
                  .projects()
                  .serviceAccounts()
                  .get(
                      "projects/-/serviceAccounts/"
                          + "your-service-account-name@"
                          + projectId
                          + ".iam.gserviceaccount.com")
                  .execute();

          // Then you can update the display name
          serviceAccount.setDisplayName("your-new-display-name");
          serviceAccount =
              service
                  .projects()
                  .serviceAccounts()
                  .update(serviceAccount.getName(), serviceAccount)
                  .execute();

          System.out.println(
              "Updated display name for "
                  + serviceAccount.getName()
                  + " to: "
                  + serviceAccount.getDisplayName());
        } catch (IOException e) {
          System.out.println("Unable to rename 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
        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-accounts")
                .build();
        return service;
      }
    }

Python

이 샘플을 시도하기 전에 Cloud IAM 빠른 시작: 클라이언트 라이브러리 사용의 Python 설정 안내를 따르세요. 자세한 내용은 Cloud IAM Python API 참조 문서를 확인하세요.

import os

    from google.oauth2 import service_account
    import googleapiclient.discovery

    def rename_service_account(email, new_display_name):
        """Changes a service account's display name."""

        # First, get a service account using List() or Get()
        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)

        resource = 'projects/-/serviceAccounts/' + email

        my_service_account = service.projects().serviceAccounts().get(
            name=resource).execute()

        # Then you can update the display name
        my_service_account['displayName'] = new_display_name
        my_service_account = service.projects().serviceAccounts().update(
            name=resource, body=my_service_account).execute()

        print('Updated display name for {} to: {}'.format(
            my_service_account['email'], my_service_account['displayName']))
        return my_service_account

서비스 계정 사용 중지

서비스 계정 삭제와 마찬가지로 서비스 계정을 사용 중지하면 애플리케이션에서 더 이상 해당 서비스 계정을 통해 Google Cloud 리소스에 액세스할 수 없습니다. 기본 App Engine 및 Compute Engine 서비스 계정을 사용 중지하면 인스턴스에서 더 이상 프로젝트의 리소스에 액세스할 수 없습니다. 이미 사용 중지된 서비스 계정을 중지하려 해도 아무런 영향이 없습니다.

서비스 계정을 삭제하는 것과 달리 사용 중지된 서비스 계정은 필요에 따라 쉽게 다시 사용 설정할 수 있습니다. 중요 애플리케이션에서 서비스 계정을 사용하지 않도록 서비스 계정을 삭제하기 전에 먼저 사용 중지하는 것이 좋습니다.

서비스 계정을 사용 중지하려면 사용자에게 최소한 서비스 계정 관리자 역할(roles/iam.serviceAccountAdmin) 또는 편집자 기본 역할(roles/editor)을 부여해야 합니다.

콘솔

  1. Cloud Console에서 서비스 계정 페이지를 엽니다.

    서비스 계정 페이지 열기

  2. 프로젝트 선택을 클릭하고 프로젝트를 선택한 후 열기를 클릭합니다.

  3. 사용 중지할 서비스 계정의 이름을 클릭합니다.

  4. 서비스 계정 상태에서 서비스 계정 사용 중지를 클릭한 다음 사용 중지를 클릭하여 변경사항을 확인합니다.

gcloud 명령

gcloud iam service-accounts disable 명령어를 실행하여 사용하여 서비스 계정을 사용 중지합니다.

명령어:

gcloud iam service-accounts disable [SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com
    

출력:

Disabled service account SA-NAME@PROJECT-ID.iam.gserviceaccount.com
    

REST API

serviceAccounts.disable() 메서드를 사용합니다.

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

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 ServiceAccounts
    {
        public static void DisableServiceAccount(string email)
        {
            var credential = GoogleCredential.GetApplicationDefault()
                .CreateScoped(IamService.Scope.CloudPlatform);
            var service = new IamService(new IamService.Initializer
            {
                HttpClientInitializer = credential
            });

            var request = new DisableServiceAccountRequest();

            string resource = "projects/-/serviceAccounts/" + email;
            service.Projects.ServiceAccounts.Disable(request, resource).Execute();
            Console.WriteLine("Disabled service account: " + email);
        }
    }

Go

이 샘플을 시도해 보기 전에 Cloud IAM 빠른 시작: 클라이언트 라이브러리 사용의 Go 설정 안내를 따르세요. 자세한 내용은 Cloud IAM Go API 참조 문서를 참조하세요.

import (
    	"context"
    	"fmt"
    	"io"

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

    // disableServiceAccount disables a service account.
    func disableServiceAccount(w io.Writer, email string) error {
    	// email:= service-account@your-project.iam.gserviceaccount.com
    	ctx := context.Background()
    	service, err := iam.NewService(ctx)
    	if err != nil {
    		return fmt.Errorf("iam.NewService: %v", err)
    	}

    	request := &iam.DisableServiceAccountRequest{}
    	_, err = service.Projects.ServiceAccounts.Disable("projects/-/serviceAccounts/"+email, request).Do()
    	if err != nil {
    		return fmt.Errorf("Projects.ServiceAccounts.Disable: %v", err)
    	}
    	fmt.Fprintf(w, "Disabled service account: %v", email)
    	return nil
    }
    

자바

이 샘플을 시도하기 전에 Cloud IAM 빠른 시작: 클라이언트 라이브러리 사용의 자바 설정 안내를 따르세요. 자세한 내용은 Cloud IAM 자바 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.DisableServiceAccountRequest;

    import java.io.IOException;
    import java.security.GeneralSecurityException;
    import java.util.Collections;

    public class DisableServiceAccount {

      // Disables a service account.
      public static void disableServiceAccount(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 {
          DisableServiceAccountRequest request = new DisableServiceAccountRequest();
          service
              .projects()
              .serviceAccounts()
              .disable(
                  "projects/-/serviceAccounts/"
                      + "your-service-account-name@"
                      + projectId
                      + ".iam.gserviceaccount.com",
                  request)
              .execute();

          System.out.println(
              "Disabled service account: "
                  + "your-service-account-name@"
                  + projectId
                  + ".iam.gserviceaccount.com");
        } catch (IOException e) {
          System.out.println("Unable to disable 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
        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-accounts")
                .build();
        return service;
      }
    }

Python

이 샘플을 시도하기 전에 Cloud IAM 빠른 시작: 클라이언트 라이브러리 사용의 Python 설정 안내를 따르세요. 자세한 내용은 Cloud IAM Python API 참조 문서를 확인하세요.

import os

    from google.oauth2 import service_account
    import googleapiclient.discovery

    def disable_service_account(email):
        """Disables 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().disable(
            name='projects/-/serviceAccounts/' + email).execute()

        print("Disabled service account :" + email)

서비스 계정 사용 설정

사용 중지된 서비스 계정을 사용 설정하면 애플리케이션에서 해당 서비스 계정을 통해 Google Cloud 리소스에 다시 액세스할 수 있습니다.

사용 중지된 서비스 계정을 필요할 때마다 사용 설정할 수 있습니다. 이미 사용 설정된 서비스 계정을 사용 설정하려 해도 아무런 영향이 없습니다.

서비스 계정을 사용 설정하려면 사용자에게 최소한 서비스 계정 관리자 역할(roles/iam.serviceAccountAdmin) 또는 편집자 기본 역할(roles/editor)을 부여해야 합니다.

콘솔

  1. Cloud Console에서 서비스 계정 페이지를 엽니다.

    서비스 계정 페이지 열기

  2. 프로젝트 선택을 클릭하고 프로젝트를 선택한 후 열기를 클릭합니다.

  3. 사용 설정할 서비스 계정의 이름을 클릭합니다.

  4. 서비스 계정 상태에서 서비스 계정 사용 설정을 클릭한 다음 사용 설정을 클릭하여 변경사항을 확인합니다.

gcloud 명령

gcloud iam service-accounts enable 명령어를 실행하여 서비스 계정을 사용 설정합니다.

명령어:

gcloud iam service-accounts enable [SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com
    

출력:

Enabled service account SA-NAME@PROJECT-ID.iam.gserviceaccount.com
    

REST API

serviceAccounts.enable() 메서드를 사용합니다.

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

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 ServiceAccounts
    {
        public static void EnableServiceAccount(string email)
        {
            var credential = GoogleCredential.GetApplicationDefault()
                .CreateScoped(IamService.Scope.CloudPlatform);
            var service = new IamService(new IamService.Initializer
            {
                HttpClientInitializer = credential
            });

            var request = new EnableServiceAccountRequest();

            string resource = "projects/-/serviceAccounts/" + email;
            service.Projects.ServiceAccounts.Enable(request, resource).Execute();
            Console.WriteLine("Enabled service account: " + email);
        }
    }

Go

이 샘플을 시도해 보기 전에 Cloud IAM 빠른 시작: 클라이언트 라이브러리 사용의 Go 설정 안내를 따르세요. 자세한 내용은 Cloud IAM Go API 참조 문서를 참조하세요.

import (
    	"context"
    	"fmt"
    	"io"

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

    // enableServiceAccount enables a service account.
    func enableServiceAccount(w io.Writer, email string) error {
    	// email:= service-account@your-project.iam.gserviceaccount.com
    	ctx := context.Background()
    	service, err := iam.NewService(ctx)
    	if err != nil {
    		return fmt.Errorf("iam.NewService: %v", err)
    	}

    	request := &iam.EnableServiceAccountRequest{}
    	_, err = service.Projects.ServiceAccounts.Enable("projects/-/serviceAccounts/"+email, request).Do()
    	if err != nil {
    		return fmt.Errorf("Projects.ServiceAccounts.Enable: %v", err)
    	}
    	fmt.Fprintf(w, "Enabled service account: %v", email)
    	return nil
    }
    

자바

이 샘플을 시도하기 전에 Cloud IAM 빠른 시작: 클라이언트 라이브러리 사용의 자바 설정 안내를 따르세요. 자세한 내용은 Cloud IAM 자바 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.EnableServiceAccountRequest;

    import java.io.IOException;
    import java.security.GeneralSecurityException;
    import java.util.Collections;

    public class EnableServiceAccount {

      // Enables a service account.
      public static void enableServiceAccount(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 {
          EnableServiceAccountRequest request = new EnableServiceAccountRequest();
          service
              .projects()
              .serviceAccounts()
              .enable(
                  "projects/-/serviceAccounts/"
                      + "your-service-account-name@"
                      + projectId
                      + ".iam.gserviceaccount.com",
                  request)
              .execute();

          System.out.println(
              "Enabled service account: "
                  + "your-service-account-name@"
                  + projectId
                  + ".iam.gserviceaccount.com");
        } catch (IOException e) {
          System.out.println("Unable to enable 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
        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-accounts")
                .build();
        return service;
      }
    }

Python

이 샘플을 시도하기 전에 Cloud IAM 빠른 시작: 클라이언트 라이브러리 사용의 Python 설정 안내를 따르세요. 자세한 내용은 Cloud IAM Python API 참조 문서를 확인하세요.

import os

    from google.oauth2 import service_account
    import googleapiclient.discovery

    def enable_service_account(email):
        """Enables 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().enable(
            name='projects/-/serviceAccounts/' + email).execute()

        print("Disabled service account :" + email)

서비스 계정 삭제

서비스 계정을 삭제하면 애플리케이션에서 해당 서비스 계정을 통해 Google Cloud 리소스에 더 이상 액세스할 수 없습니다. 기본 App Engine 및 Compute Engine 서비스 계정을 삭제하면 인스턴스에서 프로젝트의 리소스에 더 이상 액세스할 수 없습니다.

삭제 시 주의해야 합니다. 서비스 계정을 삭제하기 전에 중요 애플리케이션에서 더 이상 이 계정을 사용하지 않는지 확인하세요. 서비스 계정이 사용 중인지 잘 모르겠으면 서비스 계정을 삭제하기 전에 먼저 사용 중지하는 것이 좋습니다. 사용 중지된 서비스 계정이 여전히 사용 중인 경우 이 계정을 쉽게 다시 사용 설정할 수 있습니다.

서비스 계정을 삭제할 때 역할 바인딩은 바로 삭제되지 않으며 최대 60일 후에 시스템에서 자동으로 삭제됩니다.

서비스 계정을 삭제하려면 사용자에게 최소한 서비스 계정 관리자 역할(roles/iam.serviceAccountAdmin) 또는 편집자 기본 역할(roles/editor)을 부여해야 합니다.

콘솔

  1. Cloud Console에서 서비스 계정 페이지를 엽니다.

    서비스 계정 페이지 열기

  2. 프로젝트 선택을 클릭하고 프로젝트를 선택한 후 열기를 클릭합니다.

  3. 삭제할 서비스 계정을 선택하고 삭제 를 클릭합니다.

gcloud 명령

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
    

REST API

serviceAccounts.delete() 메서드를 사용합니다.

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

C#

이 샘플을 시도하기 전에 Cloud IAM 빠른 시작: 클라이언트 라이브러리 사용의 C# 설정 안내를 따르세요. 자세한 내용은 Cloud IAM C# API 참조 문서를 확인하세요.


    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

이 샘플을 시도해 보기 전에 Cloud IAM 빠른 시작: 클라이언트 라이브러리 사용의 Go 설정 안내를 따르세요. 자세한 내용은 Cloud IAM Go API 참조 문서를 참조하세요.

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: %v", err)
    	}

    	_, err = service.Projects.ServiceAccounts.Delete("projects/-/serviceAccounts/" + email).Do()
    	if err != nil {
    		return fmt.Errorf("Projects.ServiceAccounts.Delete: %v", err)
    	}
    	fmt.Fprintf(w, "Deleted service account: %v", email)
    	return nil
    }
    

자바

이 샘플을 시도하기 전에 Cloud IAM 빠른 시작: 클라이언트 라이브러리 사용의 자바 설정 안내를 따르세요. 자세한 내용은 Cloud IAM 자바 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 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 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 {
          service
              .projects()
              .serviceAccounts()
              .delete(
                  "projects/-/serviceAccounts/"
                      + "your-service-account-name@"
                      + projectId
                      + ".iam.gserviceaccount.com")
              .execute();

          System.out.println(
              "Deleted service account: "
                  + "your-service-account-name@"
                  + projectId
                  + ".iam.gserviceaccount.com");
        } 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
        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-accounts")
                .build();
        return service;
      }
    }

Python

이 샘플을 시도하기 전에 Cloud IAM 빠른 시작: 클라이언트 라이브러리 사용의 Python 설정 안내를 따르세요. 자세한 내용은 Cloud IAM Python API 참조 문서를 확인하세요.

import os

    from google.oauth2 import service_account
    import googleapiclient.discovery

    def delete_service_account(email):
        """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)

서비스 계정을 삭제한 후에 같은 이름으로 새로운 서비스 계정을 만들지 마세요. 그러면 예기치 않은 동작이 발생할 수 있습니다. 자세한 내용은 서비스 계정 삭제 및 다시 만들기를 참조하세요.

서비스 계정 삭제 취소

경우에 따라 undelete 명령어를 사용하여 삭제된 서비스 계정을 삭제 취소할 수 있습니다. 다음 기준을 충족하는 경우 삭제된 서비스 계정을 삭제 취소할 수 있습니다.

  • 서비스 계정 삭제 후 30일이 지나지 않음

    30일이 지나면 Cloud 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를 찾으려면 감사 로그에서 DeleteServiceAccount 작업을 검색하면 됩니다.

  1. Cloud Console의 로그 뷰어 페이지로 이동합니다.

    로그 뷰어로 이동

  2. 페이지 상단의 검색창에서 arrow_drop_down 펼치기 화살표를 클릭한 다음 고급 필터로 전환을 선택합니다.

  3. 검색창에 다음 쿼리를 입력합니다. 여기서 [SERVICE_ACCOUNT_NAME]을 서비스 계정 이름(예: my-service-account@project-id.iam.gserviceaccount.com)으로 바꿉니다.

    resource.type="service_account"
        resource.labels.email_id="[SERVICE_ACCOUNT_NAME]"
        "DeleteServiceAccount"
        
  4. 서비스 계정이 삭제된 지 1시간 이상 지났으면 schedule 지난 1시간 드롭다운 목록을 선택한 다음 더 긴 시간을 선택합니다.

    서비스 계정이 삭제된 지 7일 이상 지났으면 제한 없음을 선택합니다.

  5. 필터 제출을 클릭합니다. 로그 뷰어에는 지정한 이름의 서비스 계정에 영향을 준 DeleteServiceAccount 작업이 표시됩니다. 각 서비스 계정의 숫자 ID는 DeleteServiceAccount 텍스트 옆에 나타납니다.

    검색 결과에 DeleteServiceAccount 작업이 1개만 있으면 숫자 ID를 기록해 둡니다. 이 숫자 ID는 서비스 계정을 삭제 취소할 때 사용됩니다.

    검색 결과가 2개 이상 있으면 검색 결과 옆의 arrow_right 펼치기 화살표를 클릭합니다. 로그 항목의 세부정보를 검토하고 로그 항목에 실행 취소할 작업을 표시할지 여부를 결정합니다. 올바른 로그 항목을 찾을 때까지 이 프로세스를 반복한 다음 해당 항목의 숫자 ID를 기록해 둡니다.

숫자 ID로 서비스 계정 삭제 취소

삭제된 서비스 계정의 숫자 ID를 찾았으면 서비스 계정을 삭제 취소할 수 있습니다.

gcloud 명령

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 API

serviceAccounts.undelete() 메서드를 사용합니다. 여기서 [ACCOUNT_UNIQUE_ID]를 서비스 계정의 숫자 ID로 바꿉니다.

POST https://iam.googleapis.com/v1/projects/-/serviceAccounts/[ACCOUNT_UNIQUE_ID]:undelete
    

계정을 삭제 취소할 수 있으면 복원된 서비스 계정에 대한 세부정보와 함께 200 OK 응답 코드가 표시됩니다.

다음 단계