사용자 관리형 서비스 계정을 사용하는 VM 만들기


이 문서에서는 사용자 관리형 서비스 계정을 사용하도록 구성된 가상 머신(VM) 인스턴스를 만드는 방법을 설명합니다. 서비스 계정은 승인된 API 호출을 수행하기 위해 일반적으로 애플리케이션 또는 컴퓨팅 워크로드에서 사용되는 특별한 종류의 계정입니다.

서비스 계정은 커스텀 애플리케이션과 같은 워크로드가 최종 사용자의 개입 없이 Google Cloud 리소스에 액세스해야 하는 시나리오에 필요합니다. 서비스 계정을 사용해야 하는 경우에 대한 자세한 내용은 서비스 계정 사용 권장사항을 참조하세요.

Google Cloud API를 호출해야 하는 애플리케이션이 있는 경우 애플리케이션 또는 워크로드가 실행 중인 VM에 사용자 관리형 서비스 계정을 연결하는 것이 좋습니다. 그런 다음 서비스 계정에 IAM 역할을 부여하면 서비스 계정 및 VM에서 실행되는 애플리케이션까지 Google Cloud 리소스에 액세스할 수 있습니다.

시작하기 전에

  • 아직 인증을 설정하지 않았다면 설정합니다. 인증은 Google Cloud 서비스 및 API에 액세스하기 위해 ID를 확인하는 프로세스입니다. 로컬 개발 환경에서 코드 또는 샘플을 실행하려면 다음 옵션 중 하나를 선택하여 Compute Engine에 인증하면 됩니다.

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. Terraform

      로컬 개발 환경에서 이 페이지의 Terraform 샘플을 사용하려면 gcloud CLI를 설치 및 초기화한 다음 사용자 인증 정보로 애플리케이션 기본 사용자 인증 정보를 설정하세요.

      1. Install the Google Cloud CLI.
      2. To initialize the gcloud CLI, run the following command:

        gcloud init
      3. If you're using a local shell, then create local authentication credentials for your user account:

        gcloud auth application-default login

        You don't need to do this if you're using Cloud Shell.

      자세한 내용은 다음을 참조하세요: Set up authentication for a local development environment.

      REST

      로컬 개발 환경에서 이 페이지의 REST API 샘플을 사용하려면 gcloud CLI에 제공한 사용자 인증 정보를 사용합니다.

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      자세한 내용은 Google Cloud 인증 문서의 REST 사용을 위한 인증을 참고하세요.

필요한 역할

서비스 계정을 사용하는 VM을 만드는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.

역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

이러한 사전 정의된 역할에는 서비스 계정을 사용하는 VM을 만드는 데 필요한 권한이 포함되어 있습니다. 필요한 정확한 권한을 보려면 필수 권한 섹션을 펼치세요.

필수 권한

서비스 계정을 사용하는 VM을 만드는 데 필요한 권한은 다음과 같습니다.

  • 서비스 계정 만들기: serviceAccountCreator 역할의 모든 권한
  • VM 만들기:
    • 프로젝트에 대한 compute.instances.create 권한
    • 커스텀 이미지를 사용하여 VM 만들기: 이미지에 대한 compute.images.useReadOnly 권한
    • 스냅샷을 사용하여 VM 만들기: 스냅샷에 대한 compute.snapshots.useReadOnly 권한
    • 인스턴스 템플릿을 사용하여 VM 만들기: 인스턴스 템플릿에 대한 compute.instanceTemplates.useReadOnly 권한
    • VM에 기존 네트워크 할당: 프로젝트에 대한 compute.networks.use 권한
    • VM의 고정 IP 주소 지정: 프로젝트에 대한 compute.addresses.use 권한
    • 기존 네트워크 사용 시 VM에 외부 IP 주소 할당: 프로젝트에 대한 compute.networks.useExternalIp 권한
    • VM의 서브넷 지정: 프로젝트 또는 선택한 서브넷에 대한 compute.subnetworks.use 권한
    • VPC 네트워크를 사용할 때 VM에 외부 IP 주소 할당: 프로젝트 또는 선택한 서브넷에 대한 compute.subnetworks.useExternalIp 권한
    • VM에 VM 인스턴스 메타데이터 설정: 프로젝트에 대한 compute.instances.setMetadata 권한
    • VM에 태그 설정: VM에 대한 compute.instances.setTags 권한
    • VM에 라벨 설정: VM에 대한 compute.instances.setLabels 권한
    • VM에 사용할 서비스 계정 설정: VM에 대한 compute.instances.setServiceAccount 권한
    • VM의 새 디스크 만들기: 프로젝트에 대한 compute.disks.create 권한
    • 기존 디스크를 읽기 전용 또는 읽기-쓰기 모드로 연결: 디스크에 대한 compute.disks.use 권한
    • 기존 디스크를 읽기 전용 모드로 연결: 디스크에 대한 compute.disks.useReadOnly 권한

커스텀 역할이나 다른 사전 정의된 역할을 사용하여 이 권한을 부여받을 수도 있습니다.

개요

다음과 같이 VM의 서비스 계정을 구성하는 것이 좋습니다.

  1. Compute Engine 기본 서비스 계정을 사용하는 대신 새로운 사용자 관리 서비스 계정을 만들고 이 서비스 계정에 필요한 리소스 및 작업에 대해서만 IAM 역할을 부여합니다.
  2. VM에 서비스 계정을 연결합니다.
  3. VM에서 클라우드 플랫폼(https://www.googleapis.com/auth/cloud-platform) 범위를 설정합니다. 이렇게 하면 VM의 서비스 계정이 사용할 권한이 있는 Google Cloud API를 호출할 수 있습니다.
    • Google Cloud 콘솔을 사용하여 서비스 계정을 지정하는 경우 VM의 액세스 범위는 기본적으로 cloud-platform 범위로 지정됩니다.
    • Google Cloud CLI 또는 Compute Engine API를 사용하여 서비스 계정을 지정하는 경우 scopes 매개변수를 사용하여 액세스 범위를 설정할 수 있습니다.

서비스 계정 설정

서비스 계정을 만들고 필요한 IAM 역할을 할당합니다. 필요한 만큼 IAM 역할을 할당합니다. 필요에 따라 서비스 계정의 IAM 역할을 수정할 수 있습니다.

서비스 계정 권한을 제한하고 서비스 계정 권한을 정기적으로 확인하여 최신 상태인지 확인합니다.

다음 방법 중 하나를 사용하여 서비스 계정을 설정합니다.

콘솔

    In the Google Cloud console, go to the Create service account page.

    Go to Create service account
  1. Select your project.
  2. In the Service account name field, enter a name. The Google Cloud console fills in the Service account ID field based on this name.

    In the Service account description field, enter a description. For example, Service account for quickstart.

  3. Click Create and continue.
  4. Grant the required roles to the service account.

    To grant a role, find the Select a role list, then select the role.

    To grant additional roles, click Add another role and add each additional role.

  5. Click Continue.
  6. In the Service account users role field, enter the identifier for the principal that will attach the service account to other resources, such as Compute Engine instances.

    This is typically the email address for a Google Account.

  7. Click Done to finish creating the service account.

gcloud

    Set up authentication:

    1. Create the service account:

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      Replace SERVICE_ACCOUNT_NAME with a name for the service account.

    2. To provide access to your project and your resources, grant a role to the service account:

      gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" --role=ROLE

      Replace the following:

      • SERVICE_ACCOUNT_NAME: the name of the service account
      • PROJECT_ID: the project ID where you created the service account
      • ROLE: the role to grant
    3. To grant another role to the service account, run the command as you did in the previous step.
    4. Grant the required role to the principal that will attach the service account to other resources.

      gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com --member="user:USER_EMAIL" --role=roles/iam.serviceAccountUser

      Replace the following:

      • SERVICE_ACCOUNT_NAME: the name of the service account
      • PROJECT_ID: the project ID where you created the service account
      • USER_EMAIL: the email address for a Google Account

Terraform

서비스 계정을 만들려면 google_service_account 리소스를 사용하면 됩니다.

resource "google_service_account" "default" {
  account_id   = "service-account-id"
  display_name = "Service Account"
}

account_iddisplay_name 속성의 자리표시자 값을 바꿔야 합니다.

Terraform 구성을 적용하거나 삭제하는 방법은 기본 Terraform 명령어를 참조하세요.

VM 만들기 및 서비스 계정 연결

서비스 계정을 만든 후 VM을 만들고 이전 섹션에서 만든 서비스 계정을 연결합니다. 또한 VM의 액세스 범위를 cloud-platform으로 설정합니다.

기존 VM이 이미 있고 다른 VM 계정을 사용하도록 해당 VM을 구성하려면 연결된 서비스 계정 변경을 참조하세요.

다음 방법 중 하나를 사용하여 VM을 만들고 서비스 계정을 연결합니다.

콘솔

  1. Google Cloud 콘솔에서 VM 인스턴스 페이지로 이동합니다.

VM 인스턴스로 이동

  1. 프로젝트를 선택하고 계속을 클릭합니다.
  2. 인스턴스 만들기를 클릭합니다.
  3. VM의 이름을 지정합니다.
  4. ID 및 API 액세스 섹션으로 이동합니다.
  5. 서비스 계정 목록에서 만든 서비스 계정을 선택합니다. VM에 서비스 계정을 연결하면 Google Cloud 액세스 범위 cloud-platform이 VM에 자동으로 설정됩니다.
  6. 필요에 따라 VM을 추가로 맞춤설정합니다.
  7. 만들기를 클릭하여 VM을 만들고 시작합니다.

gcloud

Google Cloud CLI를 사용하여 새 VM 인스턴스를 만들고 커스텀 서비스 계정을 사용하도록 구성하려면 gcloud compute instances create 명령어를 사용하고 VM 인스턴스에 서비스 계정 이메일 및 cloud-platform 액세스 범위를 제공합니다.

gcloud compute instances create VM_NAME \
    --service-account=SERVICE_ACCOUNT_EMAIL \
    --scopes=https://www.googleapis.com/auth/cloud-platform

다음을 바꿉니다.

  • SERVICE_ACCOUNT_EMAIL: 만든 서비스 계정의 이메일 주소입니다. 예를 들면 my-sa-123@my-project-123.iam.gserviceaccount.com입니다. 이메일 주소를 보려면 서비스 계정 나열을 참조하세요.
  • VM_NAME: VM 인스턴스의 이름입니다.

예를 들면 다음과 같습니다.

gcloud compute instances create example-vm \
    --service-account 123-my-sa@my-project-123.iam.gserviceaccount.com \
    --scopes=https://www.googleapis.com/auth/cloud-platform

별칭 --scopes=cloud-platform을 사용하여 범위를 지정할 수도 있습니다. 이러한 별칭은 gcloud CLI에서만 인식됩니다. API와 다른 라이브러리에서는 이러한 별칭이 인식되지 않으므로 전체 범위 URI를 지정해야 합니다.

Terraform

서비스 계정을 사용하도록 새 VM을 설정하려면 google_compute_instance 리소스를 사용하면 됩니다.

resource "google_compute_instance" "default" {
  name         = "my-test-vm"
  machine_type = "n1-standard-1"
  zone         = "us-central1-a"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11"
    }
  }

  // Local SSD disk
  scratch_disk {
    interface = "SCSI"
  }

  network_interface {
    network = "default"

    access_config {
      // Ephemeral public IP
    }
  }

  service_account {
    # Google recommends custom service accounts with `cloud-platform` scope with
    # specific permissions granted via IAM Roles.
    # This approach lets you avoid embedding secret keys or user credentials
    # in your instance, image, or app code
    email  = google_service_account.default.email
    scopes = ["cloud-platform"]
  }
}

REST

instances.insert 메서드를 사용하여 VM을 만들고 VM 인스턴스의 서비스 계정 이메일과 액세스 범위를 지정합니다.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances

{
   "machineType":"zones/MACHINE_TYPE_ZONE/machineTypes/MACHINE_TYPE",
   "name":"VM_NAME",
   
   "disks":[
      {
         "initializeParams":{
            "sourceImage":"projects/IMAGE_PROJECT/global/images/IMAGE"
         },
         "boot":true
      }
   ],
   
   
   "networkInterfaces":[
      {
         "network":"global/networks/NETWORK_NAME"
      }
   ],
   
  "serviceAccounts": [
      {
      "email": "SERVICE_ACCOUNT_EMAIL",
      "scopes": ["https://www.googleapis.com/auth/cloud-platform"]
      }
   ],
   "shieldedInstanceConfig":{
      "enableSecureBoot":"ENABLE_SECURE_BOOT"
   }
}

다음을 바꿉니다.

  • PROJECT_ID: VM을 만들 프로젝트의 ID
  • ZONE: VM을 만들 영역
  • MACHINE_TYPE_ZONE: 새 VM에 사용할 머신 유형이 포함된 영역
  • MACHINE_TYPE: 새 VM의 머신 유형(사전 정의 또는 커스텀)
  • VM_NAME: 새 VM의 이름
  • IMAGE_PROJECT: 이미지가 포함된 프로젝트
    예를 들어 debian-10을 이미지 계열로 지정하는 경우 debian-cloud를 이미지 프로젝트로 지정합니다.
  • IMAGE or IMAGE_FAMILY: 다음 중 하나를 지정합니다.
    • IMAGE: 공개 이미지의 특정 버전
      예를 들어 "sourceImage": "projects/debian-cloud/global/images/debian-10-buster-v20200309"
    • IMAGE_FAMILY: 이미지 계열
      이렇게 하면 지원 중단되지 않은 최신 OS 이미지에서 VM을 만듭니다. 예를 들어 "sourceImage": "projects/debian-cloud/global/images/family/debian-10"을 지정하면 Compute Engine이 Debian 10 이미지 계열에서 최신 버전의 OS 이미지를 사용하여 VM을 만듭니다.
  • NETWORK_NAME: VM에 사용하려는 VPC 네트워크입니다. 기본 네트워크를 사용하도록 default를 지정할 수 있습니다.
  • SERVICE_ACCOUNT_EMAIL: 만든 서비스 계정의 이메일 주소입니다. 예를 들면 my-sa-123@my-project-123.iam.gserviceaccount.com입니다. 이메일 주소를 보려면 서비스 계정 이메일 가져오기를 참고하세요.
  • ENABLE_SECURE_BOOT: 선택사항: 보안 VM 기능을 지원하는 이미지를 선택한 경우 기본적으로 Compute Engine은 vTPM(Virtual Trusted Platform Module)무결성 모니터링을 사용 설정합니다. Compute Engine은 기본적으로 보안 부팅을 사용 설정하지 않습니다.

    enableSecureBoottrue를 지정하면 Compute Engine은 보안 VM 기능 3가지를 모두 사용 설정하여 VM을 만듭니다. Compute Engine에서 VM을 시작한 후 보안 VM 옵션을 수정하려면 VM을 중지해야 합니다.

다른 Google Cloud 서비스에 액세스하고 사용

VM이 서비스 계정을 사용하도록 구성된 후 애플리케이션이 서비스 계정을 사용하여 인증할 수 있습니다. 가장 일반적인 방법은 애플리케이션 기본 사용자 인증 정보와 클라이언트 라이브러리를 사용하여 인증하는 것입니다. gcloud CLI와 같은 일부 Google Cloud 도구는 서비스 계정을 사용하여 VM에서 Google Cloud API에 자동으로 액세스할 수 있습니다. 자세한 내용은 서비스 계정을 사용하여 워크로드 인증을 참조하세요.

서비스 계정이 삭제되면 애플리케이션에서 해당 서비스 계정을 통해 Google Cloud 리소스에 더 이상 액세스할 수 없습니다. 기본 App Engine 및 Compute Engine 서비스 계정을 삭제하면 VM에서 프로젝트의 리소스에 더 이상 액세스할 수 없습니다. 서비스 계정이 사용 중인지 잘 모르는 경우, Google은 서비스 계정을 삭제하기 전에 먼저 사용 중지하는 것을 권장합니다. 사용 중지된 서비스 계정은 필요한 경우 다시 사용할 수 있습니다.

예: VM에서 Cloud Storage 리소스에 액세스

storage.admin 역할이 있는 서비스 계정을 사용하도록 VM을 구성한 후에는 gcloud CLI와 같은 도구를 사용하여 Cloud Storage에 저장된 파일을 관리할 수 있습니다. Cloud Storage 리소스에 액세스하려면 다음을 완료하세요.

  1. VM에 연결된 서비스 계정에 roles/storage.admin 역할이 있는지 확인합니다.

  2. VM에서 맞춤 OS 이미지를 사용하는 경우 gcloud CLI를 설치합니다. 기본적으로 gcloud CLI는 Google Cloud에서 제공하는 대부분의 공개 OS 이미지에 설치됩니다.

  3. VM에 연결합니다.

  4. VM에서 Google Cloud CLI를 사용하여 Cloud Storage 리소스를 관리합니다.

다음 단계