全部產品
Search
文件中心

Elastic Compute Service:建立搶佔式執行個體

更新時間:May 13, 2025

搶佔式執行個體是阿里雲提供的一種低成本計算資源,適用於對成本敏感且允許中斷的任務情境,如資料分析、測試開發等。搶佔式執行個體的價格通常遠低於隨用隨付執行個體,但可能會因市場價格波動或資源供需變化而被系統自動釋放。本文將指導您如何通過ECS控制台、SDK或Terraform建立搶佔式執行個體。

建議

在建立搶佔式執行個體時,建議您參考以下內容:

  • 選擇合理的出價模式:出價要充分考慮到市場價格的波動,合理的出價可以提升搶佔式執行個體建立成功的機率,並降低後續使用中由於出價低於市場價格導致執行個體被釋放的機率。另外,出價還必須符合您根據自身業務評估後的預期。

    說明

    如果您暫時不能決定出價,建議使用自動出價,即接受即時的市場價格作為執行個體規格的計費價格 。

  • 資料持久性:建議您使用不受搶佔式執行個體釋放影響的儲存介質來儲存您的重要資料。例如,您可以使用獨立的雲端硬碟(不隨執行個體釋放)、OSS、NAS等儲存資料。

  • 監控執行個體狀態:您可以通過CloudMonitor、執行個體中繼資料等方式監控搶佔式執行個體的狀態,以判斷是否被中斷回收。詳情請參見感知搶佔式執行個體中斷事件與響應

  • 處理中斷:搶佔式執行個體可能因市場價格超過您的最高出價或庫存不足而被釋放,請測試您的應用程式,確保它能很好地處理執行個體的意外釋放。

操作步驟

通過ECS控制台建立

  1. 前往執行個體建立頁,選擇自訂購買頁簽。

  2. 根據實際需求和頁面提示,設定ECS資源配置資訊。

    需注意以下參數(其他配置項說明,請參考自訂購買執行個體):

    • 付費類型:選擇搶佔式執行個體

    • 執行個體使用時間長度

      • 設定執行個體使用1小時:執行個體穩定運行1小時不會被自動釋放,超過1小時後,系統即時監測庫存、出價的變化,進而判斷您是否能夠繼續使用資源。

      • 無確定使用時間長度:基於實際業務需求,不進行資源使用時間長度的設定,優勢在於相較設定執行個體使用時間長度可獲得更優惠的價格。

    • 單台執行個體上限價格

      • 使用自動出價:選擇跟隨當前市場價格的模式,即表示始終接受即時的市場價格作為執行個體規格的計費價格 。

      • 設定單台上限價:您必須為指定的執行個體規格設定一個價格上限,即您願意為這個執行個體規格支付的最高價格 。

    • 執行個體中斷模式

      • 直接釋放觸發中斷回收時,您的執行個體將被直接釋放,包括計算資源(vCPU、GPU和記憶體)、固定公網IP、固定頻寬以及雲端硬碟(系統硬碟和資料盤)。

        警告

        搶佔式執行個體不適合儲存重要資料,執行個體中斷模式選擇直接釋放可能會導致您的資料丟失,建議您關閉雲端硬碟隨執行個體釋放功能或者定期為雲端硬碟建立快照來確保資料的安全性。

      • 節省停機觸發中斷回收時,執行個體進入節省停機模式,計算資源(vCPU、GPU和記憶體)、固定公網IP和固定頻寬被回收,雲端硬碟(系統硬碟和資料盤)、Elastic IP Address、快照等資源保留並繼續收費。

        說明

        搶佔式執行個體進入節省停機模式後,可能會因為庫存不足或者價格浮動超過出價而重啟失敗。

通過SDK建立

準備工作

  1. 建立AccessKey

    由於阿里雲帳號(主帳號)擁有資源的所有許可權,其AccessKey一旦泄露風險巨大,所以建議您使用滿足最小化許可權需求的RAM使用者的AccessKey。擷取方法請參見建立AccessKey

  2. 為RAM使用者授予ECS相關許可權

    給RAM使用者授予操作Elastic Compute Service相關資源的許可權。本文提供的範例程式碼需要建立執行個體,建議授予以下許可權:

    雲產品

    授予許可權

    Elastic Compute Service

    AliyunECSFullAccess

  3. 配置訪問憑證

    本文範例程式碼會在系統內容變數中讀取AccessKey作為訪問雲端服務的憑證,具體操作步驟請參見在Linux、macOS和Windows系統配置環境變數

  4. 安裝ECS SDK

    擷取ECS SDK,本文通過添加Maven依賴的方式來安裝。更多安裝方式,請參見安裝ECS Java SDK

    添加Maven依賴的樣本如下:

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

初始化用戶端

阿里雲SDK支援多種訪問憑據用於初始化用戶端,例如AccessKey和STS Token等,更多方式請參見管理訪問憑據。本樣本以通過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()
                // 必填,請確保代碼運行環境設定了環境變數 ALIBABA_CLOUD_ACCESS_KEY_ID。
                .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                // 必填,請確保代碼運行環境設定了環境變數 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
                .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
                // Endpoint 請參考 https://api.aliyun.com/product/Ecs
                .setEndpoint("ecs.cn-hangzhou.aliyuncs.com");
        return new Client(config);
    }
}

構建介面的請求對象

在構建請求對象之前,請查看該介面的API文檔擷取參數資訊。

// 構造請求對象
RunInstancesRequest request = new RunInstancesRequest()
    //設定地區
    .setRegionId("cn-hangzhou")
    //設定付費方式為後付費
    .setInstanceChargeType("PostPaid")
    //設定出價模式為自動出價
    .setSpotStrategy("SpotAsPriceGo")
    //設定執行個體使用時間長度為1小時:保證執行個體運行1小時不被釋放
    .setSpotDuration(1)
    //設定執行個體規格
    .setInstanceType("instanceType")
    //設定鏡像
    .setImageId("imageId")
    //設定安全性群組ID
    .setSecurityGroupId("securityGroupId")
    //設定虛擬交換器ID
    .setVSwitchId("vSwitchId");

發起調用

通過用戶端調用OpenAPI時,支援設定運行時參數,例如逾時配置、代理配置等,更多資訊請查看進階配置

// 設定運行時參數
RuntimeOptions runtime = new RuntimeOptions();
// 調用 DescribeInstances 介面
RunInstancesResponse response = client.runInstancessWithOptions(request, runtime);
System.out.println(response.body.toMap());

異常處理

Java SDK將異常進行了細緻的分類,主要劃分為TeaUnretryableException和TeaException。

  • TeaUnretryableException:主要是因為網路問題造成,一般是網路問題達到最大重試次數後拋出。

  • TeaException:主要以業務報錯為主的異常。

建議採取合理的措施來處理異常,比如合理地傳播異常、記錄日誌、嘗試恢複等,以確保系統的健壯性和穩定性。

完整樣本

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()
                // 必填,請確保代碼運行環境設定了環境變數 ALIBABA_CLOUD_ACCESS_KEY_ID。
                .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                // 必填,請確保代碼運行環境設定了環境變數 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
                .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
                // Endpoint 請參考 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();
            // 構造請求對象
            RunInstancesRequest request = new RunInstancesRequest()
                    //設定地區
                    .setRegionId("cn-hangzhou")
                    //設定付費方式為後付費
                    .setInstanceChargeType("PostPaid")
                    //設定出價模式為自動出價
                    .setSpotStrategy("SpotAsPriceGo")
                    //設定執行個體使用時間長度為1小時:保證執行個體運行1小時不被釋放
                    .setSpotDuration(1)
                    //設定執行個體規格
                    .setInstanceType("instanceType")
                    //設定鏡像
                    .setImageId("imageId")
                    //設定安全性群組ID
                    .setSecurityGroupId("securityGroupId")
                    //設定虛擬交換器ID
                    .setVSwitchId("vSwitchId");;
            // 設定運行時參數
            RuntimeOptions runtime = new RuntimeOptions();
            // 調用 RunInstances 介面
            RunInstancesResponse response = client.runInstancesWithOptions(request, runtime);
            System.out.println(response.body.toMap());
        } catch (TeaUnretryableException ue) {
            // 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。
            ue.printStackTrace();
            // 列印錯誤資訊
            System.out.println(ue.getMessage());
            // 列印請求記錄,查詢錯誤發生時的請求資訊
            System.out.println(ue.getLastRequest());
        } catch (TeaException e) {
            // 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。
            e.printStackTrace();
            // 列印錯誤碼
            System.out.println(e.getCode());
            // 列印錯誤資訊,錯誤資訊中包含 RequestId
            System.out.println(e.getMessage());
            // 列印服務端返回的具體錯誤內容
            System.out.println(e.getData());
        } catch (Exception e) {
            // 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。
            e.printStackTrace();
        }
    }
}

通過Terraform建立

說明

以下操作步驟範例程式碼支援一鍵運行,您可以直接運行代碼。一鍵運行

前提條件

  • 建立AccessKey

    由於阿里雲帳號(主帳號)具有資源的所有許可權,防止AK泄露後被任意利用。建議您使用擁有最小化許可權的RAM使用者的AccessKey進行操作,具體操作方式請參見建立RAM使用者建立AccessKey

  • 建立自訂權限原則

    請參考以下樣本為RAM使用者建立自訂權限原則:允許啟動ECS執行個體、查看ECS執行個體的詳細資料以及查看ECS現貨執行個體的價格歷史。具體操作方式請參見建立自訂權限原則

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

使用的資源

操作步驟

  1. 開啟瀏覽器,訪問Cloud Shell的地址https://shell.aliyun.com,登入Cloud Shell。

    更多Cloud Shell入口及使用,請參見使用雲命令列

  2. 建立一個用於存放Terraform資源的專案檔夾,命名為terraform,進入專案目錄

    mkdir terraform
    cd terraform
  3. 建立名為main.tf的設定檔,檔案內容如下:

    main.tf

    provider "alicloud" {
      region = var.region
    }
    
    # 地區
    variable "region" {
      type    = string
      default = "cn-beijing"
    }
    
    # VPC 名稱
    variable "vpc_name" {
      type    = string
      default = "tf_test_fofo"
    }
    
    # VPC CIDR 塊
    variable "vpc_cidr_block" {
      type    = string
      default = "172.16.0.0/12"
    }
    
    # vSwitch CIDR 塊
    variable "vswitch_cidr_block" {
      type    = string
      default = "172.16.0.0/21"
    }
    
    # 可用性區域
    variable "availability_zone" {
      type    = string
      default = "cn-beijing-b"
    }
    
    # 安全性群組名稱
    variable "security_group_name" {
      type    = string
      default = "default"
    }
    
    # 執行個體規格
    variable "instance_type" {
      type    = string
      default = "ecs.n2.small"
    }
    
    # 系統硬碟類型
    variable "system_disk_category" {
      type    = string
      default = "cloud_efficiency"
    }
    
    # 作業系統鏡像
    variable "image_id" {
      type    = string
      default = "ubuntu_140405_64_40G_cloudinit_20161115.vhd"
    }
    
    # 執行個體名稱
    variable "instance_name" {
      type    = string
      default = "test_fofo"
    }
    
    # 公網頻寬
    variable "internet_max_bandwidth_out" {
      type    = number
      default = 10
    }
    
    # 付費類型
    variable "instance_charge_type" {
      type    = string
      default = "PostPaid"
    }
    
    # 搶佔式執行個體出價策略
    variable "spot_strategy" {
      type    = string
      default = "SpotAsPriceGo"
    }
    
    # 搶佔式執行個體的保留時間長度
    variable "spot_duration" {
      type    = number
      default = 0
    }
    
    # 入站規則連接埠範圍
    variable "port_range" {
      type    = string
      default = "1/65535"
    }
    
    # 入站規則優先順序
    variable "priority" {
      type    = number
      default = 1
    }
    
    # 入站規則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. 執行terraform init命令,初始化配置。

    image

  5. 執行terraform apply命令,在執行過程中,根據提示輸入yes並按下Enter鍵,等待命令執行完成,若出現以下資訊,則表示建立搶佔式執行個體完成。

    image

  6. 執行terraform show命令查詢Terraform已建立的資來源詳細資料。

    image

清理資源

當您不再需要上述通過Terraform建立或管理的資源時,請運行以下命令以釋放資源。更多資訊,請參見常用命令

terraform destroy

相關文檔

通過其他方式建立搶佔式執行個體

考慮到實際的資源使用情境,阿里雲提供了Auto Scaling、Container ServiceACK、彈性供應組等產品服務協助您提高資源建立和資源自動營運效率。

Auto Scaling

適用於需要動態響應業務負載波動,自動混合按量和搶佔式執行個體(比例可調),執行個體釋放時自動補充新執行個體。更多資訊,請參見在伸縮組使用搶佔式執行個體降低成本

Container ServiceACK

適用於無狀態、容錯性較好的應用,Kubernetes叢集需要低成本節點池,可以建立搶佔式執行個體節點池。更多資訊,請參見搶佔式執行個體節點池最佳實務

彈性供應組

彈性供應是一種快速交付ECS執行個體叢集的方案,簡單配置後即可自動在多個可用性區域內交付不同計費方式(隨用隨付和搶佔式執行個體)、多種執行個體規格的執行個體集合,提升批量交付大量執行個體的效率。更多資訊,請參見彈性供應組配置樣本