컴퓨팅 인스턴스의 머신 유형 수정


가상 머신(VM) 인스턴스에 연결된 로컬 SSD가 없고 관리형 인스턴스 그룹(MIG)에 속하지 않는 경우 인스턴스를 중지한 후 인스턴스 머신 유형을 변경할 수 있습니다.

기존 머신 유형이 VM에서 실행되는 워크로드에 적합하지 않으면 해당 VM의 머신 유형을 변경합니다. 예를 들어 설정, 개발, 테스트 중에 작은 머신으로 VM을 시작하고 프로덕션 워크로드를 사용할 준비가 되면 큰 머신 유형을 사용하도록 VM을 변경할 수 있습니다.

다음과 같은 상황에서 이 절차를 사용할 수 있습니다.

  • 예를 들어 같은 머신 시리즈 내에서 vCPU 또는 메모리 수가 다른 유사한 머신 유형으로 변경하려면 다음 안내를 따르세요.
    • n2-highcpu-4n2-standard-4로 변경할 수 있습니다.
    • c3d-standard-30c3d-highmem-30으로 변경할 수 있습니다.
  • 다른 머신 시리즈를 사용하도록 머신 유형을 변경합니다. 이는 T2A 및 A2 머신 시리즈를 제외한 1세대 및 2세대 머신 시리즈에서만 지원됩니다. 예를 들면 다음과 같습니다.
    • n2-standard-4c2-standard-8로 변경할 수 있습니다.
    • n1-highmem-4n2d-standard-16으로 변경할 수 있습니다.

1세대 또는 2세대 머신 시리즈(N1, N2, M1 등)를 사용하는 VM의 머신 유형을 3세대 이상 머신 시리즈(M3, C3, N4 등)의 머신 유형으로 변경하려면 새 컴퓨팅 인스턴스로 워크로드 이전에 설명된 절차를 사용해야 합니다.

다음 리소스에 영향을 주지 않고 머신 유형을 변경할 수 있습니다.

  • VM의 SSH 키
  • VM 메타데이터와 같은 VM 구성
  • 연결된 Persistent Disk 또는 Hyperdisk의 데이터(설치된 애플리케이션 및 애플리케이션 데이터 포함)

MIG 내에서 VM 머신 유형을 변경하려면 MIG에서 VM 구성 업데이트 자동 적용을 참조하세요.

시작하기 전에

  • VM 중지 방법에 대해 숙지합니다.
  • 머신 유형에 대해 숙지합니다.
  • 아직 인증을 설정하지 않았다면 설정합니다. 인증은 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.

    Java

    이 페이지의 Java 샘플을 로컬 개발 환경에서 사용하려면 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.

    Python

    이 페이지의 Python 샘플을 로컬 개발 환경에서 사용하려면 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 머신 유형을 변경하려면 다음 권한이 필요합니다.

  • VM에 대한 compute.instances.setMachineType 권한
  • VM에 대한 compute.instances.start 권한
  • VM에 대한 compute.instances.stop 권한

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

제한사항

  • 컴퓨팅 인스턴스에 로컬 SSD가 하나 이상 있으면 인스턴스 머신 유형을 변경할 수 없습니다.
  • 컴퓨팅 인스턴스에서 임시 외부 IP 주소를 사용하는 경우 인스턴스 머신 유형을 수정하면 IP 주소가 변경될 수 있습니다. IP 주소를 유지하려면 머신 유형을 변경하기 전에 IP 주소를 고정 외부 IP 주소로 승격합니다.
  • 일부 구성에서는 컴퓨팅 인스턴스 머신 유형을 변경할 수 없습니다.
    • 베어메탈 인스턴스 머신 유형을 변경할 수 없습니다.
    • 머신 유형을 1세대 또는 2세대 머신 시리즈에서 3세대 이상 머신 시리즈의 머신 유형으로 변경하려는 경우에는 이 절차를 사용할 수 없습니다. 대신 새 컴퓨팅 인스턴스로 워크로드 이전의 안내를 따르세요.
    • 머신 유형을 Arm 머신 유형으로 변경하려는 경우에는 이 절차를 사용할 수 없습니다. 대신 새 컴퓨팅 인스턴스로 워크로드 이전의 안내를 따르세요.
    • 이 문서의 단계에 따라 G2 가속기 최적화 머신 유형의 머신 유형을 변경할 수 있습니다. 다른 가속기 최적화 머신 유형은 가속기 최적화 VM 수정을 참조하세요.

가격 영향

머신 유형마다 다른 요율로 청구되므로, 머신 유형 변경 시 가격에 미치는 영향을 이해해야 합니다. 예를 들어 e2-standard-2 머신 유형의 가격이 e2-micro 머신 유형보다 높습니다.

머신 유형을 변경하면 해당 VM의 지속 사용 할인에도 영향이 있을 수 있습니다. 지속 사용 할인은 동일한 리전의 여러 카테고리마다 개별적으로 계산됩니다. 새 머신 유형이 다른 카테고리에 속하도록 머신 유형을 변경하면 VM 후속 실행 시간에 새 카테고리의 지속 사용 할인이 적용됩니다.

예를 들어 보름 동안 n2-standard-2 머신 유형으로 실행되는 VM이 있다고 가정해보세요. m1-ultramem-40 머신 유형으로 변경하는 경우를 가정해 보겠습니다. 변경하면 Compute Engine에서 계산되는 VM 실행 시간에 메모리 최적화 vCPU 및 메모리 카테고리의 지속 사용 할인이 적용되기 시작합니다.

그달의 나머지 기간 중 25% 이상 동안 VM을 m1-ultramem-40에서 실행했다고 가정할 때 청구서에는 머신 유형 변경 전에 n2-standard-2 머신 유형에 적용되던 지속 사용 할인이 표시되고 이와 별도로 m1-ultramem-40에 적용되는 지속 사용 할인도 표시됩니다.

더 작은 머신 유형으로 이동

리소스가 더 많은 머신 유형에서 리소스가 더 적은 머신 유형으로 이동하는 경우(예: e2-standard-8에서 e2-standard-2 머신 유형으로) 더 작은 머신 유형이 큰 머신 유형에 비해 처리 능력이 떨어지므로 하드웨어 리소스 문제나 성능 제한이 발생할 수 있습니다. 새 머신 유형이 현재 VM에서 실행 중인 애플리케이션이나 서비스를 지원할 수 있는지 확인하거나 더 작은 머신 유형에서 실행될 수 있도록 서비스와 애플리케이션을 업데이트해야 합니다.

머신 유형을 변경하기 전에 올바른 크기 권장사항을 검토하세요. Compute Engine 크기 추천에 대한 자세한 내용은 VM 인스턴스에 머신 유형 권장사항 적용을 참조하세요.

권장사항

다음은 VM 머신 유형을 변경하는 데 도움이 되는 몇 가지 권장사항입니다.

  • 스냅샷을 사용하여 Persistent Disk 데이터를 정기적으로 백업합니다. Persistent Disk 데이터의 스냅샷을 만든 후에 머신 유형을 변경하는 것이 좋습니다. 새 머신 유형에서 기존 VM의 데이터를 지원할 수 있게 하려면 Persistent Disk 스냅샷을 만들고 사용하여 새 머신 유형으로 두 번째 VM을 시작해 VM이 성공적으로 시작되었는지 확인합니다.

  • /etc/fstab 파일에 디스크를 추가합니다. VM에 연결된 추가 디스크가 있으면 VM이 재부팅될 때 자동으로 마운트되도록 해당 디스크가 /etc/fstab 파일에 추가되었는지 확인합니다.

  • 머신 유형을 변경하기 전에 예약을 만듭니다. 리소스 가용성 관련 오류를 방지하려면 영역 내에서 새 머신 유형을 예약할 수 있을 때 Compute Engine 예약을 생성합니다. 예약을 통해 필요할 때 리소스를 사용할 수 있습니다.

예약을 만들려면 다음 단계를 완료하세요.

  1. 계획된 VM과 동일한 속성으로 예약을 만들거나 기존 예약을 식별합니다. 예약 VM 수가 변경하려는 VM 수 보다 크거나 같아야 합니다. 원하는 경우 다른 VM이 이 예약을 사용하지 못하게 하려면 specificReservationRequired 옵션을 사용합니다.

  2. 계획된 VM에서 예약을 사용할 수 있는지 확인합니다.

    1. VM의 예약 어피니티가 올바른지 확인합니다.
    2. VM을 변경하기 직전에 예약에 충분한 용량이 있는지 확인합니다.

머신 유형 변경

중지된 VM의 머신 유형만 변경할 수 있습니다. VM은 VM이 TERMINATED 상태에 있을 때만 중지된 것으로 간주됩니다. 실행 중인 VM의 머신 유형을 변경할 수 없습니다.

머신 유형을 최신 세대로 업그레이드하는 경우 진행하기 전에 VM 마이그레이션 옵션 평가를 검토합니다.

콘솔

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

    VM 인스턴스로 이동

  2. 이름 열에서 머신 유형을 변경할 VM의 이름을 클릭합니다.

  3. VM 인스턴스 세부정보 페이지에서 다음 단계를 완료합니다.

    1. VM이 실행 중이면 페이지 상단에 있는 메뉴에서 중지를 선택하여 VM을 중지합니다.
    2. VM을 수정하려면 수정을 클릭합니다.
    3. 머신 구성 섹션에서 사용할 머신 유형을 선택하거나 커스텀 머신 유형을 만듭니다.

    4. 변경사항을 저장하려면 저장을 클릭합니다.

    5. VM을 다시 시작합니다.

gcloud

  1. gcloud compute instances stop 명령어를 사용하여 VM을 중지합니다.

    gcloud compute instances stop VM_NAME
    

    VM_NAME을 변경할 머신 유형이 포함된 VM으로 바꿉니다.

  2. gcloud compute instances set-machine-type 명령어를 사용하여 머신 유형을 변경합니다.

    gcloud compute instances set-machine-type VM_NAME \
        --machine-type NEW_MACHINE_TYPE
    

    NEW_MACHINE_TYPE을 VM의 새 머신 유형으로 바꿉니다. 머신 유형은 다음 중 하나일 수 있습니다.

  3. gcloud compute instances start 명령어를 사용하여 VM을 시작합니다.

    gcloud compute instances start VM_NAME
    

    VM_NAME을 변경한 VM의 이름으로 바꿉니다.

Java

Java

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

Compute Engine에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.


import com.google.cloud.compute.v1.Instance;
import com.google.cloud.compute.v1.Instance.Status;
import com.google.cloud.compute.v1.InstancesClient;
import com.google.cloud.compute.v1.InstancesSetMachineTypeRequest;
import com.google.cloud.compute.v1.Operation;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class ChangeInstanceMachineType {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Cloud project you want to use.
    String projectId = "your-project-id";
    // Name of the zone your instance belongs to.
    String zone = "zone-name";
    // Name of the VM you want to modify.
    String instanceName = "instance-name";
    // The new machine type you want to use for the VM.
    // For example: "e2-standard-8", "e2-custom-4-2048" or "m1-ultramem-40"
    // More about machine types: https://cloud.google.com/compute/docs/machine-resource
    String newMachineType = "e2-standard-8";
    changeMachineType(projectId, zone, instanceName, newMachineType);
  }

  // Changes the machine type of VM.
  // The VM needs to be in the 'TERMINATED' state for this operation to be successful.
  public static void changeMachineType(String projectId, String zone, String instanceName,
      String newMachineType)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the `instancesClient.close()` method on the client to safely
    // clean up any remaining background resources.
    try (InstancesClient instancesClient = InstancesClient.create()) {

      Instance instance = instancesClient.get(projectId, zone, instanceName);
      if (!instance.getStatus().equals(Status.TERMINATED.name())) {
        throw new Error(String.format(
            "Only machines in TERMINATED state can have their machine type changed. "
                + "%s is in %s state.", instance.getName(), instance.getStatus()));
      }

      InstancesSetMachineTypeRequest machineTypeRequest =
          InstancesSetMachineTypeRequest.newBuilder()
              .setMachineType(String.format("projects/%s/zones/%s/machineTypes/%s",
                  projectId, zone, newMachineType))
              .build();

      Operation response = instancesClient
          .setMachineTypeAsync(projectId, zone, instanceName, machineTypeRequest)
          .get(3, TimeUnit.MINUTES);

      if (response.hasError()) {
        System.out.println("Machine type update failed! " + response);
        return;
      }
      System.out.println("Machine type update - operation status: " + response.getStatus());
    }
  }
}

Python

Python

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

Compute Engine에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

from __future__ import annotations

import sys
from typing import Any

from google.api_core.extended_operation import ExtendedOperation
from google.cloud import compute_v1


def wait_for_extended_operation(
    operation: ExtendedOperation, verbose_name: str = "operation", timeout: int = 300
) -> Any:
    """
    Waits for the extended (long-running) operation to complete.

    If the operation is successful, it will return its result.
    If the operation ends with an error, an exception will be raised.
    If there were any warnings during the execution of the operation
    they will be printed to sys.stderr.

    Args:
        operation: a long-running operation you want to wait on.
        verbose_name: (optional) a more verbose name of the operation,
            used only during error and warning reporting.
        timeout: how long (in seconds) to wait for operation to finish.
            If None, wait indefinitely.

    Returns:
        Whatever the operation.result() returns.

    Raises:
        This method will raise the exception received from `operation.exception()`
        or RuntimeError if there is no exception set, but there is an `error_code`
        set for the `operation`.

        In case of an operation taking longer than `timeout` seconds to complete,
        a `concurrent.futures.TimeoutError` will be raised.
    """
    result = operation.result(timeout=timeout)

    if operation.error_code:
        print(
            f"Error during {verbose_name}: [Code: {operation.error_code}]: {operation.error_message}",
            file=sys.stderr,
            flush=True,
        )
        print(f"Operation ID: {operation.name}", file=sys.stderr, flush=True)
        raise operation.exception() or RuntimeError(operation.error_message)

    if operation.warnings:
        print(f"Warnings during {verbose_name}:\n", file=sys.stderr, flush=True)
        for warning in operation.warnings:
            print(f" - {warning.code}: {warning.message}", file=sys.stderr, flush=True)

    return result


def change_machine_type(
    project_id: str, zone: str, instance_name: str, new_machine_type: str
) -> None:
    """
    Changes the machine type of VM. The VM needs to be in the 'TERMINATED' state for this operation to be successful.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        zone: name of the zone your instance belongs to.
        instance_name: name of the VM you want to modify.
        new_machine_type: the new machine type you want to use for the VM.
            For example: `e2-standard-8`, `e2-custom-4-2048` or `m1-ultramem-40`
            More about machine types: https://cloud.google.com/compute/docs/machine-resource
    """
    client = compute_v1.InstancesClient()
    instance = client.get(project=project_id, zone=zone, instance=instance_name)

    if instance.status != compute_v1.Instance.Status.TERMINATED.name:
        raise RuntimeError(
            f"Only machines in TERMINATED state can have their machine type changed. "
            f"{instance.name} is in {instance.status}({instance.status_message}) state."
        )

    machine_type = compute_v1.InstancesSetMachineTypeRequest()
    machine_type.machine_type = (
        f"projects/{project_id}/zones/{zone}/machineTypes/{new_machine_type}"
    )
    operation = client.set_machine_type(
        project=project_id,
        zone=zone,
        instance=instance_name,
        instances_set_machine_type_request_resource=machine_type,
    )

    wait_for_extended_operation(operation, "changing machine type")

REST

  1. instances.stop 메서드를 사용하여 VM을 중지합니다.

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

    다음을 바꿉니다.

    • PROJECT_ID: 프로젝트 ID입니다.

    • ZONE: VM이 포함된 영역입니다.

    • VM_NAME: 변경할 머신 유형이 포함된 VM입니다.

  2. instances.setMachineType 메서드를 사용하여 머신 유형을 변경합니다.

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

    요청 본문에 업데이트된 machineType을 제공합니다.

    {
        machineType: "zones/MACHINE_TYPE_ZONE/machineTypes/NEW_MACHINE_TYPE"
    }
    

    다음을 바꿉니다.

    • MACHINE_TYPE_ZONE: 머신 유형이 포함된 영역입니다.

    • NEW_MACHINE_TYPE: VM의 새 머신 유형입니다.

      머신 유형은 다음 중 하나일 수 있습니다.

  3. instances.start 메서드를 사용하여 VM을 시작합니다.

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

    다음을 바꿉니다.

    • PROJECT_ID: 프로젝트 ID입니다.
    • ZONE: VM이 포함된 영역입니다.
    • VM_NAME: 변경한 VM의 이름입니다.

다음 단계