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.
NotaSe 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
Acesse a página de criação de instância e selecione a aba Custom Launch.
-
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.
AvisoInstâ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.
NotaUma 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.
-
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
-
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.
-
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
-
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.
-
Instale o SDK do ECS
Obtenha o SDK do ECS. Este exemplo utiliza Maven. Para outros métodos, consulte Install the ECS Java SDK.
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
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
alicloud_vpc: Cria uma VPC.
alicloud_vswitch: Cria um vSwitch na VPC para segmentação de sub-rede.
alicloud_security_group: Cria um grupo de segurança chamado default e o associa à VPC.
alicloud_instance: Cria uma instância ECS.
alicloud_security_group_rule: Define regras do grupo de segurança.
Procedimento
-
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.
-
Crie uma pasta de projeto chamada terraform e entre no diretório.
mkdir terraform cd terraform -
Crie um arquivo de configuração chamado main.tf com o seguinte conteúdo:
-
Execute
terraform initpara 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. -
Execute
terraform apply. Quando solicitado, insirayese 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. -
Execute
terraform showpara 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
Para uma introdução ao Terraform, consulte Terraform overview.
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.