서비스 계정 만들기 및 관리

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

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

시작하기 전에

필수 권한

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

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

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

서비스 계정 만들기

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

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

또한 다음 값을 지정합니다.

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

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

콘솔

  1. GCP 콘솔에서 서비스 계정 페이지를 엽니다.

    서비스 계정 페이지 열기

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

  3. 프로젝트를 선택하고 열기를 클릭합니다.

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

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

GCLOUD 명령어

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

명령어:

gcloud beta 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"

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

// createServiceAccount creates a service account.
func createServiceAccount(w io.Writer, projectID, name, displayName string) (*iam.ServiceAccount, error) {
	client, err := google.DefaultClient(context.Background(), iam.CloudPlatformScope)
	if err != nil {
		return nil, fmt.Errorf("google.DefaultClient: %v", err)
	}
	service, err := iam.New(client)
	if err != nil {
		return nil, fmt.Errorf("iam.New: %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 참조 문서를 참조하세요.

public ServiceAccount createServiceAccount(String projectId, String name, String displayName)
    throws IOException {

  ServiceAccount serviceAccount = new ServiceAccount();
  serviceAccount.setDisplayName(displayName);
  CreateServiceAccountRequest request = new CreateServiceAccountRequest();
  request.setAccountId(name);
  request.setServiceAccount(serviceAccount);

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

  System.out.println("Created service account: " + serviceAccount.getEmail());
  return serviceAccount;
}

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

서비스 계정을 만든 후 사용자 대신 작동할 수 있도록 서비스 계정에 역할을 한 개 이상 부여합니다.

서비스 계정 나열

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

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

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

콘솔

  1. GCP 콘솔에서 서비스 계정 페이지를 엽니다.

    서비스 계정 페이지 열기

  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"

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

// listServiceAccounts lists a project's service accounts.
func listServiceAccounts(w io.Writer, projectID string) ([]*iam.ServiceAccount, error) {
	client, err := google.DefaultClient(context.Background(), iam.CloudPlatformScope)
	if err != nil {
		return nil, fmt.Errorf("google.DefaultClient: %v", err)
	}
	service, err := iam.New(client)
	if err != nil {
		return nil, fmt.Errorf("iam.New: %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 참조 문서를 참조하세요.

public List<ServiceAccount> listServiceAccounts(String projectId) throws IOException {

  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();
  }
  return serviceAccounts;
}

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. GCP 콘솔에서 서비스 계정 페이지를 엽니다.

    서비스 계정 페이지 열기

  2. 프로젝트 선택을 클릭합니다.
  3. 프로젝트를 선택하고 열기를 클릭합니다.
  4. 이름을 변경할 서비스 계정을 찾고 해당 행에서 더보기(more_vert) 버튼을 클릭한 후 수정을 클릭합니다.
  5. 새 이름을 입력하고 저장을 클릭합니다.

GCLOUD 명령어

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

명령어:

gcloud beta 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"

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

// renameServiceAccount renames a service account.
func renameServiceAccount(w io.Writer, email, newDisplayName string) (*iam.ServiceAccount, error) {
	client, err := google.DefaultClient(context.Background(), iam.CloudPlatformScope)
	if err != nil {
		return nil, fmt.Errorf("google.DefaultClient: %v", err)
	}
	service, err := iam.New(client)
	if err != nil {
		return nil, fmt.Errorf("iam.New: %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 참조 문서를 참조하세요.

public ServiceAccount renameServiceAccount(String email, String newDisplayName)
    throws IOException {

  // First, get a service account using List() or Get()
  ServiceAccount serviceAccount =
      service.projects().serviceAccounts().get("projects/-/serviceAccounts/" + email).execute();

  // Then you can update the display name
  serviceAccount.setDisplayName(newDisplayName);
  service.projects().serviceAccounts().update(serviceAccount.getName(), serviceAccount).execute();

  System.out.println(
      "Updated display name for " + serviceAccount.getName() + " to: " + newDisplayName);
  return serviceAccount;
}

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

서비스 계정 사용 중지

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

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

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

GCLOUD 명령어

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

명령어:

gcloud alpha 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

서비스 계정 사용 설정

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

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

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

GCLOUD 명령어

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

명령어:

gcloud alpha 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

서비스 계정 삭제

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

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

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

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

콘솔

  1. GCP 콘솔에서 서비스 계정 페이지를 엽니다.

    서비스 계정 페이지 열기

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

  3. 프로젝트를 선택하고 열기를 클릭합니다.

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

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"

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

// deleteServiceAccount deletes a service account.
func deleteServiceAccount(w io.Writer, email string) error {
	client, err := google.DefaultClient(context.Background(), iam.CloudPlatformScope)
	if err != nil {
		return fmt.Errorf("google.DefaultClient: %v", err)
	}
	service, err := iam.New(client)
	if err != nil {
		return fmt.Errorf("iam.New: %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 참조 문서를 참조하세요.

public void deleteServiceAccount(String email) throws IOException {

  service.projects().serviceAccounts().delete("projects/-/serviceAccounts/" + email).execute();

  System.out.println("Deleted service account: " + email);
}

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 명령어를 사용하면 간혹 삭제된 서비스 계정이 복원될 수 있습니다.

서비스 계정 삭제를 취소하려면 호출자에게 삭제된 서비스 계정에 대한 iam.serviceAccounts.undelete 권한을 부여해야 합니다. 이 권한은 소유자(roles/owner) 기본 역할에 포함되어 있습니다.

삭제 취소 명령어를 사용할 때는 삭제된 서비스 계정의 고유 ID를 제공해야 합니다. 고유 ID는 21자리 숫자입니다(예: 103271949540120710052). 삭제된 서비스 계정의 고유 ID를 모르겠으면 해당 삭제 작업의 활동 로그에서 ID를 확인하면 됩니다.

다음 경우에는 삭제된 서비스 계정을 복원할 수 없습니다.

  • 서비스 계정이 삭제된 지 30일이 지나면 시스템에서 자동으로 삭제되므로 고객 지원에 요청하더라도 더 이상 복원되지 않습니다.
  • 삭제된 서비스 계정의 이메일 주소가 활성(삭제되지 않은) 서비스 계정에서 사용 중이면 삭제된 서비스 계정을 복원할 수 없습니다. 예를 들어 고유 ID가 103271949540120710052이고 이름이 foo@project-id.iam.gserviceaccount.com인 계정을 삭제한 후 이름은 foo@project-id.iam.gserviceaccount.com으로 같지만 고유 ID가 103271949540120710329로 다른 새 계정을 만들면 첫 번째 서비스 계정을 복원할 수 없습니다. 이 문제를 해결하려면 최근(두 번째) 서비스 계정을 삭제한 후 undelete 명령어를 실행하면 됩니다.

REST API

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

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

계정을 복구하려면 REST 호출을 수행해야 합니다. curl을 사용하여 이를 수행할 수 있으며 삭제된 서비스 계정의 고유 ID가 103271949540120710052인 경우의 예는 다음과 같습니다.

curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-length: 0" "https://iam.googleapis.com/v1/projects/-/serviceAccounts/103271949540120710052:undelete"

복구이 성공하면 복원된 서비스 계정에 대한 세부정보와 함께 200 응답 코드가 생성됩니다.

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Cloud IAM 문서