Todos los productos
Search
Centro de documentos

Elastic Compute Service:Create a spot instance with the ECS console, SDK, or Terraform

Última actualización: Sep 22, 2026

Cree una instancia spot desde la consola de ECS, el SDK o terraform para ejecutar cargas de trabajo tolerantes a fallos, como análisis de datos, a un costo menor que el de pay-as-you-go.

Antes de empezar

Tenga en cuenta las siguientes recomendaciones al crear una instancia spot:

  • Establezca una estrategia de oferta razonable: considere la volatilidad del precio de mercado. Una oferta adecuada aumenta la probabilidad de iniciar la instancia correctamente y reduce el riesgo de liberación. Asegúrese de que su oferta coincida con sus expectativas de presupuesto.

    Nota

    Si no tiene certeza sobre el monto de su oferta, utilice la oferta automática. Esta opción acepta el precio de mercado en tiempo real como tarifa de facturación.

  • Garantice la persistencia de los datos: almacene la información crítica en medios de almacenamiento que no se vean afectados por la liberación de instancias spot. Por ejemplo, discos independientes (que no se liberan junto con la instancia), OSS o NAS.

  • Supervise el estado de la instancia: use CloudMonitor o los metadatos de la instancia para dar seguimiento a su estado. Consulte Detect and respond to spot instance interruption events.

  • Gestione las interrupciones: las instancias spot pueden liberarse cuando el precio de mercado supera su oferta máxima o cuando se agota el inventario. Pruebe su aplicación para comprobar que maneja las liberaciones inesperadas sin problemas.

Crear una instancia spot

Crear mediante la consola de ECS

  1. Vaya a la página de creación de instancias y seleccione la pestaña Custom Launch.

  2. Configure los recursos de ECS según sus necesidades y las indicaciones en pantalla.

    Preste atención a los siguientes parámetros. Para el resto de las configuraciones, consulte Custom launch instances.

    • Billing Method: seleccione Spot Instance.

    • Instance Usage Duration:

      • 1 Hour: la instancia se ejecuta sin interrupciones durante una hora. Después de ese periodo, el sistema supervisa el inventario y los cambios de precio para determinar si puede continuar usándola.

      • None: sin duración fija. Esta opción suele ofrecer mejores precios.

    • Maximum Price:

      • Use Automatic Bid: acepta el precio actual del mercado como tarifa de facturación.

      • Set Maximum Price: establezca el precio máximo por hora que está dispuesto a pagar.

    • Instance Interruption Mode:

      • Release: se liberan la instancia y sus recursos de cómputo (vCPU, GPU, memoria), así como la IP pública estática, el ancho de banda fijo y los discos.

        Aviso

        Las instancias spot no son adecuadas para almacenar datos críticos. Si selecciona Instance Interruption Mode como Release, podría perder datos. Deshabilite la liberación del disco al terminar la instancia o cree instantáneas del disco periódicamente para proteger su información.

      • Stop in Economical Mode: se recuperan los recursos de cómputo (vCPU, GPU, memoria), la IP pública estática y el ancho de banda fijo. Los discos, las direcciones IP elásticas y las instantáneas se conservan y siguen generando cargos.

        Nota

        Una instancia spot en modo económico podría no reiniciarse si el inventario es insuficiente o si el precio de mercado supera su oferta.

  3. Revise su configuración en el lado derecho de la página, defina las opciones de uso y haga clic en Confirm Order.

Crear mediante el SDK

Requisitos previos

  1. Cree un accesskey

    Una cuenta de Alibaba Cloud (cuenta principal) tiene permisos completos sobre todos los recursos. Por lo tanto, filtrar su accesskey representa un riesgo grave. Utilice un accesskey de usuario de RAM con los permisos mínimos necesarios. Consulte Create an AccessKey.

  2. Otorgue permisos de ECS al usuario de RAM

    Conceda al usuario de RAM permisos para gestionar ECS. El código de ejemplo requiere privilegios para crear instancias. Permiso recomendado:

    Productos de nube

    Permiso

    Elastic Compute Service

    AliyunECSFullAccess

  3. Configure las credenciales de acceso

    El código de ejemplo lee el accesskey desde las variables de entorno del sistema. Para conocer los pasos de configuración, consulte Configure environment variables on Linux, macOS, and Windows.

  4. Instale el SDK de ECS

    Obtenga el SDK de ECS. Este ejemplo utiliza Maven. Para otros métodos, consulte Instalar el SDK de Java para ECS.

    Agregue la dependencia de Maven de la siguiente manera:

    <dependencies>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>ecs20140526</artifactId>
            <version>5.3.0</version>
        </dependency>
    </dependencies>

Inicializar el cliente

El SDK de Alibaba Cloud admite varios tipos de credenciales para inicializar el cliente, como accesskey y token de Security Token Service. Consulte Manage access credentials. Este ejemplo utiliza un accesskey.

import com.aliyun.ecs20140526.Client;
import com.aliyun.teaopenapi.models.Config;

public class Sample {
    private static Client createClient() throws Exception {
        Config config = new Config()
                // Required. Ensure the environment variable ALIBABA_CLOUD_ACCESS_KEY_ID is set.
                .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                // Required. Ensure the environment variable ALIBABA_CLOUD_ACCESS_KEY_SECRET is set.
                .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
                // For Endpoint, see https://api.alibabacloud.com/product/Ecs
                .setEndpoint("ecs.cn-hangzhou.aliyuncs.com");
        return new Client(config);
    }
}

Compilar el objeto de solicitud de la API

Revise la documentación de la API para conocer los detalles de los parámetros antes de compilar el objeto de solicitud.

// Build the request object
RunInstancesRequest request = new RunInstancesRequest()
    // Set the region
    .setRegionId("cn-hangzhou")
    // Set billing method to pay-as-you-go
    .setInstanceChargeType("PostPaid")
    // Set bidding strategy to automatic
    .setSpotStrategy("SpotAsPriceGo")
    // Set 1-hour usage duration: guarantees the instance runs for 1 hour without release
    .setSpotDuration(1)
    // Set instance type
    .setInstanceType("instanceType")
    // Set image
    .setImageId("imageId")
    // Set security group ID
    .setSecurityGroupId("securityGroupId")
    // Set virtual switch ID
    .setVSwitchId("vSwitchId");

Realizar la llamada

Configure las opciones de tiempo de ejecución, como los tiempos de espera y la configuración del proxy, al llamar a openapi. Consulte Advanced configuration.

// Set runtime options
RuntimeOptions runtime = new RuntimeOptions();
// Call the RunInstances API
RunInstancesResponse response = client.runInstancesWithOptions(request, runtime);
System.out.println(response.body.toMap());

Gestionar excepciones

El SDK de Java clasifica las excepciones en TeaUnretryableException y TeaException.

  • TeaUnretryableException: problemas de red tras alcanzar el número máximo de reintentos.

  • TeaException: errores relacionados con la lógica de negocio.

Gestione las excepciones adecuadamente para garantizar la solidez del sistema. Por ejemplo, propáguelas, registre los detalles o intente recuperar el proceso.

Ejemplo completo

import com.aliyun.ecs20140526.Client;
import com.aliyun.ecs20140526.models.RunInstancesRequest;
import com.aliyun.ecs20140526.models.RunInstancesResponse;
import com.aliyun.ecs20140526.models.RunInstancesResponseBody;
import com.aliyun.tea.TeaException;
import com.aliyun.tea.TeaUnretryableException;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import com.alibaba.fastjson.JSONArray;

import java.util.Arrays;

public class Sample {
    private static Client createClient() throws Exception {
        Config config = new Config()
                // Required. Ensure the environment variable ALIBABA_CLOUD_ACCESS_KEY_ID is set.
                .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                // Required. Ensure the environment variable ALIBABA_CLOUD_ACCESS_KEY_SECRET is set.
                .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
                // For Endpoint, see https://api.alibabacloud.com/product/Ecs
                .setEndpoint("ecs.cn-hangzhou.aliyuncs.com");
        return new Client(config);
    }

    public static void main(String[] args) {
        try {
            Client client = Sample.createClient();
            // Build the request object
            RunInstancesRequest request = new RunInstancesRequest()
                    // Set the region
                    .setRegionId("cn-hangzhou")
                    // Set billing method to pay-as-you-go
                    .setInstanceChargeType("PostPaid")
                    // Set bidding strategy to automatic
                    .setSpotStrategy("SpotAsPriceGo")
                    // Set 1-hour usage duration: guarantees the instance runs for 1 hour without release
                    .setSpotDuration(1)
                    // Set instance type
                    .setInstanceType("instanceType")
                    // Set image
                    .setImageId("imageId")
                    // Set security group ID
                    .setSecurityGroupId("securityGroupId")
                    // Set virtual switch ID
                    .setVSwitchId("vSwitchId");
            // Set runtime options
            RuntimeOptions runtime = new RuntimeOptions();
            // Call the RunInstances API
            RunInstancesResponse response = client.runInstancesWithOptions(request, runtime);
            System.out.println(response.body.toMap());
        } catch (TeaUnretryableException ue) {
            // This example only prints exceptions. Handle exceptions carefully in production code—never ignore them.
            ue.printStackTrace();
            // Print error message
            System.out.println(ue.getMessage());
            // Print request details for debugging
            System.out.println(ue.getLastRequest());
        } catch (TeaException e) {
            // This example only prints exceptions. Handle exceptions carefully in production code—never ignore them.
            e.printStackTrace();
            // Print error code
            System.out.println(e.getCode());
            // Print error message (includes RequestId)
            System.out.println(e.getMessage());
            // Print detailed server-side error
            System.out.println(e.getData());
        } catch (Exception e) {
            // This example only prints exceptions. Handle exceptions carefully in production code—never ignore them.
            e.printStackTrace();
        }
    }
}

Crear mediante terraform

Nota

A continuación se incluye código de ejemplo listo para ejecutarse. Ejecutar ahora

Requisitos previos

  • Cree un accesskey

    Una cuenta de Alibaba Cloud (cuenta principal) tiene permisos completos sobre todos los recursos. Para evitar usos no autorizados en caso de que se filtre el accesskey, utilice uno de usuario de RAM con los permisos mínimos necesarios. Consulte Create a RAM user y Create an AccessKey.

  • Cree una directiva personalizada

    Cree una directiva personalizada que permita iniciar instancias de ECS, consultar los detalles de las instancias y revisar el historial de precios spot. Consulte Create a custom policy.

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "ecs:RunInstances",
            "ecs:DescribeInstances",
            "ecs:DescribeSpotPriceHistory"
          ],
          "Resource": "*"
        }
      ]
    }

Recursos utilizados

Procedimiento

  1. Abra https://shell-sg.alibabacloud.com e inicie sesión en Cloud Shell.

    Para conocer otras formas de usar Cloud Shell, consulte Use Cloud Shell.

  2. Cree una carpeta de proyecto llamada terraform y acceda al directorio.

    mkdir terraform
    cd terraform
  3. Cree un archivo de configuración llamado main.tf con el siguiente contenido:

    main.tf

    provider "alicloud" {
      region = var.region
    }
    
    # Region
    variable "region" {
      type    = string
      default = "cn-beijing"
    }
    
    # VPC name
    variable "vpc_name" {
      type    = string
      default = "tf_test_fofo"
    }
    
    # VPC CIDR block
    variable "vpc_cidr_block" {
      type    = string
      default = "172.16.0.0/12"
    }
    
    # vSwitch CIDR block
    variable "vswitch_cidr_block" {
      type    = string
      default = "172.16.0.0/21"
    }
    
    # Zone
    variable "availability_zone" {
      type    = string
      default = "cn-beijing-b"
    }
    
    # Security group name
    variable "security_group_name" {
      type    = string
      default = "default"
    }
    
    # Instance type
    variable "instance_type" {
      type    = string
      default = "ecs.n2.small"
    }
    
    # System disk category
    variable "system_disk_category" {
      type    = string
      default = "cloud_efficiency"
    }
    
    # OS image
    variable "image_id" {
      type    = string
      default = "ubuntu_140405_64_40G_cloudinit_20161115.vhd"
    }
    
    # Instance name
    variable "instance_name" {
      type    = string
      default = "test_fofo"
    }
    
    # Public bandwidth
    variable "internet_max_bandwidth_out" {
      type    = number
      default = 10
    }
    
    # Billing method
    variable "instance_charge_type" {
      type    = string
      default = "PostPaid"
    }
    
    # Spot instance bidding strategy
    variable "spot_strategy" {
      type    = string
      default = "SpotAsPriceGo"
    }
    
    # Spot instance reserved duration
    variable "spot_duration" {
      type    = number
      default = 1
    }
    
    # Inbound rule port range
    variable "port_range" {
      type    = string
      default = "1/65535"
    }
    
    # Inbound rule priority
    variable "priority" {
      type    = number
      default = 1
    }
    
    # Inbound rule CIDR
    variable "cidr_ip" {
      type    = string
      default = "0.0.0.0/0"
    }
    
    resource "alicloud_vpc" "vpc" {
      vpc_name   = var.vpc_name
      cidr_block = var.vpc_cidr_block
    }
    
    resource "alicloud_vswitch" "vsw" {
      vpc_id     = alicloud_vpc.vpc.id
      cidr_block = var.vswitch_cidr_block
      zone_id    = var.availability_zone
    }
    
    resource "alicloud_security_group" "default" {
      security_group_name = var.security_group_name
      vpc_id              = alicloud_vpc.vpc.id
    }
    
    resource "alicloud_instance" "instance" {
      availability_zone          = var.availability_zone
      security_groups            = [alicloud_security_group.default.id]
      instance_type              = var.instance_type
      system_disk_category       = var.system_disk_category
      image_id                   = var.image_id
      instance_name              = var.instance_name
      vswitch_id                 = alicloud_vswitch.vsw.id
      internet_max_bandwidth_out = var.internet_max_bandwidth_out
      instance_charge_type       = var.instance_charge_type
      spot_strategy              = var.spot_strategy
      spot_duration              = var.spot_duration
    }
    
    resource "alicloud_security_group_rule" "allow_all_tcp" {
      type              = "ingress"
      ip_protocol       = "tcp"
      nic_type          = "intranet"
      policy            = "accept"
      port_range        = var.port_range
      priority          = var.priority
      security_group_id = alicloud_security_group.default.id
      cidr_ip           = var.cidr_ip
    }
  4. Ejecute terraform init para inicializar la configuración.

    Terraform has been successfully initialized!
    
    You may now begin working with Terraform. Try running "terraform plan" to see
    any changes that are required for your infrastructure. All Terraform commands
    should now work.
    
    If you ever set or change modules or backend configuration for Terraform,
    rerun this command to reinitialize your working directory. If you forget, other
    commands will detect it and remind you to do so if necessary.
  5. Ejecute terraform apply. Cuando el sistema lo solicite, introduzca yes y presione Enter. Si aparece el siguiente mensaje, la instancia spot se creó correctamente.

    Apply complete! Resources: 5 added, 0 changed, 0 destroyed.
  6. Ejecute terraform show para consultar los detalles de los recursos creados.

    shell@Alicloud: ~ $ terraform show
    # alicloud_instance.instance:
    resource "alicloud_instance" "instance" {
        availability_zone              = "cn-beijing-b"
        cpu                            = 1
        create_time                    = "2024-11-13T06:52Z"
        deletion_protection            = false
        dry_run                        = false
        enable_jumbo_frame             = false
        expired_time                   = "2099-12-31T15:59Z"
        host_name                      = "xxx"
        http_put_response_hop_limit    = 0
        id                             = "xxx"
        image_id                       = "ubuntu_140405_64_40G_xxx"
        instance_charge_type           = "PostPaid"
        instance_name                  = "test_fofo"
        instance_type                  = "ecs.n2.small"
        internet_charge_type           = "PayByTraffic"
        internet_max_bandwidth_in      = -1
        internet_max_bandwidth_out     = 10
        ipv6_address_count             = 0
        ipv6_addresses                 = []
        maintenance_action             = "AutoRecover"
        maintenance_notify             = false
        memory                         = 4096
        network_interface_id           = "eni-2zehj0xxx"
        network_interface_traffic_mode = "Standard"
        os_name                        = "Ubuntu  14.04 64-bit"
        os_type                        = "linux"
        primary_ip_address             = "172.xxx"
        private_ip                     = "172.xxx"
        public_ip                      = "39.1xxx"
        queue_pair_number              = 0
    }

Limpiar los recursos

Para liberar los recursos creados con terraform, ejecute el siguiente comando. Consulte Common Terraform commands.

terraform destroy

Referencias

Otros métodos

Alibaba Cloud también ofrece Auto Scaling, ACK y grupos de aprovisionamiento automático para crear instancias spot en escenarios más complejos.

Auto Scaling (ESS)

Combina de forma dinámica instancias pay-as-you-go e instancias spot para responder a las fluctuaciones de carga. Además, reemplaza automáticamente las instancias liberadas. Consulte Use spot instances in scaling groups to reduce costs.

ACK

Crea grupos de nodos de Kubernetes de bajo costo para aplicaciones sin estado y tolerantes a fallos. Consulte Best practices for spot instance node pools.

Grupo de aprovisionamiento automático

Aprovisiona clústeres de instancias en varias zonas y con distintos modelos de facturación (pay-as-you-go y spot) mediante una sola configuración. Consulte Auto provisioning group configuration example.