영구 디스크 수정


영구 디스크를 가상 머신(VM) 인스턴스의 부팅 디스크로 사용하거나 VM에 연결하는 데이터 디스크로 사용할 수 있습니다. 이 문서에서는 다음을 수행하기 위해 기존 영구 디스크를 수정하는 방법을 설명합니다.

  • 다른 디스크 유형으로 전환합니다.
  • 연결된 VM이 삭제될 때 디스크를 자동으로 삭제합니다.

영구 디스크와 사용 가능한 디스크 유형에 대한 일반적인 정보는 영구 디스크 개요를 참조하세요.

영구 디스크 볼륨의 유형 변경

성능 또는 가격 요구사항을 충족하기 위해 특정 영구 디스크 볼륨의 유형을 변경해야 하는 경우가 있습니다. 예를 들어 워크로드의 데이터 디스크를 표준 영구 디스크에서 균형 있는 영구 디스크로 변경하고 싶을 수 있습니다.

기존 영구 디스크 볼륨의 유형은 직접 변경할 수 없습니다. 기존 디스크의 스냅샷을 만든 다음 이 스냅샷을 사용하여 새 유형의 디스크를 만들어야 합니다.

예를 들어 표준 영구 디스크를 SSD 영구 디스크로 변경하려면 다음 프로세스를 따르세요.

콘솔

  1. 표준 영구 디스크의 스냅샷을 만듭니다.
  2. 스냅샷을 기반으로 새로운 영구 디스크를 만듭니다. 유형 드롭다운 목록에서 'SSD 영구 디스크'를 선택합니다.

gcloud

  1. 표준 영구 디스크의 스냅샷을 만듭니다.
  2. 스냅샷을 기반으로 새로운 영구 디스크를 만듭니다. --type 플래그를 포함하고 pd-ssd를 지정합니다.

REST

  1. 표준 영구 디스크의 스냅샷을 만듭니다.
  2. 스냅샷을 기반으로 새로운 영구 디스크를 만듭니다. type 필드에서 "zones/ZONE/diskTypes/pd-ssd"를 지정하고 ZONE을 인스턴스 및 새 디스크가 있는 영역으로 바꿉니다.

새 디스크를 만들고 테스트한 후에는 스냅샷을 삭제하고 원본 디스크를 삭제할 수 있습니다.

영구 디스크 볼륨의 자동 삭제 상태 설정

연결된 VM 인스턴스가 삭제될 때 읽기/쓰기 영구 디스크 볼륨을 자동으로 삭제할 수 있습니다. 이 동작은 연결된 디스크의 VM 인스턴스에서 autoDelete 속성에 의해 제어되며 언제든지 업데이트할 수 있습니다. 마찬가지로 autoDelete 값을 false로 표시하여 영구 디스크 볼륨이 삭제되지 않도록 할 수 있습니다.

콘솔

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

    VM 인스턴스로 이동

  2. 디스크가 연결된 인스턴스를 선택합니다.

  3. 인스턴스 이름을 클릭합니다. VM 인스턴스 세부정보 페이지가 나타납니다.

  4. 수정을 클릭합니다.

  5. 스토리지 섹션의 추가 디스크 제목에서 연필 아이콘 을 클릭하여 디스크의 삭제 규칙을 변경합니다.

  6. 저장을 클릭하여 인스턴스를 업데이트합니다.

gcloud

gcloud compute instances set-disk-auto-delete 명령어를 사용하여 영구 디스크의 자동 삭제 상태를 설정합니다. 디스크를 유지하려면 --no-auto-delete 플래그를 사용합니다. 디스크를 삭제하려면 --auto-delete 플래그를 사용합니다.

gcloud compute instances set-disk-auto-delete VM_NAME \
  AUTO_DELETE_SETTING \
  --disk DISK_NAME

다음을 바꿉니다.

  • VM_NAME: 인스턴스의 이름입니다.
  • AUTO_DELETE_SETTING: 디스크를 자동으로 삭제할지 여부입니다. VM을 삭제한 후 디스크를 유지하려면 --no-auto-delete를 지정하고 VM과 동시에 디스크를 삭제하려면 --auto-delete를 지정합니다.
  • DISK_NAME: 디스크의 이름입니다.

Go

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

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

import (
	"context"
	"fmt"
	"io"

	compute "cloud.google.com/go/compute/apiv1"
	computepb "cloud.google.com/go/compute/apiv1/computepb"
)

// setDiskAutodelete sets the autodelete flag of a disk to given value.
func setDiskAutoDelete(
	w io.Writer,
	projectID, zone, instanceName, diskName string, autoDelete bool,
) error {
	// projectID := "your_project_id"
	// zone := "us-west3-b"
	// instanceName := "your_instance_name"
	// diskName := "your_disk_name"
	// autoDelete := true

	ctx := context.Background()
	instancesClient, err := compute.NewInstancesRESTClient(ctx)
	if err != nil {
		return fmt.Errorf("NewInstancesRESTClient: %w", err)
	}
	defer instancesClient.Close()

	getInstanceReq := &computepb.GetInstanceRequest{
		Project:  projectID,
		Zone:     zone,
		Instance: instanceName,
	}

	instance, err := instancesClient.Get(ctx, getInstanceReq)
	if err != nil {
		return fmt.Errorf("unable to get instance: %w", err)
	}

	diskExists := false

	for _, disk := range instance.GetDisks() {
		if disk.GetDeviceName() == diskName {
			diskExists = true
			break
		}
	}

	if !diskExists {
		return fmt.Errorf(
			"instance %s doesn't have a disk named %s attached",
			instanceName,
			diskName,
		)
	}

	req := &computepb.SetDiskAutoDeleteInstanceRequest{
		Project:    projectID,
		Zone:       zone,
		Instance:   instanceName,
		DeviceName: diskName,
		AutoDelete: autoDelete,
	}

	op, err := instancesClient.SetDiskAutoDelete(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to set disk autodelete field: %w", err)
	}

	if err = op.Wait(ctx); err != nil {
		return fmt.Errorf("unable to wait for the operation: %w", err)
	}

	fmt.Fprintf(w, "disk autoDelete field updated.\n")

	return nil
}

Java

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

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


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

public class SetDiskAutodelete {

  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";

    // The zone of the disk that you want to modify.
    String zone = "europe-central2-b";

    // Name of the instance the disk is attached to.
    String instanceName = "YOUR_INSTANCE_NAME";

    // The name of the disk for which you want to modify the autodelete flag.
    String diskName = "YOUR_DISK_NAME";

    // The new value of the autodelete flag.
    boolean autoDelete = true;

    setDiskAutodelete(projectId, zone, instanceName, diskName, autoDelete);
  }

  // Sets the autodelete flag of a disk to given value.
  public static void setDiskAutodelete(String projectId, String zone, String instanceName,
      String diskName, boolean autoDelete)
      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()) {

      // Retrieve the instance given by the instanceName.
      Instance instance = instancesClient.get(projectId, zone, instanceName);

      // Check if the instance contains a disk that matches the given diskName.
      boolean diskNameMatch = instance.getDisksList()
          .stream()
          .anyMatch(disk -> disk.getDeviceName().equals(diskName));

      if (!diskNameMatch) {
        throw new Error(
            String.format("Instance %s doesn't have a disk named %s attached", instanceName,
                diskName));
      }

      // Create the request object.
      SetDiskAutoDeleteInstanceRequest request = SetDiskAutoDeleteInstanceRequest.newBuilder()
          .setProject(projectId)
          .setZone(zone)
          .setInstance(instanceName)
          .setDeviceName(diskName)
          // Update the autodelete property.
          .setAutoDelete(autoDelete)
          .build();

      // Wait for the update instance operation to complete.
      Operation response = instancesClient.setDiskAutoDeleteAsync(request)
          .get(3, TimeUnit.MINUTES);

      if (response.hasError()) {
        System.out.println("Failed to update Disk autodelete field!" + response);
        return;
      }
      System.out.println(
          "Disk autodelete field updated. Operation Status: " + response.getStatus());
    }
  }
}

Node.js

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

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

/**
 * TODO(developer): Uncomment and replace these variables before running the sample.
 */
// const projectId = 'YOUR_PROJECT_ID';
// const zone = 'europe-central2-b';
// const instanceName = 'YOUR_INSTANCE_NAME';
// const diskName = 'YOUR_DISK_NAME';
// const autoDelete = true;

const compute = require('@google-cloud/compute');

async function setDiskAutodelete() {
  const instancesClient = new compute.InstancesClient();

  const [instance] = await instancesClient.get({
    project: projectId,
    zone,
    instance: instanceName,
  });

  if (!instance.disks.some(disk => disk.deviceName === diskName)) {
    throw new Error(
      `Instance ${instanceName} doesn't have a disk named ${diskName} attached.`
    );
  }

  const [response] = await instancesClient.setDiskAutoDelete({
    project: projectId,
    zone,
    instance: instanceName,
    deviceName: diskName,
    autoDelete,
  });
  let operation = response.latestResponse;
  const operationsClient = new compute.ZoneOperationsClient();

  // Wait for the update instance operation to complete.
  while (operation.status !== 'DONE') {
    [operation] = await operationsClient.wait({
      operation: operation.name,
      project: projectId,
      zone: operation.zone.split('/').pop(),
    });
  }

  console.log('Disk autoDelete field updated.');
}

setDiskAutodelete();

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 set_disk_autodelete(
    project_id: str, zone: str, instance_name: str, disk_name: str, autodelete: bool
) -> None:
    """
    Set the autodelete flag of a disk to given value.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        zone: name of the zone in which is the disk you want to modify.
        instance_name: name of the instance the disk is attached to.
        disk_name: the name of the disk which flag you want to modify.
        autodelete: the new value of the autodelete flag.
    """
    instance_client = compute_v1.InstancesClient()
    instance = instance_client.get(
        project=project_id, zone=zone, instance=instance_name
    )

    for disk in instance.disks:
        if disk.device_name == disk_name:
            break
    else:
        raise RuntimeError(
            f"Instance {instance_name} doesn't have a disk named {disk_name} attached."
        )

    disk.auto_delete = autodelete

    operation = instance_client.update(
        project=project_id,
        zone=zone,
        instance=instance_name,
        instance_resource=instance,
    )

    wait_for_extended_operation(operation, "disk update")

REST

API를 사용하여 자동 삭제 상태를 설정하려면 instances.setDiskAutoDelete 메서드에 대한 POST 요청을 실행합니다.

autoDelete 매개변수를 사용하여 디스크 삭제 여부를 나타냅니다.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setDiskAutoDelete?deviceName=DISK_NAME,autoDelete=AUTO_DELETE_OPTION

다음을 바꿉니다.

  • PROJECT_ID: 프로젝트 ID입니다.
  • ZONE: 인스턴스와 디스크가 있는 영역입니다.
  • VM_NAME: 인스턴스의 이름입니다.
  • DISK_NAME: 인스턴스에 연결된 디스크의 이름입니다.
  • AUTO_DELETE_OPTION: VM이 삭제될 때 디스크를 자동으로 삭제할지 여부입니다. 디스크를 삭제하려면 true로 설정합니다. VM을 삭제한 후 디스크를 유지하려면 false로 설정합니다.

문제 해결

전체 디스크 및 디스크 크기 조절과 관련된 문제를 진단하고 해결하는 방법은 전체 디스크 및 디스크 크기 조절 문제 해결을 참조하세요.

다음 단계