Todos os produtos
Search
Central de documentação

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

Última atualização: Sep 22, 2026

Crie uma instância spot por meio do console do ECS, SDK ou Terraform para executar cargas de trabalho tolerantes a falhas, como análise de dados, com custo inferior ao modelo de pagamento conforme o uso.

Antes de começar

Siga estas recomendações ao criar uma instância spot:

  • Defina uma estratégia de lance adequada: Considere a volatilidade do preço de mercado. Um lance adequado aumenta as chances de criação bem-sucedida e reduz o risco de liberação. Verifique se o lance está alinhado com suas expectativas de orçamento.

    Nota

    Se você não tiver certeza sobre o valor do lance, utilize o lance automático, que aceita o preço de mercado em tempo real como taxa de cobrança.

  • Garanta a persistência dos dados: Armazene dados críticos em mídias de armazenamento não afetadas pela liberação de instâncias spot, como discos independentes (não liberados junto com a instância), OSS ou NAS.

  • Monitore o status da instância: Use o Cloud Monitor ou os metadados da instância para acompanhar o status da instância spot. Consulte Detect and respond to spot instance interruption events.

  • Lide com interrupções: Instâncias spot podem ser liberadas quando o preço de mercado excede o lance máximo ou o inventário se esgota. Teste sua aplicação para garantir que ela lide adequadamente com liberações inesperadas.

Crie uma instância spot

Criação pelo console do ECS

  1. Acesse a página de criação de instância e selecione a aba Custom Launch.

  2. Configure os recursos do ECS de acordo com suas necessidades e as orientações exibidas na tela.

    Observe os parâmetros a seguir. Para as demais configurações, consulte Custom launch instances.

    • Billing Method: Selecione Spot Instance.

    • Instance Usage Duration:

      • 1 Hour: A instância é executada sem interrupção por uma hora. Após esse período, o sistema monitora o inventário e as alterações de lance para determinar se a utilização pode continuar.

      • None: Sem duração fixa. Essa opção geralmente oferece preços melhores.

    • Maximum Price:

      • Use Automatic Bid: Aceita o preço de mercado atual como taxa de cobrança.

      • Set Maximum Price: Defina o preço máximo por hora que você está disposto a pagar.

    • Instance Interruption Mode:

      • Release: A instância e seus recursos de computação (vCPU, GPU, memória), IP público estático, largura de banda fixa e discos são liberados.

        Aviso

        Instâncias spot não são adequadas para armazenar dados críticos. Ao escolher Instance Interruption Mode como Release, pode ocorrer perda de dados. Desative a liberação de disco junto com o encerramento da instância ou crie snapshots de disco regularmente para proteger seus dados.

      • Stop in Economical Mode: Os recursos de computação (vCPU, GPU, memória), IP público estático e largura de banda fixa são recuperados. Discos, Elastic IP Addresses e snapshots são mantidos e continuam gerando cobranças.

        Nota

        Uma instância spot no modo econômico pode falhar ao reiniciar por insuficiência de inventário ou preço de mercado acima do seu lance.

  3. Revise a configuração no lado direito da página, defina as opções de uso e clique em Confirm Order.

Criação via SDK

Pré-requisitos

  1. Crie um AccessKey

    Uma conta Alibaba Cloud (conta principal) possui permissões totais sobre todos os recursos, e o vazamento do AccessKey dessa conta representa riscos graves. Utilize um AccessKey de usuário RAM com as permissões mínimas necessárias. Consulte Create an AccessKey.

  2. Conceda permissões do ECS ao usuário RAM

    Conceda ao usuário RAM permissões de gerenciamento do ECS. O código de exemplo requer privilégios de criação de instância. Permissão recomendada:

    Cloud Products

    Permission

    Elastic Compute Service

    AliyunECSFullAccess

  3. Configure as credenciais de acesso

    O código de exemplo lê o AccessKey a partir de variáveis de ambiente do sistema. Para as etapas de configuração, consulte Configure environment variables on Linux, macOS, and Windows.

  4. Instale o SDK do ECS

    Obtenha o SDK do ECS. Este exemplo utiliza Maven. Para outros métodos, consulte Install the ECS Java SDK.

    Adicione a dependência Maven da seguinte forma:

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

Inicialize o cliente

O SDK da Alibaba Cloud oferece suporte a vários tipos de credencial para inicialização do cliente, como AccessKey e token do Security Token Service. Consulte Manage access credentials. Este exemplo utiliza um 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);
    }
}

Construa o objeto de requisição da API

Consulte a documentação da API para obter detalhes dos parâmetros antes de construir o objeto de requisição.

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

Execute a chamada

Configure opções de tempo de execução, como timeout e configurações de proxy, ao chamar 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());

Trate exceções

O Java SDK classifica as exceções em TeaUnretryableException e TeaException.

  • TeaUnretryableException: problemas de rede após atingir o número máximo de tentativas.

  • TeaException: erros relacionados à lógica de negócio.

Trate as exceções adequadamente para garantir a robustez do sistema — por exemplo, propagando-as, registrando os detalhes em log ou tentando a recuperação.

Exemplo 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();
        }
    }
}

Criação via Terraform

Nota

As etapas a seguir incluem código de exemplo pronto para execução. Executar agora

Pré-requisitos

  • Crie um AccessKey

    Uma conta Alibaba Cloud (conta principal) possui permissões totais sobre todos os recursos. Para evitar o uso não autorizado em caso de vazamento do AccessKey, utilize um AccessKey de usuário RAM com as permissões mínimas necessárias. Consulte Create a RAM user e Create an AccessKey.

  • Crie uma política personalizada

    Crie uma política personalizada para permitir a criação de instâncias ECS, a visualização de detalhes de instância e a consulta do histórico de preços de instâncias spot. Consulte Create a custom policy.

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

Recursos utilizados

Procedimento

  1. Abra https://shell-sg.alibabacloud.com e faça login no Cloud Shell.

    Para outras formas de usar o Cloud Shell, consulte Use Cloud Shell.

  2. Crie uma pasta de projeto chamada terraform e entre no diretório.

    mkdir terraform
    cd terraform
  3. Crie um arquivo de configuração chamado main.tf com o seguinte conteúdo:

    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. Execute terraform init para inicializar a configuração.

    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. Execute terraform apply. Quando solicitado, insira yes e pressione Enter. Se a mensagem a seguir aparecer, a instância spot foi criada com sucesso.

    Apply complete! Resources: 5 added, 0 changed, 0 destroyed.
  6. Execute terraform show para visualize os detalhes dos recursos criados.

    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
    }

Limpeza de recursos

Para liberar os recursos criados pelo Terraform, execute o comando a seguir. Consulte Common Terraform commands.

terraform destroy

Referências

Outros métodos

A Alibaba Cloud também oferece Auto Scaling, ACK e grupos de provisionamento automático para criar instâncias spot em cenários mais complexos.

Auto Scaling (ESS)

Combina dinamicamente instâncias de pagamento conforme o uso e instâncias spot para responder a flutuações de carga, além de substituir automaticamente as instâncias liberadas. Consulte Use spot instances in scaling groups to reduce costs.

ACK

Permite criar pools de nós Kubernetes de baixo custo para aplicações stateless e tolerantes a falhas. Consulte Best practices for spot instance node pools.

Grupo de provisionamento automático

Provisiona clusters de instâncias em múltiplas zonas e métodos de faturamento (pagamento conforme o uso e spot) com uma única configuração. Consulte Auto provisioning group configuration example.