서비스 계정 생성 및 관리

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

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

시작하기 전에

필수 권한

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

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

이러한 역할에 대한 자세한 내용은 서비스 계정 역할을 참조하세요.

IAM 기본 역할도 서비스 계정을 관리하는 권한을 포함하지만, 프로덕션 환경에서는 기본 역할을 부여하지 말아야 하지만 개발 환경 또는 테스트 환경에서는 부여해도 됩니다.

서비스 계정 만들기

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

서비스 계정을 만들 때 영숫자 ID(아래 샘플에서는 sa-name)를 제공해야 합니다(예: my-service-account). ID는 6~30자여야 하며 소문자 영숫자 문자와 대시를 포함할 수 있습니다. 서비스 계정을 만든 후에는 이름을 변경할 수 없습니다.

서비스 계정의 이름은 고유 식별자로서 생성 중에 프로비저닝된 서비스 계정의 이메일 주소에 표시됩니다(예: sa-name@project-id.iam.gserviceaccount.com).

또한 각 서비스 계정에는 자동으로 생성되는 고유한 숫자 ID가 있습니다.

서비스 계정을 만들 때 다음 정보도 제공합니다.

  • sa-description은 서비스 계정에 대한 설명입니다(선택사항).
  • sa-display-name은 서비스 계정의 별칭입니다.
  • project-id는 Google Cloud 프로젝트의 ID입니다.

서비스 계정을 만들려면 사용자에게 최소한 서비스 계정 관리자 역할(roles/iam.serviceAccountAdmin) 또는 편집자 기본 역할(roles/editor)을 부여해야 합니다. 프로덕션 환경에서는 기본 역할을 부여하지 말아야 하지만 개발 환경 또는 테스트 환경에서는 부여해도 됩니다.

서비스 계정을 만든 후 60초 이상 기다려야 서비스 계정을 사용할 수 있습니다. 서비스 계정을 만든 직후에 사용하려고 하는데 오류가 발생하면 60초 이상 기다렸다가 다시 시도하세요.

Console

  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

serviceAccounts.create 메서드는 서비스 계정을 만듭니다.

아래의 요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • project-id: Google Cloud 프로젝트 ID
  • sa-name: 서비스 계정의 영숫자 ID. ID는 6~30자(영문 기준)여야 하며 소문자 영숫자 문자와 대시를 포함할 수 있습니다.
  • sa-description: 선택사항. 서비스 계정에 대한 설명입니다.
  • sa-display-name: 사람이 읽을 수 있는 서비스 계정 이름

HTTP 메서드 및 URL:

POST https://iam.googleapis.com/v1/projects/project-id/serviceAccounts

JSON 요청 본문:

{
  "accountId": "sa-name",
  "serviceAccount": {
    "description": "sa-description",
    "displayName": "sa-display-name"
  }
}

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

{
  "name": "projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com",
  "projectId": "my-project",
  "uniqueId": "123456789012345678901",
  "email": "my-service-account@my-project.iam.gserviceaccount.com",
  "displayName": "My service account",
  "etag": "BwUp3rVlzes=",
  "description": "A service account for running jobs in my project",
  "oauth2ClientId": "987654321098765432109"
}

C#

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


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

public partial class 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

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

자바

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

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.iam.v1.Iam;
import com.google.api.services.iam.v1.IamScopes;
import com.google.api.services.iam.v1.model.CreateServiceAccountRequest;
import com.google.api.services.iam.v1.model.ServiceAccount;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

public class CreateServiceAccount {

  // Creates a service account.
  public static void createServiceAccount(String projectId, String serviceAccountName) {
    // String projectId = "my-project-id";
    // String serviceAccountName = "my-service-account-name";

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

    try {
      ServiceAccount serviceAccount = new ServiceAccount();
      serviceAccount.setDisplayName("your-display-name");
      CreateServiceAccountRequest request = new CreateServiceAccountRequest();
      request.setAccountId(serviceAccountName);
      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
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));
    // Initialize the IAM service, which can be used to send requests to the IAM API.
    Iam service =
        new Iam.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

이 샘플을 사용해 보기 전에 IAM 빠른 시작: 클라이언트 라이브러리 사용의 Python 설정 안내를 따르세요. 자세한 내용은 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)을 부여해야 합니다.

Console

  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

serviceAccounts.list 메서드는 프로젝트의 모든 서비스 계정을 나열합니다.

아래의 요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • project-id: Google Cloud 프로젝트 ID

HTTP 메서드 및 URL:

GET https://iam.googleapis.com/v1/projects/project-id/serviceAccounts

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

{
  "accounts": [
    {
      "name": "projects/my-project/serviceAccounts/sa-1@my-project.iam.gserviceaccount.com",
      "projectId": "my-project",
      "uniqueId": "123456789012345678901",
      "email": "sa-1@my-project.iam.gserviceaccount.com",
      "description": "My first service account",
      "displayName": "Service account 1",
      "etag": "BwUpTsLVUkQ=",
      "oauth2ClientId": "987654321098765432109"
    },
    {
      "name": "projects/my-project/serviceAccounts/sa-2@my-project.iam.gserviceaccount.com",
      "projectId": "my-project",
      "uniqueId": "234567890123456789012",
      "email": "sa-2@my-project.iam.gserviceaccount.com",
      "description": "My second service account",
      "displayName": "Service account 2",
      "etag": "UkQpTwBVUsL=",
      "oauth2ClientId": "876543210987654321098"
    }
  ]
}

C#

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


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

public partial class 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

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

자바

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

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.iam.v1.Iam;
import com.google.api.services.iam.v1.IamScopes;
import com.google.api.services.iam.v1.model.ListServiceAccountsResponse;
import com.google.api.services.iam.v1.model.ServiceAccount;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;
import java.util.List;

public class 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
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));
    // Initialize the IAM service, which can be used to send requests to the IAM API.
    Iam service =
        new Iam.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

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

import os

from google.oauth2 import service_account
import googleapiclient.discovery

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)을 부여해야 합니다.

Console

  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-sa-description
displayName: updated-display-name
name: projects/project-id/serviceAccounts/sa-name@project-id.iam.gserviceaccount.com

REST

serviceAccounts.patch 메서드는 서비스 계정을 업데이트합니다.

아래의 요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • project-id: Google Cloud 프로젝트 ID
  • sa-id: 서비스 계정의 ID. sa-name@project-id.iam.gserviceaccount.com 형식의 서비스 계정 이메일 주소이거나 서비스 계정의 고유 숫자 ID일 수 있습니다.
  • sa-name: 서비스 계정의 영숫자 ID. ID는 6~30자(영문 기준)여야 하며 소문자 영숫자 문자와 대시를 포함할 수 있습니다.
  • 다음 중 하나 이상을 바꿉니다.
    • updated-display-name: 서비스 계정의 새 표시 이름
    • updated-description: 서비스 계정에 대한 새 설명

HTTP 메서드 및 URL:

PATCH https://iam.googleapis.com/v1/projects/project-id/serviceAccounts/sa-id 

JSON 요청 본문:

{
  "serviceAccount": {
    "email": "sa-name@project-id.iam.gserviceaccount.com",
    "displayName": "updated-display-name",
    "description": "updated-description"
  },
  "updateMask": "displayName,description"
}

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

{
  "name": "projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com",
  "displayName": "My updated service account",
  "description": "An updated description of my service account"
}

C#

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


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

public partial class 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

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

자바

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

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.iam.v1.Iam;
import com.google.api.services.iam.v1.IamScopes;
import com.google.api.services.iam.v1.model.ServiceAccount;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

public class RenameServiceAccount {

  // Changes a service account's display name.
  public static void renameServiceAccount(String projectId, String serviceAccountName) {
    // String projectId = "my-project-id";
    // String serviceAccountName = "my-service-account-name";

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

    String serviceAccountEmail = serviceAccountName + "@" + projectId + ".iam.gserviceaccount.com";
    try {
      // First, get a service account using List() or Get()
      ServiceAccount serviceAccount =
          service
              .projects()
              .serviceAccounts()
              .get("projects/-/serviceAccounts/" + serviceAccountEmail)
              .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
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));
    // Initialize the IAM service, which can be used to send requests to the IAM API.
    Iam service =
        new Iam.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

이 샘플을 사용해 보기 전에 IAM 빠른 시작: 클라이언트 라이브러리 사용의 Python 설정 안내를 따르세요. 자세한 내용은 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)을 부여해야 합니다.

Console

  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

serviceAccounts.disable 메서드는 서비스 계정을 즉시 사용 중지합니다.

아래의 요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • project-id: Google Cloud 프로젝트 ID
  • sa-id: 서비스 계정의 ID. sa-name@project-id.iam.gserviceaccount.com 형식의 서비스 계정 이메일 주소이거나 서비스 계정의 고유 숫자 ID일 수 있습니다.

HTTP 메서드 및 URL:

POST https://iam.googleapis.com/v1/projects/project-id/serviceAccounts/sa-id:disable

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

성공한 경우 응답 본문은 비어 있습니다.

C#

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


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

public partial class 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

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

자바

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

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.iam.v1.Iam;
import com.google.api.services.iam.v1.IamScopes;
import com.google.api.services.iam.v1.model.DisableServiceAccountRequest;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

public class DisableServiceAccount {

  // Disables a service account.
  public static void disableServiceAccount(String projectId, String serviceAccountName) {
    // String projectId = "my-project-id";
    // String serviceAccountName = "my-service-account-name";

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

    String serviceAccountEmail = serviceAccountName + "@" + projectId + ".iam.gserviceaccount.com";
    try {
      DisableServiceAccountRequest request = new DisableServiceAccountRequest();
      service
          .projects()
          .serviceAccounts()
          .disable("projects/-/serviceAccounts/" + serviceAccountEmail, request)
          .execute();

      System.out.println("Disabled service account: " + serviceAccountEmail);
    } 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
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));
    // Initialize the IAM service, which can be used to send requests to the IAM API.
    Iam service =
        new Iam.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

이 샘플을 사용해 보기 전에 IAM 빠른 시작: 클라이언트 라이브러리 사용의 Python 설정 안내를 따르세요. 자세한 내용은 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)을 부여해야 합니다.

Console

  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

serviceAccounts.enable 메서드는 이전에 사용 중지된 서비스 계정을 사용 설정합니다.

아래의 요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • project-id: Google Cloud 프로젝트 ID
  • sa-id: 서비스 계정의 ID. sa-name@project-id.iam.gserviceaccount.com 형식의 서비스 계정 이메일 주소이거나 서비스 계정의 고유 숫자 ID일 수 있습니다.

HTTP 메서드 및 URL:

POST https://iam.googleapis.com/v1/projects/project-id/serviceAccounts/sa-id:enable

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

성공한 경우 응답 본문은 비어 있습니다.

C#

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


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

public partial class 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

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

자바

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

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.iam.v1.Iam;
import com.google.api.services.iam.v1.IamScopes;
import com.google.api.services.iam.v1.model.EnableServiceAccountRequest;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

public class EnableServiceAccount {

  // Enables a service account.
  public static void enableServiceAccount(String projectId, String serviceAccountName) {
    // String projectId = "my-project-id";
    // String serviceAccountName = "my-service-account-name";

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

    String serviceAccountEmail = serviceAccountName + "@" + projectId + ".iam.gserviceaccount.com";
    try {
      EnableServiceAccountRequest request = new EnableServiceAccountRequest();
      service
          .projects()
          .serviceAccounts()
          .enable("projects/-/serviceAccounts/" + serviceAccountEmail, request)
          .execute();

      System.out.println("Enabled service account: " + serviceAccountEmail);
    } 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
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));
    // Initialize the IAM service, which can be used to send requests to the IAM API.
    Iam service =
        new Iam.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

이 샘플을 사용해 보기 전에 IAM 빠른 시작: 클라이언트 라이브러리 사용의 Python 설정 안내를 따르세요. 자세한 내용은 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("Enabled service account :" + email)

서비스 계정 삭제

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

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

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

삭제된 서비스 계정은 서비스 계정 할당량에 포함되지 않습니다.

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

Console

  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

serviceAccounts.delete 메서드는 서비스 계정을 삭제합니다.

아래의 요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • project-id: Google Cloud 프로젝트 ID
  • sa-id: 서비스 계정의 ID. sa-name@project-id.iam.gserviceaccount.com 형식의 서비스 계정 이메일 주소이거나 서비스 계정의 고유 숫자 ID일 수 있습니다.

HTTP 메서드 및 URL:

DELETE https://iam.googleapis.com/v1/projects/project-id/serviceAccounts/sa-id

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

성공한 경우 응답 본문은 비어 있습니다.

C#

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

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

자바

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

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.iam.v1.Iam;
import com.google.api.services.iam.v1.IamScopes;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

public class DeleteServiceAccount {

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

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

    String serviceAccountEmail = serviceAccountName + "@" + projectId + ".iam.gserviceaccount.com";
    try {
      service
          .projects()
          .serviceAccounts()
          .delete("projects/-/serviceAccounts/" + serviceAccountEmail)
          .execute();

      System.out.println("Deleted service account: " + serviceAccountEmail);
    } 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
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));
    // Initialize the IAM service, which can be used to send requests to the IAM API.
    Iam service =
        new Iam.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

이 샘플을 사용해 보기 전에 IAM 빠른 시작: 클라이언트 라이브러리 사용의 Python 설정 안내를 따르세요. 자세한 내용은 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일이 지나면 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는 서로 다릅니다.

IAM 정책의 binding에 삭제된 서비스 계정이 포함된다는 점을 알고 있으면 정책을 가져오고 정책에서 숫자 ID를 확인할 수 있습니다. 숫자 ID는 삭제된 서비스 계정의 이름에 있습니다. 예를 들어 정책에서 삭제된 서비스 계정의 숫자 ID는 123456789012345678901입니다.

{
  "version": 1,
  "etag": "BwUjMhCsNvY=",
  "bindings": [
    {
      "members": [
        "deleted:serviceAccount:my-service-account@project-id.iam.gserviceaccount.com?uid=123456789012345678901"
      ],
      "role": "roles/iam.serviceAccountUser"
    },
  ]
}

또는 서비스 계정을 삭제한 DeleteServiceAccount 작업의 감사 로그를 검색할 수 있습니다.

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

    로그 뷰어 페이지로 이동

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

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

    resource.type="service_account"
    resource.labels.email_id="service-account-email"
    "DeleteServiceAccount"
    
  4. 서비스 계정이 삭제된 지 1시간이 초과되었으면 schedule 지난 1시간 드롭다운 목록을 선택한 다음 더 긴 시간을 선택합니다.

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

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

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

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

serviceAccounts.undelete 메서드는 삭제된 서비스 계정을 복원합니다.

아래의 요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • project-id: Google Cloud 프로젝트 ID
  • sa-numeric-id: 서비스 계정의 고유 숫자 ID

HTTP 메서드 및 URL:

POST https://iam.googleapis.com/v1/projects/project-id/serviceAccounts/sa-numeric-id:undelete

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

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

{
  "restoredAccount": {
    "name": "projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com",
    "projectId": "my-project",
    "uniqueId": "123456789012345678901",
    "email": "my-service-account@my-project.iam.gserviceaccount.com",
    "displayName": "My service account",
    "etag": "BwUp3rVlzes=",
    "description": "A service account for running jobs in my project",
    "oauth2ClientId": "987654321098765432109"
  }
}

다음 단계