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: Jul 03, 2026

Crie uma instância spot pelo console do ECS, SDK ou Terraform para executar cargas de trabalho tolerantes a falhas, como análise de dados, com custo inferior ao 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 bem calculado aumenta a probabilidade de inicialização bem-sucedida e reduz o risco de liberação. Certifique-se de que o lance esteja alinhado às suas expectativas orçamentárias.

    Nota

    Se 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 faturamento.

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

  • Monitore o status da instância: Utilize o CloudMonitor ou os metadados da instância para acompanhar o status da sua instância spot. Consulte Detectar e responder a eventos de interrupção de instância spot.

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

Criar uma instância spot

Criar 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 conforme suas necessidades e as instruções na tela.

    Observe os parâmetros a seguir. Para outras configurações, consulte Inicialização personalizada de instâncias.

    • Billing Method: Selecione Spot Instance.

    • Instance Usage Duration:

      • 1 Hour: A instância executa sem interrupção por uma hora. Após esse período, o sistema monitora o estoque e as alterações de preço para determinar se você pode continuar usando-a.

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

    • Maximum hourly price per instance:

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

      • Set a maximum price: Defina o preço horário máximo 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. Escolher Instance Interruption Mode como Release pode causar perda de dados. Desative a liberação de disco no encerramento da instância ou crie snapshots de disco regularmente para proteger seus dados.

      • Stop in Economical Mode: Recursos de computação (vCPU, GPU, memória), IP público estático e largura de banda fixa são recuperados. Discos, Endereços IP Elásticos e snapshots são mantidos e continuam a gerar cobranças.

        Nota

        Uma instância spot em modo econômico pode falhar ao reiniciar devido a estoque insuficiente ou preço de mercado acima do seu lance.

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

Criar via SDK

Pré-requisitos

  1. Criar um AccessKey

    Uma conta Alibaba Cloud (conta primária) tem permissões totais sobre todos os recursos; portanto, o vazamento de seu AccessKey representa riscos graves. Utilize um AccessKey de usuário RAM com as permissões mínimas necessárias. Consulte Criar um AccessKey.

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

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

    Produtos de nuvem

    Permissão

    Elastic Compute Service

    AliyunECSFullAccess

  3. Configurar credenciais de acesso

    O código de exemplo lê o AccessKey das variáveis de ambiente do sistema. Para etapas de configuração, consulte Configurar variáveis de ambiente no Linux, macOS e Windows.

  4. Instalar o SDK do ECS

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

    Add the Maven dependency as follows:

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

Inicializar o cliente

O SDK da Alibaba Cloud suporta múltiplos tipos de credenciais para inicialização do cliente, como AccessKey e token do Security Token Service. Consulte Gerenciar credenciais de acesso. 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.aliyun.com/product/Ecs
                .setEndpoint("ecs.cn-hangzhou.aliyuncs.com");
        return new Client(config);
    }
}

Construir o objeto de requisição da API

Verifique os detalhes dos parâmetros na documentação da API 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");

Fazer a chamada

Configure opções de tempo de execução, como timeout e configurações de proxy, ao chamar a OpenAPI. Consulte Configuração avançada.

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

Tratar exceções

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

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

  • TeaException: Erros relacionados a negócios.

Trate as exceções adequadamente para garantir a robustez do sistema, por exemplo, propagando-as, registrando detalhes ou tentando 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.aliyun.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();
        }
    }
}

Criar via Terraform

Nota

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

Pré-requisitos

  • Criar um AccessKey

    Uma conta Alibaba Cloud (conta primária) tem permissões totais sobre todos os recursos. Para evitar uso não autorizado caso o AccessKey vaze, utilize um AccessKey de usuário RAM com as permissões mínimas necessárias. Consulte Criar um usuário RAM e Criar um AccessKey.

  • Criar uma política personalizada

    Crie uma política personalizada para permitir a inicialização de instâncias ECS, visualização de detalhes da instância e verificação do histórico de preços spot. Consulte Criar uma política personalizada.

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

Recursos utilizados

Procedimento

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

    Para outras formas de usar o Cloud Shell, consulte Usar o 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 = 0
    }
    
    # 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.

    image

  5. Execute terraform apply. Quando solicitado, insira yes e pressione Enter. Se a mensagem a seguir aparecer, sua instância spot foi criada.

    image

  6. Execute terraform show para visualizar detalhes dos recursos criados.

    image

Limpar recursos

Para liberar recursos criados pelo Terraform, execute o comando a seguir. Consulte Comandos comuns.

terraform destroy

Referências

Outros métodos

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

Auto Scaling (ESS)

Mistura dinamicamente instâncias de pagamento conforme o uso e spot para responder a flutuações de carga, substituindo automaticamente instâncias liberadas. Consulte Usar instâncias spot em grupos de dimensionamento para reduzir custos.

ACK

Cria pools de nós Kubernetes de baixo custo para aplicações stateless e tolerantes a falhas. Consulte Melhores práticas para pools de nós de instância spot.

Grupo de provisionamento automático

Provisiona clusters de instâncias em várias zonas e métodos de faturamento (pagamento conforme o uso e spot) com uma única configuração. Consulte Exemplo de configuração de grupo de provisionamento automático.