VM 인스턴스의 머신 유형 수정


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

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

로컬 SSD가 없고 MIG에 포함되지 않은 VM의 경우 다음 리소스에 영향을 주지 않고 머신 유형을 변경할 수 있습니다.

  • VM의 SSH 키
  • VM 메타데이터와 같은 VM 구성
  • 설치된 애플리케이션 및 애플리케이션 데이터와 같은 VM의 영구 디스크 데이터

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

시작하기 전에

  • VM 중지 방법에 대해 숙지합니다.
  • 머신 유형에 대해 숙지합니다.
  • 아직 인증을 설정하지 않았다면 설정합니다. 인증은 Google Cloud 서비스 및 API에 액세스하기 위해 ID를 확인하는 프로세스입니다. 로컬 개발 환경에서 코드 또는 샘플을 실행하려면 다음과 같이 Compute Engine에 인증하면 됩니다.

    이 페이지의 샘플 사용 방법에 대한 탭을 선택하세요.

    콘솔

    Google Cloud 콘솔을 사용하여 Google Cloud 서비스 및 API에 액세스할 때는 인증을 설정할 필요가 없습니다.

    Java

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

    1. Google Cloud CLI를 설치합니다.
    2. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

      gcloud init
    3. Google 계정의 로컬 인증 사용자 인증 정보를 만듭니다.

      gcloud auth application-default login

    자세한 내용은 로컬 개발 환경의 인증 설정를 참조하세요.

    Python

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

    1. Google Cloud CLI를 설치합니다.
    2. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

      gcloud init
    3. Google 계정의 로컬 인증 사용자 인증 정보를 만듭니다.

      gcloud auth application-default login

    자세한 내용은 로컬 개발 환경의 인증 설정를 참조하세요.

    REST

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

      Google Cloud CLI를 설치한 후 다음 명령어를 실행하여 초기화합니다.

      gcloud init

제한사항

가격 영향

머신 유형마다 다른 요율로 청구되므로, 머신 유형 변경 시 가격에 미치는 영향을 이해해야 합니다. 예를 들어 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에 적용되는 지속 사용 할인도 표시됩니다.

권장사항

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

  • 스냅샷을 사용하여 영구 디스크 데이터를 정기적으로 백업합니다. 영구 디스크 데이터의 스냅샷을 만든 후에 머신 유형을 변경하는 것이 좋습니다. 새 머신 유형에서 기존 VM의 데이터를 지원할 수 있도록 하려면 영구 디스크 스냅샷을 만들고 사용하여 새 머신 유형으로 두 번째 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을 3세대 머신 시리즈로 이동을 검토합니다.

이 작업에 필요한 권한

이 작업을 수행하려면 다음과 같은 권한이 있어야 합니다.

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

Console

  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의 이름입니다.

더 작은 머신 유형으로 이동

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

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

VM을 3세대 머신 계열로 이동

요구사항이 충족되면 머신 유형(예: m1-ultramem-160에서 m3-ultramem-128로)을 변경하여 새로운 세대 머신 계열의 머신 유형을 사용하도록 VM을 수정할 수 있습니다.

3세대 머신 유형과 Arm T2A 머신 유형은 현재 머신 유형과 동일한 기능 및 인터페이스를 지원하지 않을 수 있습니다. 마이그레이션 프로세스를 시작하기 전에 새로운 VM으로 이동 준비의 요구사항 및 고려사항을 검토합니다.

VM 인스턴스의 머신 유형을 3세대 머신 유형으로 변경하려면 다음 방법 중 하나를 사용하면 됩니다.

새 VM 인스턴스를 만들고 워크로드 이동

이 절차에서는 새 VM 인스턴스를 만든 다음 워크로드를 새 VM으로 이동합니다.

이 절차를 완료하는 방법에 대한 자세한 내용은 기존 VM에서 새 VM으로 워크로드 이동을 참조하세요.

머신 유형을 새 머신 유형으로 변경

이 절차에서는 새 머신 유형을 사용하도록 현재 VM 인스턴스를 업데이트할 수 있는지 확인한 다음 머신 유형을 변경합니다.

  1. 현재 VM 인스턴스가 새 머신 유형에서 지원하는 운영체제 버전을 사용하는지 확인합니다. 버전이 지원되지 않으면 기존 VM에서 새 VM으로 워크로드 이동의 안내를 따릅니다.

  2. VM의 머신 유형을 T2A 머신 유형으로 변경하려면 기존 VM에서 새 VM으로 워크로드 이동의 안내를 따릅니다.

  3. 현재 VM에 로컬 SSD가 연결된 경우 기존 VM에서 새 VM으로 워크로드 이동의 안내를 따릅니다.

  4. 애플리케이션과 프로그램이 gVNIC 또는 NVMe와 같은 다른 네트워크 또는 스토리지 인터페이스를 지원할 수 있는지 확인합니다.

  5. VM의 머신 유형을 변경하기 위한 권장사항을 검토하세요.

  6. 머신 유형 변경에 설명된 절차를 따릅니다.

다음 단계