Crear y administrar VM de Windows Server.

Compute Engine proporciona imágenes públicas con Windows Server que puedes usar para crear instancias. Para obtener instrucciones para crear una instancia de Windows Server con SQL Server preinstalado, consulta Crea instancias de SQL Server.

Para obtener más información general sobre instancias de Windows Server y aplicaciones de Windows que se pueden ejecutar en Compute Engine, consulta Windows en Compute Engine.

Precios

Antes de comenzar

  • Habilita la facturación de tu proyecto.
  • Si aún no lo hiciste, configura la autenticación. La autenticación verifica tu identidad para acceder a los servicios y las APIs de Google Cloud . Para ejecutar código o muestras desde un entorno de desarrollo local, puedes autenticarte en Compute Engine seleccionando una de las siguientes opciones:

    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.

    gcloud

    1. Instala Google Cloud CLI. Después de la instalación, inicializa Google Cloud CLI ejecutando el siguiente comando:

      gcloud init

      Si usas un proveedor de identidad externo (IdP), primero debes acceder a gcloud CLI con tu identidad federada.

    2. Set a default region and zone.

    Go

    Para usar las muestras de Go de esta página en un entorno de desarrollo local, instala e inicializa gcloud CLI y, luego, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

      Instala Google Cloud CLI.

      Si usas un proveedor de identidad externo (IdP), primero debes acceder a gcloud CLI con tu identidad federada.

      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.

      If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

    Para obtener más información, consulta Set up authentication for a local development environment.

    Java

    Para usar las muestras de Java de esta página en un entorno de desarrollo local, instala e inicializa gcloud CLI y, luego, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

      Instala Google Cloud CLI.

      Si usas un proveedor de identidad externo (IdP), primero debes acceder a gcloud CLI con tu identidad federada.

      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.

      If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

    Para obtener más información, consulta Set up authentication for a local development environment.

    Node.js

    Para usar las muestras de Node.js de esta página en un entorno de desarrollo local, instala e inicializa gcloud CLI y, luego, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

      Instala Google Cloud CLI.

      Si usas un proveedor de identidad externo (IdP), primero debes acceder a gcloud CLI con tu identidad federada.

      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.

      If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

    Para obtener más información, consulta Set up authentication for a local development environment.

    Python

    Para usar las muestras de Python de esta página en un entorno de desarrollo local, instala e inicializa gcloud CLI y, luego, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

      Instala Google Cloud CLI.

      Si usas un proveedor de identidad externo (IdP), primero debes acceder a gcloud CLI con tu identidad federada.

      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.

      If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

    Para obtener más información, consulta Set up authentication for a local development environment.

    REST

    Para usar las muestras de la API de REST en esta página en un entorno de desarrollo local, debes usar las credenciales que proporciones a gcloud CLI.

      Instala Google Cloud CLI.

      Si usas un proveedor de identidad externo (IdP), primero debes acceder a gcloud CLI con tu identidad federada.

    Para obtener más información, consulta Autentícate para usar REST en la documentación de autenticación de Google Cloud .

    Crea una instancia de Windows Server

    Para crear una instancia con Windows Server, debes especificar la familia de imágenes para la versión específica de Windows que necesitas. Compute Engine ofrece varias versiones de Windows Server, y la mayoría están disponibles como imágenes de VM protegida. Las imágenes de VM protegidas ofrecen funciones de seguridad, como firmware compatible con UEFI, inicio seguro e inicio medido con protección vTPM. Para obtener una lista de las familias de imágenes disponibles, consulta imágenes públicas.

    Si necesitas más de dos sesiones de escritorio remoto simultáneas, deberás comprar licencias de acceso de cliente (CAL) para sesión del escritorio remoto (RDS). Para obtener más información, consulta Licencia para la implementación de RDS con licencias de acceso de cliente (CAL).

    Trabaja con Microsoft Active Directory

    Si planeas usar Microsoft Active Directory (AD) con tu instancia nueva, asegúrate de que el nombre de la instancia no tenga más de 15 caracteres para cumplir con las restricciones de longitud máxima de los nombres establecidas del sistema.

    AD usa los nombres NetBIOS de las máquinas, que se generan como el nombre de la instancia truncado a 15 caracteres. Como resultado, es posible que encuentres el siguiente error cuando intentes acceder como usuario de dominio: The Security Database on the Server does not have a Computer Account for this Workstation Trust Relationship.

    Crea una instancia de Windows Server que use una IP externa para la activación

    En esta sección se describe cómo crear una instancia de Windows Server que tenga una dirección IP externa. La red de VPC debe estar configurada para permitir el acceso a kms.windows.googlecloud.com.

    Console

    Sigue estos pasos para crear una VM básica de Windows:

    1. En la consola de Google Cloud , ve a la página Crear una instancia.

      Ir a Crear una instancia

    2. En Disco de arranque, elige Cambiar y haz lo siguiente:

      1. En la pestaña Imágenes públicas, elige un sistema operativo de Windows Server.
      2. Haz clic en Seleccionar.
    3. Para crear la VM, haz clic en Crear.

    Para crear una instancia de Windows con VM protegida, sigue estos pasos:

    1. En la consola de Google Cloud , ve a la página Crear una instancia.

      Ir a Crear una instancia

    2. En Disco de arranque, elige Cambiar y haz lo siguiente:

      1. En la pestaña Imágenes públicas, elige un sistema operativo de Windows Server.
      2. Para guardar la configuración del disco de arranque, haz clic en Seleccionar.
    3. De manera opcional, para cambiar la configuración de VM protegida de la VM, expande la sección Opciones avanzadas. A continuación, sigue estos pasos:

      1. Expande la sección Seguridad.
      2. Si deseas desactivar el inicio seguro, desmarca la casilla de verificación Activar el inicio seguro. El inicio seguro ayuda a proteger tus instancias de VM de softwares maliciosos y rootkits de nivel de inicio y kernel. Para obtener más información, consulta la documentación sobre el inicio seguro.
      3. Si deseas desactivar el módulo de plataforma segura virtual (vTPM), desmarca la casilla de verificación Activar vTPM. El v habilita el inicio medido, que valida la integridad previa al inicio y la integridad de inicio de la VM. Para obtener más información, consulta la documentación sobre el Módulo de plataforma segura virtual (vTPM).

      4. Si deseas desactivar la supervisión de integridad, desmarca la casilla de verificación Activar supervisión de integridad. Con esta función, puedes supervisar la integridad de inicio de tus instancias de VM protegida con Cloud Monitoring. Para obtener más información, consulta Supervisión de integridad.

    4. Para crear la VM, haz clic en Crear.

    gcloud

    Usa el comando compute images list para ver una lista de las imágenes de Windows Server disponibles:

     gcloud compute images list --project windows-cloud --no-standard-images 

    Para determinar si una imagen admite características de VM protegida, ejecuta el siguiente comando y busca UEFI_COMPATIBLE en el resultado:

     gcloud compute images describe IMAGE_NAME --project windows-cloud 

    Reemplaza IMAGE_NAME por el nombre de la imagen que debe verificarse para determinar si es compatible con las funciones de VM protegida.

    Usa el comando compute instances create para crear una instancia nueva y especificar la familia de imágenes para una de las imágenes públicas de Windows Server.

    gcloud compute instances create INSTANCE_NAME \     --image-project windows-cloud \     --image-family IMAGE_FAMILY \     --machine-type MACHINE_TYPE \     --boot-disk-size BOOT_DISK_SIZE \     --boot-disk-type BOOT_DISK_TYPE 

    Reemplaza lo siguiente:

    Si eliges una imagen que admite una VM protegida, tienes la opción de cambiar la configuración de VM protegida de la instancia con una de las siguientes marcas:

    • --no-shielded-secure-boot: inhabilita el Inicio seguro. El Inicio seguro ayuda a proteger tus instancias de VM del software malicioso y los rootkits de nivel de inicio y kernel. Para obtener más información, consulta la documentación sobre Inicio seguro.
    • --no-shielded-vtpm: inhabilita el módulo de plataforma segura virtual (vTPM). El vTPM habilita el inicio medido, que valida la integridad previa al inicio y la integridad de inicio de la VM. Para obtener más información, consulta la documentación sobre el Módulo de plataforma segura virtual (vTPM).

    • --no-shielded-integrity-monitoring: Inhabilita la supervisión de integridad. Con esta función, puedes supervisar la integridad de inicio de tus instancias de VM protegida con Cloud Monitoring. Para obtener más información, consulta la documentación sobre la supervisión de integridad.

    En el ejemplo siguiente, se crea una instancia de VM protegida de Windows 2012 con el inicio seguro inhabilitado:

     gcloud compute instances create my-instance \     --image-family windows-2022 --image-project windows-cloud \     --no-shielded-secure-boot 

    Go

    import ( 	"context" 	"fmt" 	"io"  	compute "cloud.google.com/go/compute/apiv1" 	computepb "cloud.google.com/go/compute/apiv1/computepb" 	"google.golang.org/protobuf/proto" )  // createWndowsServerInstanceExternalIP creates a new Windows Server instance // that has an external IP address. func createWndowsServerInstanceExternalIP( 	w io.Writer, 	projectID, zone, instanceName, machineType, sourceImageFamily string, ) error { 	// projectID := "your_project_id" 	// zone := "europe-central2-b" 	// instanceName := "your_instance_name" 	// machineType := "n1-standard-1" 	// sourceImageFamily := "windows-2022"  	ctx := context.Background() 	instancesClient, err := compute.NewInstancesRESTClient(ctx) 	if err != nil { 		return fmt.Errorf("NewInstancesRESTClient: %w", err) 	} 	defer instancesClient.Close()  	disk := &computepb.AttachedDisk{ 		// Describe the size and source image of the boot disk to attach to the instance. 		InitializeParams: &computepb.AttachedDiskInitializeParams{ 			DiskSizeGb: proto.Int64(64), 			SourceImage: proto.String( 				fmt.Sprintf( 					"projects/windows-cloud/global/images/family/%s", 					sourceImageFamily, 				), 			), 		}, 		AutoDelete: proto.Bool(true), 		Boot:       proto.Bool(true), 	}  	network := &computepb.NetworkInterface{ 		// If you are using a custom VPC network it must be configured 		// to allow access to kms.windows.googlecloud.com. 		// https://cloud.google.com/compute/docs/instances/windows/creating-managing-windows-instances#kms-server. 		Name: proto.String("global/networks/default"), 		AccessConfigs: []*computepb.AccessConfig{ 			{ 				Type: proto.String("ONE_TO_ONE_NAT"), 				Name: proto.String("External NAT"), 			}, 		}, 	}  	inst := &computepb.Instance{ 		Name: proto.String(instanceName), 		Disks: []*computepb.AttachedDisk{ 			disk, 		}, 		MachineType: proto.String(fmt.Sprintf("zones/%s/machineTypes/%s", zone, machineType)), 		NetworkInterfaces: []*computepb.NetworkInterface{ 			network, 		}, 		// If you chose an image that supports Shielded VM, 		// you can optionally change the instance's Shielded VM settings. 		// ShieldedInstanceConfig: &computepb.ShieldedInstanceConfig{ 		// 	EnableSecureBoot: proto.Bool(true), 		// 	EnableVtpm: proto.Bool(true), 		// 	EnableIntegrityMonitoring: proto.Bool(true), 		// }, 	}  	req := &computepb.InsertInstanceRequest{ 		Project:          projectID, 		Zone:             zone, 		InstanceResource: inst, 	}  	op, err := instancesClient.Insert(ctx, req) 	if err != nil { 		return fmt.Errorf("unable to create instance: %w", err) 	}  	if err = op.Wait(ctx); err != nil { 		return fmt.Errorf("unable to wait for the operation: %w", err) 	}  	fmt.Fprintf(w, "Instance created\n")  	return nil } 

    Java

     import com.google.cloud.compute.v1.AccessConfig; import com.google.cloud.compute.v1.AttachedDisk; import com.google.cloud.compute.v1.AttachedDiskInitializeParams; import com.google.cloud.compute.v1.InsertInstanceRequest; import com.google.cloud.compute.v1.Instance; import com.google.cloud.compute.v1.InstancesClient; import com.google.cloud.compute.v1.NetworkInterface; 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 CreateWindowsServerInstanceExternalIp {    public static void main(String[] args)       throws IOException, ExecutionException, InterruptedException, TimeoutException {     // TODO(developer): Replace these variables before running the sample.     // projectId - ID or number of the project you want to use.     String projectId = "your-google-cloud-project-id";      // zone - Name of the zone you want to use, for example: us-west3-b     String zone = "europe-central2-b";      // instanceName - Name of the new machine.     String instanceName = "instance-name";      createWindowsServerInstanceExternalIp(projectId, zone, instanceName);   }    // Creates a new Windows Server instance that has an external IP address.   public static void createWindowsServerInstanceExternalIp(String projectId, String zone,       String instanceName)       throws IOException, ExecutionException, InterruptedException, TimeoutException {      // machineType - Machine type you want to create in following format:     //  *    "zones/{zone}/machineTypes/{type_name}". For example:     //  *    "zones/europe-west3-c/machineTypes/f1-micro"     //  *    You can find the list of available machine types using:     //  *    https://cloud.google.com/sdk/gcloud/reference/compute/machine-types/list     String machineType = "n1-standard-1";     // sourceImageFamily - Name of the public image family for Windows Server or SQL Server images.     //  *    https://cloud.google.com/compute/docs/images#os-compute-support     String sourceImageFamily = "windows-2022";      // Instantiates a client.     try (InstancesClient instancesClient = InstancesClient.create()) {        AttachedDisk attachedDisk = AttachedDisk.newBuilder()           // Describe the size and source image of the boot disk to attach to the instance.           .setInitializeParams(AttachedDiskInitializeParams.newBuilder()               .setDiskSizeGb(64)               .setSourceImage(                   String.format("projects/windows-cloud/global/images/family/%s",                       sourceImageFamily))               .build())           .setAutoDelete(true)           .setBoot(true)           .setType(AttachedDisk.Type.PERSISTENT.toString())           .build();        Instance instance = Instance.newBuilder()           .setName(instanceName)           .setMachineType(String.format("zones/%s/machineTypes/%s", zone, machineType))           .addDisks(attachedDisk)           .addNetworkInterfaces(NetworkInterface.newBuilder()               .addAccessConfigs(AccessConfig.newBuilder()                   .setType("ONE_TO_ONE_NAT")                   .setName("External NAT")                   .build())               // If you're going to use a custom VPC network, it must be configured               // to allow access to kms.windows.googlecloud.com.               // https://cloud.google.com/compute/docs/instances/windows/creating-managing-windows-instances#kms-server.               .setName("global/networks/default")               .build())           // If you chose an image that supports Shielded VM, you can optionally change the           // instance's Shielded VM settings.           // .setShieldedInstanceConfig(ShieldedInstanceConfig.newBuilder()           //    .setEnableSecureBoot(true)           //    .setEnableVtpm(true)           //    .setEnableIntegrityMonitoring(true)           //    .build())           .build();        InsertInstanceRequest request = InsertInstanceRequest.newBuilder()           .setProject(projectId)           .setZone(zone)           .setInstanceResource(instance)           .build();        // Wait for the operation to complete.       Operation operation = instancesClient.insertAsync(request).get(5, TimeUnit.MINUTES);        if (operation.hasError()) {         System.out.printf("Error in creating instance %s", operation.getError());         return;       }        System.out.printf("Instance created %s", instanceName);     }   } }

    Node.js

    /**  * 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 machineType = 'n1-standard-1'; // const sourceImageFamily = 'windows-2022';  const compute = require('@google-cloud/compute');  async function createWindowsServerInstanceExpernalIP() {   const instancesClient = new compute.InstancesClient();    const [response] = await instancesClient.insert({     instanceResource: {       name: instanceName,       disks: [         {           // Describe the size and source image of the boot disk to attach to the instance.           initializeParams: {             diskSizeGb: '64',             sourceImage: `projects/windows-cloud/global/images/family/${sourceImageFamily}/`,           },           autoDelete: true,           boot: true,           type: 'PERSISTENT',         },       ],       machineType: `zones/${zone}/machineTypes/${machineType}`,       networkInterfaces: [         {           accessConfigs: [             {               type: 'ONE_TO_ONE_NAT',               name: 'External NAT',             },           ],           // If you are using a custom VPC network it must be configured to allow access to kms.windows.googlecloud.com.           // https://cloud.google.com/compute/docs/instances/windows/creating-managing-windows-instances#kms-server.           name: 'global/networks/default',         },       ],       // If you chose an image that supports Shielded VM, you can optionally change the instance's Shielded VM settings.       // "shieldedInstanceConfig": {       //   "enableSecureBoot": true,       //   "enableVtpm": true,       //   "enableIntegrityMonitoring": true       // },     },     project: projectId,     zone,   });   let operation = response.latestResponse;   const operationsClient = new compute.ZoneOperationsClient();    // Wait for the create operation to complete.   while (operation.status !== 'DONE') {     [operation] = await operationsClient.wait({       operation: operation.name,       project: projectId,       zone: operation.zone.split('/').pop(),     });   }    console.log('Instance created.'); }  createWindowsServerInstanceExpernalIP();

    Python

    from __future__ import annotations  import re import sys from typing import Any import warnings  from google.api_core.extended_operation import ExtendedOperation from google.cloud import compute_v1   def get_image_from_family(project: str, family: str) -> compute_v1.Image:     """     Retrieve the newest image that is part of a given family in a project.      Args:         project: project ID or project number of the Cloud project you want to get image from.         family: name of the image family you want to get image from.      Returns:         An Image object.     """     image_client = compute_v1.ImagesClient()     # List of public operating system (OS) images: https://cloud.google.com/compute/docs/images/os-details     newest_image = image_client.get_from_family(project=project, family=family)     return newest_image   def disk_from_image(     disk_type: str,     disk_size_gb: int,     boot: bool,     source_image: str,     auto_delete: bool = True, ) -> compute_v1.AttachedDisk:     """     Create an AttachedDisk object to be used in VM instance creation. Uses an image as the     source for the new disk.      Args:          disk_type: the type of disk you want to create. This value uses the following format:             "zones/{zone}/diskTypes/(pd-standard|pd-ssd|pd-balanced|pd-extreme)".             For example: "zones/us-west3-b/diskTypes/pd-ssd"         disk_size_gb: size of the new disk in gigabytes         boot: boolean flag indicating whether this disk should be used as a boot disk of an instance         source_image: source image to use when creating this disk. You must have read access to this disk. This can be one             of the publicly available images or an image from one of your projects.             This value uses the following format: "projects/{project_name}/global/images/{image_name}"         auto_delete: boolean flag indicating whether this disk should be deleted with the VM that uses it      Returns:         AttachedDisk object configured to be created using the specified image.     """     boot_disk = compute_v1.AttachedDisk()     initialize_params = compute_v1.AttachedDiskInitializeParams()     initialize_params.source_image = source_image     initialize_params.disk_size_gb = disk_size_gb     initialize_params.disk_type = disk_type     boot_disk.initialize_params = initialize_params     # Remember to set auto_delete to True if you want the disk to be deleted when you delete     # your VM instance.     boot_disk.auto_delete = auto_delete     boot_disk.boot = boot     return boot_disk   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 create_instance(     project_id: str,     zone: str,     instance_name: str,     disks: list[compute_v1.AttachedDisk],     machine_type: str = "n1-standard-1",     network_link: str = "global/networks/default",     subnetwork_link: str = None,     internal_ip: str = None,     external_access: bool = False,     external_ipv4: str = None,     accelerators: list[compute_v1.AcceleratorConfig] = None,     preemptible: bool = False,     spot: bool = False,     instance_termination_action: str = "STOP",     custom_hostname: str = None,     delete_protection: bool = False, ) -> compute_v1.Instance:     """     Send an instance creation request to the Compute Engine API and wait for it to complete.      Args:         project_id: project ID or project number of the Cloud project you want to use.         zone: name of the zone to create the instance in. For example: "us-west3-b"         instance_name: name of the new virtual machine (VM) instance.         disks: a list of compute_v1.AttachedDisk objects describing the disks             you want to attach to your new instance.         machine_type: machine type of the VM being created. This value uses the             following format: "zones/{zone}/machineTypes/{type_name}".             For example: "zones/europe-west3-c/machineTypes/f1-micro"         network_link: name of the network you want the new instance to use.             For example: "global/networks/default" represents the network             named "default", which is created automatically for each project.         subnetwork_link: name of the subnetwork you want the new instance to use.             This value uses the following format:             "regions/{region}/subnetworks/{subnetwork_name}"         internal_ip: internal IP address you want to assign to the new instance.             By default, a free address from the pool of available internal IP addresses of             used subnet will be used.         external_access: boolean flag indicating if the instance should have an external IPv4             address assigned.         external_ipv4: external IPv4 address to be assigned to this instance. If you specify             an external IP address, it must live in the same region as the zone of the instance.             This setting requires `external_access` to be set to True to work.         accelerators: a list of AcceleratorConfig objects describing the accelerators that will             be attached to the new instance.         preemptible: boolean value indicating if the new instance should be preemptible             or not. Preemptible VMs have been deprecated and you should now use Spot VMs.         spot: boolean value indicating if the new instance should be a Spot VM or not.         instance_termination_action: What action should be taken once a Spot VM is terminated.             Possible values: "STOP", "DELETE"         custom_hostname: Custom hostname of the new VM instance.             Custom hostnames must conform to RFC 1035 requirements for valid hostnames.         delete_protection: boolean value indicating if the new virtual machine should be             protected against deletion or not.     Returns:         Instance object.     """     instance_client = compute_v1.InstancesClient()      # Use the network interface provided in the network_link argument.     network_interface = compute_v1.NetworkInterface()     network_interface.network = network_link     if subnetwork_link:         network_interface.subnetwork = subnetwork_link      if internal_ip:         network_interface.network_i_p = internal_ip      if external_access:         access = compute_v1.AccessConfig()         access.type_ = compute_v1.AccessConfig.Type.ONE_TO_ONE_NAT.name         access.name = "External NAT"         access.network_tier = access.NetworkTier.PREMIUM.name         if external_ipv4:             access.nat_i_p = external_ipv4         network_interface.access_configs = [access]      # Collect information into the Instance object.     instance = compute_v1.Instance()     instance.network_interfaces = [network_interface]     instance.name = instance_name     instance.disks = disks     if re.match(r"^zones/[a-z\d\-]+/machineTypes/[a-z\d\-]+$", machine_type):         instance.machine_type = machine_type     else:         instance.machine_type = f"zones/{zone}/machineTypes/{machine_type}"      instance.scheduling = compute_v1.Scheduling()     if accelerators:         instance.guest_accelerators = accelerators         instance.scheduling.on_host_maintenance = (             compute_v1.Scheduling.OnHostMaintenance.TERMINATE.name         )      if preemptible:         # Set the preemptible setting         warnings.warn(             "Preemptible VMs are being replaced by Spot VMs.", DeprecationWarning         )         instance.scheduling = compute_v1.Scheduling()         instance.scheduling.preemptible = True      if spot:         # Set the Spot VM setting         instance.scheduling.provisioning_model = (             compute_v1.Scheduling.ProvisioningModel.SPOT.name         )         instance.scheduling.instance_termination_action = instance_termination_action      if custom_hostname is not None:         # Set the custom hostname for the instance         instance.hostname = custom_hostname      if delete_protection:         # Set the delete protection bit         instance.deletion_protection = True      # Prepare the request to insert an instance.     request = compute_v1.InsertInstanceRequest()     request.zone = zone     request.project = project_id     request.instance_resource = instance      # Wait for the create operation to complete.     print(f"Creating the {instance_name} instance in {zone}...")      operation = instance_client.insert(request=request)      wait_for_extended_operation(operation, "instance creation")      print(f"Instance {instance_name} created.")     return instance_client.get(project=project_id, zone=zone, instance=instance_name)   def create_windows_instance(     project_id: str,     zone: str,     instance_name: str,     machine_type: str,     source_image_family: str = "windows-2022",     network_link: str = "global/networks/default",     subnetwork_link: str | None = None, ) -> compute_v1.Instance:     """     Creates a new Windows Server instance that has only an internal IP address.      Args:         project_id: project ID or project number of the Cloud project you want to use.         zone: name of the zone to create the instance in. For example: "us-west3-b"         instance_name: name of the new virtual machine (VM) instance.         machine_type: machine type you want to create in following format:             "zones/{zone}/machineTypes/{type_name}". For example:             "zones/europe-west3-c/machineTypes/f1-micro"             You can find the list of available machine types using:             https://cloud.google.com/sdk/gcloud/reference/compute/machine-types/list         source_image_family: name of the public image family for Windows Server or SQL Server images.             https://cloud.google.com/compute/docs/images#os-compute-support         network_link: name of the network you want the new instance to use.             For example: "global/networks/default" represents the network             named "default", which is created automatically for each project.         subnetwork_link: name of the subnetwork you want the new instance to use.             This value uses the following format:            "regions/{region}/subnetworks/{subnetwork_name}"      Returns:         Instance object.     """     if subnetwork_link is None:         subnetwork_link = f"regions/{zone}/subnetworks/default"      base_image = get_image_from_family(         project="windows-cloud", family=source_image_family     )     disk_type = f"zones/{zone}/diskTypes/pd-standard"     disks = [disk_from_image(disk_type, 100, True, base_image.self_link, True)]      # You must verify or configure routes and firewall rules in your VPC network     # to allow access to kms.windows.googlecloud.com.     # More information about access to kms.windows.googlecloud.com: https://cloud.google.com/compute/docs/instances/windows/creating-managing-windows-instances#kms-server      # Additionally, you must enable Private Google Access for subnets in your VPC network     # that contain Windows instances with only internal IP addresses.     # More information about Private Google Access: https://cloud.google.com/vpc/docs/configure-private-google-access#enabling      instance = create_instance(         project_id,         zone,         instance_name,         disks,         machine_type=machine_type,         network_link=network_link,         subnetwork_link=subnetwork_link,         external_access=True,  # Set this to False to disable external IP for your instance     )     return instance  

    REST

    Para crear una instancia con la API, debes incluir la propiedad initializeParams en la solicitud de creación de la instancia y especificar una imagen de Windows. Por ejemplo, el cuerpo de la solicitud podría verse así:

    instance = {   "name": "INSTANCE_NAME",   "machineType": "zones/ZONE/machineTypes/MACHINE_TYPE",   "disks": [{       "boot": "true",       "type": "PERSISTENT",       "initializeParams": {          "diskName": "DISK_NAME",          "sourceImage": "https://www.googleapis.com/compute/v1/projects/windows-cloud/global/images/family/IMAGE_FAMILY",          "diskSizeGb": "BOOT_DISK_SIZE",          "diskType": "BOOT_DISK_TYPE",        }     }],   "networkInterfaces": [{     "accessConfigs": [{       "type": "ONE_TO_ONE_NAT",       "name": "External NAT"      }],     "network": "global/networks/default"   }],   "serviceAccounts": [{        "email": DEFAULT_SERVICE_EMAIL,        "scopes": DEFAULT_SCOPES   }] }

    Reemplaza los siguientes marcadores de posición por valores válidos:

    • INSTANCE_NAME: Es el nombre de la instancia nueva.
    • IMAGE_FAMILY: Es una de las familias de imágenes públicas de las imágenes de Windows Server o SQL Server.
    • ZONE: Es la zona de esta instancia.
    • MACHINE_TYPE: Es uno de los tipos de máquina disponibles.
    • BOOT_DISK_SIZE: Es el tamaño del disco de arranque en GiB. Los discos más grandes tienen una mayor capacidad de procesamiento.
    • BOOT_DISK_TYPE: Es el tipo de disco de arranque de la instancia, por ejemplo, hyperdisk-balanced o pd-ssd.

    Si eliges una imagen compatible con una VM protegida, puedes cambiar de manera opcional la configuración de VM protegida de la instancia con los siguientes elementos del cuerpo de solicitud booleana:

    • enableSecureBoot: habilita o inhabilita el inicio seguro. El inicio seguro ayuda a proteger las instancias de VM del software malicioso y los rootkits de nivel de inicio y kernel. Para obtener más información, consulta la documentación sobre el inicio seguro.
    • enableVtpm: habilita o inhabilita el módulo de plataforma segura virtual (vTPM). vTPM habilita el inicio medido, que valida la integridad previa al inicio y la integridad de inicio de la VM. Para obtener más información, consulta la documentación sobre el Módulo de plataforma segura virtual (vTPM).

    • enableIntegrityMonitoring: habilita o inhabilita la supervisión de integridad. Esta función te permite supervisar y verificar la integridad de inicio del entorno de ejecución de las instancias de VM protegida mediante informes de Cloud Monitoring. Para obtener más información, consulta la documentación sobre la supervisión de integridad.

    Para obtener más información sobre cómo crear una instancia, consulta la documentación del método instances.insert().

    Después de crear la instancia de Windows o SQL Server, debes establecer la contraseña inicial de la instancia para que puedas conectarte a la instancia a través de RDP.

    Además, puedes unir la VM a un dominio de Microsoft AD administrado mientras creas la VM o después de crearla. Para obtener más información, consulta Une una VM de Windows automáticamente a un dominio.

    Crea una instancia de Windows Server que use una dirección IP interna para la activación

    Antes de crear una instancia de Windows Server que solo tenga una dirección IP interna, debes verificar o configurar rutas y reglas de firewall en tu red de VPC para permitir el acceso a kms.windows.googlecloud.com. Además, debes habilitar el Acceso privado a Google para las subredes en tu red de VPC que contengan instancias de Windows solo con direcciones IP internas.

    gcloud

    Cuando creas una instancia nueva con gcloud CLI, puedes usar la marca --no-address para asegurarte de que no se le asigne una dirección IP externa:

     gcloud compute instances create INSTANCE_NAME --network NETWORK_NAME \  --subnet SUBNET_NAME \  --no-address \  --zone ZONE \  --image-project windows-cloud \  --image-family IMAGE_FAMILY \  --machine-type MACHINE_TYPE \  --boot-disk-size BOOT_DISK_SIZE \  --boot-disk-type BOOT_DISK_TYPE 

    Reemplaza los siguientes marcadores de posición por valores válidos:

    • INSTANCE_NAME: Es el nombre de la instancia nueva.
    • SUBNET_NAME: Es el nombre de la subred en la red de VPC que usará la instancia. La subred debe estar en la misma región que la zona que elijas para la instancia.
    • IMAGE_FAMILY: Es una de las familias de imágenes públicas para imágenes de Windows Server.
    • MACHINE_TYPE: Es uno de los tipos de máquina disponibles.
    • BOOT_DISK_SIZE: Es el tamaño del disco de arranque en GiB. Los discos más grandes tienen una mayor capacidad de procesamiento.
    • BOOT_DISK_TYPE: Es el tipo de disco de arranque de la instancia. Por ejemplo, hyperdisk-balanced o pd-ssd.

    Go

    import ( 	"context" 	"fmt" 	"io"  	compute "cloud.google.com/go/compute/apiv1" 	computepb "cloud.google.com/go/compute/apiv1/computepb" 	"google.golang.org/protobuf/proto" )  // createWndowsServerInstanceInternalIP creates a new Windows Server instance // that has only an internal IP address. func createWndowsServerInstanceInternalIP( 	w io.Writer, 	projectID, zone, instanceName, machineType, sourceImageFamily, networkLink, subnetworkLink string, ) error { 	// projectID := "your_project_id" 	// zone := "europe-central2-b" 	// instanceName := "your_instance_name" 	// machineType := "n1-standard-1" 	// sourceImageFamily := "windows-2022" 	// networkLink := "global/networks/default" 	// subnetworkLink := "regions/europe-central2/subnetworks/default"  	ctx := context.Background() 	instancesClient, err := compute.NewInstancesRESTClient(ctx) 	if err != nil { 		return fmt.Errorf("NewInstancesRESTClient: %w", err) 	} 	defer instancesClient.Close()  	disk := &computepb.AttachedDisk{ 		// Describe the size and source image of the boot disk to attach to the instance. 		InitializeParams: &computepb.AttachedDiskInitializeParams{ 			DiskSizeGb: proto.Int64(64), 			SourceImage: proto.String( 				fmt.Sprintf( 					"projects/windows-cloud/global/images/family/%s", 					sourceImageFamily, 				), 			), 		}, 		AutoDelete: proto.Bool(true), 		Boot:       proto.Bool(true), 	}  	network := &computepb.NetworkInterface{ 		// You must verify or configure routes and firewall rules in your VPC network 		// to allow access to kms.windows.googlecloud.com. 		// More information about access to kms.windows.googlecloud.com: 		// https://cloud.google.com/compute/docs/instances/windows/creating-managing-windows-instances#kms-server  		// Additionally, you must enable Private Google Access for subnets in your VPC network 		// that contain Windows instances with only internal IP addresses. 		// More information about Private Google Access: 		// https://cloud.google.com/vpc/docs/configure-private-google-access#enabling 		Name:       proto.String(networkLink), 		Subnetwork: proto.String(subnetworkLink), 	}  	inst := &computepb.Instance{ 		Name: proto.String(instanceName), 		Disks: []*computepb.AttachedDisk{ 			disk, 		}, 		MachineType: proto.String(fmt.Sprintf("zones/%s/machineTypes/%s", zone, machineType)), 		NetworkInterfaces: []*computepb.NetworkInterface{ 			network, 		}, 		// If you chose an image that supports Shielded VM, 		// you can optionally change the instance's Shielded VM settings. 		// ShieldedInstanceConfig: &computepb.ShieldedInstanceConfig{ 		// 	EnableSecureBoot: proto.Bool(true), 		// 	EnableVtpm: proto.Bool(true), 		// 	EnableIntegrityMonitoring: proto.Bool(true), 		// }, 	}  	req := &computepb.InsertInstanceRequest{ 		Project:          projectID, 		Zone:             zone, 		InstanceResource: inst, 	}  	op, err := instancesClient.Insert(ctx, req) 	if err != nil { 		return fmt.Errorf("unable to create instance: %w", err) 	}  	if err = op.Wait(ctx); err != nil { 		return fmt.Errorf("unable to wait for the operation: %w", err) 	}  	fmt.Fprintf(w, "Instance created\n")  	return nil } 

    Java

     import com.google.cloud.compute.v1.AttachedDisk; import com.google.cloud.compute.v1.AttachedDiskInitializeParams; import com.google.cloud.compute.v1.InsertInstanceRequest; import com.google.cloud.compute.v1.Instance; import com.google.cloud.compute.v1.InstancesClient; import com.google.cloud.compute.v1.NetworkInterface; 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 CreateWindowsServerInstanceInternalIp {    public static void main(String[] args)       throws IOException, ExecutionException, InterruptedException, TimeoutException {     // TODO(developer): Replace these variables before running the sample.     // projectId - ID or number of the project you want to use.     String projectId = "your-google-cloud-project-id";      // zone - Name of the zone you want to use, for example: us-west3-b     String zone = "europe-central2-b";      // instanceName - Name of the new machine.     String instanceName = "instance-name";      // networkLink - Name of the network you want the new instance to use.     //  *   For example: "global/networks/default" represents the network     //  *   named "default", which is created automatically for each project.     String networkLink = "global/networks/default";      // subnetworkLink - Name of the subnetwork you want the new instance to use.     //  *   This value uses the following format:     //  *   "regions/{region}/subnetworks/{subnetwork_name}"     String subnetworkLink = "regions/europe-central2/subnetworks/default";      createWindowsServerInstanceInternalIp(projectId, zone, instanceName, networkLink,         subnetworkLink);   }    // Creates a new Windows Server instance that has only an internal IP address.   public static void createWindowsServerInstanceInternalIp(String projectId, String zone,       String instanceName, String networkLink, String subnetworkLink)       throws IOException, ExecutionException, InterruptedException, TimeoutException {      // machineType - Machine type you want to create in following format:     //  *    "zones/{zone}/machineTypes/{type_name}". For example:     //  *    "zones/europe-west3-c/machineTypes/f1-micro"     //  *    You can find the list of available machine types using:     //  *    https://cloud.google.com/sdk/gcloud/reference/compute/machine-types/list     String machineType = "n1-standard-1";     // sourceImageFamily - Name of the public image family for Windows Server or SQL Server images.     //  *    https://cloud.google.com/compute/docs/images#os-compute-support     String sourceImageFamily = "windows-2022";      // Instantiates a client.     try (InstancesClient instancesClient = InstancesClient.create()) {        AttachedDisk attachedDisk = AttachedDisk.newBuilder()           // Describe the size and source image of the boot disk to attach to the instance.           .setInitializeParams(AttachedDiskInitializeParams.newBuilder()               .setDiskSizeGb(64)               .setSourceImage(                   String.format("projects/windows-cloud/global/images/family/%s",                       sourceImageFamily))               .build())           .setAutoDelete(true)           .setBoot(true)           .setType(AttachedDisk.Type.PERSISTENT.toString())           .build();        Instance instance = Instance.newBuilder()           .setName(instanceName)           .setMachineType(String.format("zones/%s/machineTypes/%s", zone, machineType))           .addDisks(attachedDisk)           .addNetworkInterfaces(NetworkInterface.newBuilder()               // You must verify or configure routes and firewall rules in your VPC network               // to allow access to kms.windows.googlecloud.com.               // More information about access to kms.windows.googlecloud.com: https://cloud.google.com/compute/docs/instances/windows/creating-managing-windows-instances#kms-server                // Additionally, you must enable Private Google Access for subnets in your VPC network               // that contain Windows instances with only internal IP addresses.               // More information about Private Google Access: https://cloud.google.com/vpc/docs/configure-private-google-access#enabling               .setName(networkLink)               .setSubnetwork(subnetworkLink)               .build())           // If you chose an image that supports Shielded VM, you can optionally change the           // instance's Shielded VM settings.           // .setShieldedInstanceConfig(ShieldedInstanceConfig.newBuilder()           //    .setEnableSecureBoot(true)           //    .setEnableVtpm(true)           //    .setEnableIntegrityMonitoring(true)           //    .build())           .build();        InsertInstanceRequest request = InsertInstanceRequest.newBuilder()           .setProject(projectId)           .setZone(zone)           .setInstanceResource(instance)           .build();        // Wait for the operation to complete.       Operation operation = instancesClient.insertAsync(request).get(5, TimeUnit.MINUTES);        if (operation.hasError()) {         System.out.printf("Error in creating instance %s", operation.getError());         return;       }        System.out.printf("Instance created %s", instanceName);     }   } }

    Node.js

    /**  * 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 machineType = 'n1-standard-1'; // const sourceImageFamily = 'windows-2022'; // const networkLink = 'global/networks/default'; // const subnetworkLink = 'regions/europe-central2/subnetworks/default';  const compute = require('@google-cloud/compute');  async function createWindowsServerInstanceInternalIP() {   const instancesClient = new compute.InstancesClient();    const [response] = await instancesClient.insert({     instanceResource: {       name: instanceName,       disks: [         {           // Describe the size and source image of the boot disk to attach to the instance.           initializeParams: {             diskSizeGb: '64',             sourceImage: `projects/windows-cloud/global/images/family/${sourceImageFamily}/`,           },           autoDelete: true,           boot: true,           type: 'PERSISTENT',         },       ],       machineType: `zones/${zone}/machineTypes/${machineType}`,       networkInterfaces: [         {           // You must verify or configure routes and firewall rules in your VPC network           // to allow access to kms.windows.googlecloud.com.           // More information about access to kms.windows.googlecloud.com: https://cloud.google.com/compute/docs/instances/windows/creating-managing-windows-instances#kms-server            // Additionally, you must enable Private Google Access for subnets in your VPC network           // that contain Windows instances with only internal IP addresses.           // More information about Private Google Access: https://cloud.google.com/vpc/docs/configure-private-google-access#enabling           name: networkLink,           subnetwork: subnetworkLink,         },       ],       // If you chose an image that supports Shielded VM, you can optionally change the instance's Shielded VM settings.       // "shieldedInstanceConfig": {       //   "enableSecureBoot": true,       //   "enableVtpm": true,       //   "enableIntegrityMonitoring": true       // },     },     project: projectId,     zone,   });   let operation = response.latestResponse;   const operationsClient = new compute.ZoneOperationsClient();    // Wait for the create operation to complete.   while (operation.status !== 'DONE') {     [operation] = await operationsClient.wait({       operation: operation.name,       project: projectId,       zone: operation.zone.split('/').pop(),     });   }    console.log('Instance created.'); }  createWindowsServerInstanceInternalIP();

    Python

    from __future__ import annotations  import re import sys from typing import Any import warnings  from google.api_core.extended_operation import ExtendedOperation from google.cloud import compute_v1   def get_image_from_family(project: str, family: str) -> compute_v1.Image:     """     Retrieve the newest image that is part of a given family in a project.      Args:         project: project ID or project number of the Cloud project you want to get image from.         family: name of the image family you want to get image from.      Returns:         An Image object.     """     image_client = compute_v1.ImagesClient()     # List of public operating system (OS) images: https://cloud.google.com/compute/docs/images/os-details     newest_image = image_client.get_from_family(project=project, family=family)     return newest_image   def disk_from_image(     disk_type: str,     disk_size_gb: int,     boot: bool,     source_image: str,     auto_delete: bool = True, ) -> compute_v1.AttachedDisk:     """     Create an AttachedDisk object to be used in VM instance creation. Uses an image as the     source for the new disk.      Args:          disk_type: the type of disk you want to create. This value uses the following format:             "zones/{zone}/diskTypes/(pd-standard|pd-ssd|pd-balanced|pd-extreme)".             For example: "zones/us-west3-b/diskTypes/pd-ssd"         disk_size_gb: size of the new disk in gigabytes         boot: boolean flag indicating whether this disk should be used as a boot disk of an instance         source_image: source image to use when creating this disk. You must have read access to this disk. This can be one             of the publicly available images or an image from one of your projects.             This value uses the following format: "projects/{project_name}/global/images/{image_name}"         auto_delete: boolean flag indicating whether this disk should be deleted with the VM that uses it      Returns:         AttachedDisk object configured to be created using the specified image.     """     boot_disk = compute_v1.AttachedDisk()     initialize_params = compute_v1.AttachedDiskInitializeParams()     initialize_params.source_image = source_image     initialize_params.disk_size_gb = disk_size_gb     initialize_params.disk_type = disk_type     boot_disk.initialize_params = initialize_params     # Remember to set auto_delete to True if you want the disk to be deleted when you delete     # your VM instance.     boot_disk.auto_delete = auto_delete     boot_disk.boot = boot     return boot_disk   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 create_instance(     project_id: str,     zone: str,     instance_name: str,     disks: list[compute_v1.AttachedDisk],     machine_type: str = "n1-standard-1",     network_link: str = "global/networks/default",     subnetwork_link: str = None,     internal_ip: str = None,     external_access: bool = False,     external_ipv4: str = None,     accelerators: list[compute_v1.AcceleratorConfig] = None,     preemptible: bool = False,     spot: bool = False,     instance_termination_action: str = "STOP",     custom_hostname: str = None,     delete_protection: bool = False, ) -> compute_v1.Instance:     """     Send an instance creation request to the Compute Engine API and wait for it to complete.      Args:         project_id: project ID or project number of the Cloud project you want to use.         zone: name of the zone to create the instance in. For example: "us-west3-b"         instance_name: name of the new virtual machine (VM) instance.         disks: a list of compute_v1.AttachedDisk objects describing the disks             you want to attach to your new instance.         machine_type: machine type of the VM being created. This value uses the             following format: "zones/{zone}/machineTypes/{type_name}".             For example: "zones/europe-west3-c/machineTypes/f1-micro"         network_link: name of the network you want the new instance to use.             For example: "global/networks/default" represents the network             named "default", which is created automatically for each project.         subnetwork_link: name of the subnetwork you want the new instance to use.             This value uses the following format:             "regions/{region}/subnetworks/{subnetwork_name}"         internal_ip: internal IP address you want to assign to the new instance.             By default, a free address from the pool of available internal IP addresses of             used subnet will be used.         external_access: boolean flag indicating if the instance should have an external IPv4             address assigned.         external_ipv4: external IPv4 address to be assigned to this instance. If you specify             an external IP address, it must live in the same region as the zone of the instance.             This setting requires `external_access` to be set to True to work.         accelerators: a list of AcceleratorConfig objects describing the accelerators that will             be attached to the new instance.         preemptible: boolean value indicating if the new instance should be preemptible             or not. Preemptible VMs have been deprecated and you should now use Spot VMs.         spot: boolean value indicating if the new instance should be a Spot VM or not.         instance_termination_action: What action should be taken once a Spot VM is terminated.             Possible values: "STOP", "DELETE"         custom_hostname: Custom hostname of the new VM instance.             Custom hostnames must conform to RFC 1035 requirements for valid hostnames.         delete_protection: boolean value indicating if the new virtual machine should be             protected against deletion or not.     Returns:         Instance object.     """     instance_client = compute_v1.InstancesClient()      # Use the network interface provided in the network_link argument.     network_interface = compute_v1.NetworkInterface()     network_interface.network = network_link     if subnetwork_link:         network_interface.subnetwork = subnetwork_link      if internal_ip:         network_interface.network_i_p = internal_ip      if external_access:         access = compute_v1.AccessConfig()         access.type_ = compute_v1.AccessConfig.Type.ONE_TO_ONE_NAT.name         access.name = "External NAT"         access.network_tier = access.NetworkTier.PREMIUM.name         if external_ipv4:             access.nat_i_p = external_ipv4         network_interface.access_configs = [access]      # Collect information into the Instance object.     instance = compute_v1.Instance()     instance.network_interfaces = [network_interface]     instance.name = instance_name     instance.disks = disks     if re.match(r"^zones/[a-z\d\-]+/machineTypes/[a-z\d\-]+$", machine_type):         instance.machine_type = machine_type     else:         instance.machine_type = f"zones/{zone}/machineTypes/{machine_type}"      instance.scheduling = compute_v1.Scheduling()     if accelerators:         instance.guest_accelerators = accelerators         instance.scheduling.on_host_maintenance = (             compute_v1.Scheduling.OnHostMaintenance.TERMINATE.name         )      if preemptible:         # Set the preemptible setting         warnings.warn(             "Preemptible VMs are being replaced by Spot VMs.", DeprecationWarning         )         instance.scheduling = compute_v1.Scheduling()         instance.scheduling.preemptible = True      if spot:         # Set the Spot VM setting         instance.scheduling.provisioning_model = (             compute_v1.Scheduling.ProvisioningModel.SPOT.name         )         instance.scheduling.instance_termination_action = instance_termination_action      if custom_hostname is not None:         # Set the custom hostname for the instance         instance.hostname = custom_hostname      if delete_protection:         # Set the delete protection bit         instance.deletion_protection = True      # Prepare the request to insert an instance.     request = compute_v1.InsertInstanceRequest()     request.zone = zone     request.project = project_id     request.instance_resource = instance      # Wait for the create operation to complete.     print(f"Creating the {instance_name} instance in {zone}...")      operation = instance_client.insert(request=request)      wait_for_extended_operation(operation, "instance creation")      print(f"Instance {instance_name} created.")     return instance_client.get(project=project_id, zone=zone, instance=instance_name)   def create_windows_instance(     project_id: str,     zone: str,     instance_name: str,     machine_type: str,     source_image_family: str = "windows-2022",     network_link: str = "global/networks/default",     subnetwork_link: str | None = None, ) -> compute_v1.Instance:     """     Creates a new Windows Server instance that has only an internal IP address.      Args:         project_id: project ID or project number of the Cloud project you want to use.         zone: name of the zone to create the instance in. For example: "us-west3-b"         instance_name: name of the new virtual machine (VM) instance.         machine_type: machine type you want to create in following format:             "zones/{zone}/machineTypes/{type_name}". For example:             "zones/europe-west3-c/machineTypes/f1-micro"             You can find the list of available machine types using:             https://cloud.google.com/sdk/gcloud/reference/compute/machine-types/list         source_image_family: name of the public image family for Windows Server or SQL Server images.             https://cloud.google.com/compute/docs/images#os-compute-support         network_link: name of the network you want the new instance to use.             For example: "global/networks/default" represents the network             named "default", which is created automatically for each project.         subnetwork_link: name of the subnetwork you want the new instance to use.             This value uses the following format:            "regions/{region}/subnetworks/{subnetwork_name}"      Returns:         Instance object.     """     if subnetwork_link is None:         subnetwork_link = f"regions/{zone}/subnetworks/default"      base_image = get_image_from_family(         project="windows-cloud", family=source_image_family     )     disk_type = f"zones/{zone}/diskTypes/pd-standard"     disks = [disk_from_image(disk_type, 100, True, base_image.self_link, True)]      # You must verify or configure routes and firewall rules in your VPC network     # to allow access to kms.windows.googlecloud.com.     # More information about access to kms.windows.googlecloud.com: https://cloud.google.com/compute/docs/instances/windows/creating-managing-windows-instances#kms-server      # Additionally, you must enable Private Google Access for subnets in your VPC network     # that contain Windows instances with only internal IP addresses.     # More information about Private Google Access: https://cloud.google.com/vpc/docs/configure-private-google-access#enabling      instance = create_instance(         project_id,         zone,         instance_name,         disks,         machine_type=machine_type,         network_link=network_link,         subnetwork_link=subnetwork_link,         external_access=True,  # Set this to False to disable external IP for your instance     )     return instance  

    Debido a que esta instancia no tiene una dirección IP externa, no puedes conectarte directamente a ella a través de Internet. Puedes conectarte desde otra red conectada a tu red de VPC mediante Cloud Interconnect o Cloud VPN, o bien puedes conectarte primero a una instancia de bastión mediante RDP y, luego, conectarte a la instancia que solo tiene una dirección IP interna.

    Además, puedes unir la VM a un dominio de Microsoft AD administrado mientras creas la VM o después de crearla. Para obtener más información, consulta Une una VM de Windows automáticamente a un dominio.

    Configura el acceso con kms.windows.googlecloud.com

    Para la activación y renovación de Windows, tu red de VPC debe cumplir con los siguientes requisitos de reglas de enrutamiento y firewall.

    Requisitos de enrutamiento

    Las instancias de Windows deben poder alcanzar a kms.windows.googlecloud.com (35.190.247.13 o 2001:4860:4802:32::86) a través de una ruta cuyo próximo salto sea la puerta de enlace de Internet predeterminada. No puedes activar instancias de Windows con una puerta de enlace NAT basada en instancias o Cloud NAT porque kms.windows.googlecloud.com rechaza las solicitudes de activación de direcciones IP que no están confirmadas como instancias de Compute Engine.

    Puedes usar la ruta predeterminada en tu red de VPC para enrutar el tráfico de manera directa a kms.windows.googlecloud.com. Si quitas esta ruta o planeas hacerlo en el futuro, debes crear una ruta estática personalizada con el destino 35.190.247.13 o 2001:4860:4802:32::86 y el siguiente salto configurado como puerta de enlace de Internet predeterminada, de la siguiente manera:

    Solo IPv4

     gcloud compute routes create mskms-ipv4-route-ipv4-network \     --destination-range=35.190.247.13/32 \     --network=ipv4-network \     --next-hop-gateway=default-internet-gateway 

    Pila doble

     gcloud compute routes create mskms-ipv4-route-ipv4-network \     --destination-range=35.190.247.13/32 \     --network=ipv4-network \     --next-hop-gateway=default-internet-gateway 
     gcloud compute routes create mskms-ipv6-route-ipv6-network \     --destination-range=2001:4860:4802:32::86/128 \     --network=ipv6-network \     --next-hop-gateway=default-internet-gateway 

    Solo IPv6

     gcloud compute routes create mskms-ipv6-route-ipv6-network \     --destination-range=2001:4860:4802:32::86/128 \     --network=ipv6-network \     --next-hop-gateway=default-internet-gateway 

    Reemplaza ipv4-network o ipv6-network por el nombre de tu red de VPC.

    La ruta predeterminada o una ruta estática personalizada permiten que las instancias con direcciones IP externas lleguen a kms.windows.googlecloud.com. Si tienes instancias de Windows sin direcciones IP externas o con Cloud NAT, también debes habilitar el Acceso privado a Google para que las instancias que solo tengan direcciones IP internas puedan enviar tráfico a la dirección IP externa de kms.windows.googlecloud.com (35.190.247.13 o 2001:4860:4802:32::86).

    Requisitos de las reglas de firewall

    La regla de firewall implícita de permiso de salida permite que las instancias realicen solicitudes y reciban respuestas establecidas. A menos que crees reglas de firewall personalizadas que nieguen la salida, las instancias de Windows pueden comunicarse con kms.windows.googlecloud.com.

    Si personalizas las reglas de firewall, se recomienda que crees una regla de permiso de salida de alta prioridad que permita la comunicación con 35.190.247.13 o 2001:4860:4802:32::86 de manera explícita. De esta manera, a medida que modificas las reglas de firewall, no inhabilitarás la activación de Windows por accidente.

    En los ejemplos siguientes de gcloud, se crea la regla de salida recomendada con la máxima prioridad:

    Solo IPv4

     gcloud compute firewall-rules create mskms-ipv4-firewall-rule-ipv4-network \     --direction=EGRESS \     --network=ipv4-network \     --action=ALLOW \     --rules=tcp:1688 \     --destination-ranges=35.190.247.13/32 \     --priority=0 

    Pila doble

     gcloud compute firewall-rules create mskms-ipv4-firewall-rule-ipv4-network \     --direction=EGRESS \     --network=ipv4-network \     --action=ALLOW \     --rules=tcp:1688 \     --destination-ranges=35.190.247.13/32 \     --priority=0 
     gcloud compute firewall-rules create mskms-ipv6-firewall-rule-ipv6-network \     --direction=EGRESS \     --network=ipv6-network \     --action=ALLOW \     --rules=tcp:1688 \     --destination-ranges=2001:4860:4802:32::86/128 \     --priority=0 

    Solo IPv6

     gcloud compute firewall-rules create mskms-ipv6-firewall-rule-ipv6-network \     --direction=EGRESS \     --network=ipv6-network \     --action=ALLOW \     --rules=tcp:1688 \     --destination-ranges=2001:4860:4802:32::86/128 \     --priority=0 

    Reemplaza ipv4-network o ipv6-network por el nombre de tu red de VPC.

    Verifica si una instancia se inició de manera correcta

    Las instancias de Windows experimentan un tiempo de inicio más largo debido al proceso sysprep. Es posible que la consola Google Cloud muestre que la instancia está en ejecución, incluso si el proceso sysprep aún no se completó. A fin de verificar si la instancia se inició de manera correcta y está lista para usarse, verifica la salida del puerto en serie con el siguiente comando:

    gcloud compute instances get-serial-port-output INSTANCE_NAME 

    Reemplaza INSTANCE_NAME por el nombre de la instancia que deseas verificar.

     ...[snip]... Running schtasks with arguments /run /tn GCEStartup -->  SUCCESS: Attempted to run the scheduled task "GCEStartup". ------------------------------------------------------------- Instance setup finished. INSTANCE_NAME is ready to use. ------------------------------------------------------------- 

    Habilita o inhabilita características de instancias de Windows

    Si tienes instancias de Windows con versiones con imágenes v20170509 o posteriores, o con la versión 4.1.0 o posterior del agente, puedes configurar la instancia en un archivo de configuración o en metadatos personalizados de proyectos o instancias. El archivo de configuración está en formato INI y se encuentra en la siguiente ruta:

    C:\Program Files\Google\Compute Engine\instance_configs.cfg 

    El sistema anula los ajustes de configuración en el siguiente orden de prioridad, desde la prioridad más alta hasta la más baja:

    1. Parámetros de configuración establecidos en el archivo de configuración
    2. Parámetros de configuración establecidos en metadatos personalizados a nivel de instancia
    3. Parámetros de configuración establecidos en metadatos personalizados a nivel de proyecto

    Por ejemplo, si puedes habilitar la función accountManager en un archivo de configuración, la instancia ignora los parámetros establecidos en los metadatos personalizados para inhabilitarla.

    Uno de los beneficios de establecer estos parámetros en el archivo de configuración es que esa configuración persiste cuando creas una imagen personalizada para una instancia de Windows Server. Los metadatos personalizados a nivel de instancia no persisten más allá de la vida de la instancia.

    Puedes inhabilitar diferentes funciones de instancias de Windows con los ejemplos siguientes.

    Inhabilita el administrador de cuentas

    Al inhabilitar el administrador de cuentas, también se inhabilita el restablecimiento de contraseñas con Google Cloud CLI o la consola de Google Cloud :

    • Archivo de configuración:

      [accountManager] disable=true 
    • En los metadatos personalizados, establece disable-account-manager como true en los metadatos.

    Inhabilita el administrador de direcciones

    • Entrada del archivo de configuración:

      [addressManager] disable=true 
    • En los metadatos personalizados, establece disable-address-manager como true en los metadatos.

    Clústeres de conmutación por error de Windows Server

    Haz esto para habilitar el agente de clústeres de conmutación por error de Windows Server:

    • Entrada del archivo de configuración:

      [wsfc] enable=true 
    • En los metadatos personalizados, establece enable-wsfc como true en los metadatos.

    Usa varios balanceadores de cargas internos

    Especifica la dirección IP de la instancia de balanceo de cargas interno para los clústeres de conmutación por error. Esta es una configuración avanzada que no necesitas establecer para un clúster de conmutación por error dedicado.

    Por lo general, se usa una instancia de balanceo de cargas interno para dirigir el tráfico de red a una instancia de VM a la vez. Si agregas una segunda instancia de balanceo de cargas interno que usa las instancias de VM de clústeres de conmutación por error como parte de un backend de sitio web con balanceo de cargas, tendrías dos direcciones IP de balanceo de cargas interno. Si los clústeres de conmutación por error usan 10.0.0.10 y el balanceador de cargas del sitio web usa 10.0.0.11, debes especificar la dirección IP del balanceador de cargas que usas para los clústeres de conmutación por error. Con esta opción, se desambigua la dirección que está en uso para el clúster.

    • Entrada del archivo de configuración:

      [wsfc] addresses=10.0.0.10 
    • En los metadatos personalizados, establece wsfc-addrs en 10.0.0.10.

    Cambia el puerto del agente de agrupación de clústeres

    Establece el puerto del agente de los clústeres de conmutación por error. El puerto predeterminado es 59998. Solo necesitas especificar un puerto si deseas usar otro:

    • Entrada del archivo de configuración:

      [wsfc] port=12345 
    • En los metadatos personalizados, establece wsfc-agent-port en el número de puerto.

    Notas de la versión de imágenes

    Las imágenes anteriores no usan un archivo de configuración y solo tienen un subconjunto de funciones. Las versiones con imágenes entre la versión v20160112 y la v20170509, o la versión entre 3.2.1.04.0.0 del agente de Windows requieren que uses los siguientes valores de metadatos personalizados:

    • Establece disable-account-manager como true en los metadatos de la instancia para inhabilitar el administrador de cuentas.
    • Establece disable-address-manager como true en los metadatos de la instancia para inhabilitar el administrador de direcciones.

    ¿Qué sigue?