VM インスタンスのマシンタイプの編集


VM にローカル SSD がなく、マネージド インスタンス グループ(MIG)の一部でない場合は、停止した後に 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 はメモリ最適化 vCPU とメモリのカテゴリの継続利用割引を適用して、VM の実行時間を計測するようになります。

請求書には、マシンタイプの変更を行う前から n2-standard-2 マシンタイプに適用されている継続利用割引と、VM が月の残り 25% 以上の間 m1-ultramem-40 で実行されていれば、別途 m1-ultramem-40 に適用された継続利用割引が記載されます。

ベスト プラクティス

VM マシンタイプを正常に変更するためのベスト プラクティスは次のとおりです。

  • スナップショットを使用して、定期的に永続ディスクデータのバックアップを取る。 マシンタイプを変更する前に、永続ディスクデータのスナップショットを取ることを検討してください。新しいマシンタイプで既存の VM 上のデータをサポートできることを確認する場合、永続ディスクのスナップショットを取り、それを使用して新しいマシンタイプで 2 番目の VM を起動し、VM が正常に起動することを確認します。

  • /etc/fstab ファイルに永続ディスクを追加する。追加の永続ディスクを VM にアタッチする場合は、それらの永続ディスクを /etc/fstab ファイルに追加して、VM の再起動時に自動的にマウントされるようにします。

  • マシンタイプを変更する前に予約を作成する。リソースの可用性に関連するエラーを回避するには、必要なリソースが使用できるときに新しいマシンタイプの 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

コンソール

  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. マシンタイプの変更で説明されている手順を行ってください。

次のステップ