コンピューティング インスタンスのマシンタイプの編集


仮想マシン(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 など)のマシンタイプに変更する場合は、ワークロードを新しい Compute インスタンスに移動するに記載されている手順を実施する必要があります。

次のリソースに影響を与えることなくマシンタイプを変更できます。

  • VM の SSH 認証鍵
  • VM 構成(VM メタデータなど)
  • 接続された Persistent Disk または Hyperdisk 上のデータ(インストールされたアプリケーションやアプリケーション データなど)

MIG 内の VM のマシンタイプを変更するには、MIG で VM 構成の更新を自動的に適用するをご覧ください。

始める前に

  • VM を停止する方法を理解しておきます。
  • マシンタイプについて理解しておきます。
  • まだ設定していない場合は、認証を設定します。認証とは、Google Cloud サービスと API にアクセスするために ID を確認するプロセスです。ローカル開発環境からコードまたはサンプルを実行するには、次のように Compute Engine に対する認証を行います。

    このページのサンプルをどのように使うかに応じて、タブを選択してください。

    コンソール

    Google Cloud コンソールを使用して Google Cloud サービスと API にアクセスする場合、認証を設定する必要はありません。

    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.

    詳細については、 ローカル開発環境の認証の設定 をご覧ください。

    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.

    詳細については、 ローカル開発環境の認証の設定 をご覧ください。

    REST

    このページの REST API サンプルをローカル開発環境で使用するには、gcloud CLI に指定した認証情報を使用します。

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

      gcloud init

必要なロール

VM のマシンタイプを変更するために必要な権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。

ロールの付与の詳細については、アクセス権の管理をご覧ください。

これらの事前定義ロールには、VM のマシンタイプを変更するために必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

VM のマシンタイプを変更するには、次の権限が必要です。

  • VM に対する compute.instances.setMachineType
  • VM に対する compute.instances.start
  • VM に対する compute.instances.stop

カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。

制限事項

料金への影響

請求される料金はマシンタイプごとに異なるため、マシンタイプを変更する際は、料金への影響を確認してください。たとえば、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 に適用された継続利用割引が記載されます。

より小さなマシンタイプに移行する

リソースが多いマシンタイプからリソースが少ないマシンタイプに移行する場合(例: e2-standard-8 マシンタイプから e2-standard-2 マシンタイプへの移行)は、ハードウェアのリソースに関する問題やパフォーマンスの制限が発生する可能性があります。これは、小さいマシンタイプのほうが性能が低いためです。新しいマシンタイプで、現在の VM で実行されているアプリケーションやサービスをサポートできることを確認するか、より小さいマシンタイプで実行できるようサービスやアプリケーションを更新してください。

マシンタイプを変更する前に、サイズ適正化の推奨事項を確認します。Compute Engine の推奨サイズについては、VM インスタンスのマシンタイプに関する推奨事項の適用をご覧ください。

ベスト プラクティス

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

  • スナップショットを使用して、Persistent Disk データを定期的にバックアップする。マシンタイプを変更する前に、Persistent Disk データのスナップショットを作成することを検討してください。新しいマシンタイプで既存の VM 上のデータをサポートできることを確認する場合、Persistent Disk のスナップショットを作成します。このスナップショットを使用して新しいマシンタイプで 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 移行オプションを評価するを確認してから続行してください。

コンソール

  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 の名前

次のステップ