全部產品
Search
文件中心

Compute Nest:校正服務執行個體有效期間

更新時間:May 10, 2025

本文為您介紹如何通過介面CheckOutLicense校正服務執行個體有效期間。

使用限制

需滿足以下任意一個。

  • 計算巢服務配置了自訂售賣。

  • 計算巢服務上架在雲市場。

校正原理

對於計算巢建立的資源,計算巢會將服務執行個體ID(ServiceInstanceId)、服務ID(ServiceId)等標籤打在資源上,CheckOutLicense通過資源所屬標籤判斷所屬服務執行個體。

  1. 服務商需從控制台擷取對應計算巢服務執行個體的ServiceId

  2. 調用CheckOutLicense時將ServiceId作為參數發送給計算巢,由計算巢判斷傳入的內容與資源中的是否一致。

介面調用樣本

本樣本是在符合使用限制的前提下,建立的ECS執行個體並調用CheckOutLicense。

  1. 擷取ECS地區資訊

    在調用CheckOutLicense前,您需要擷取應用部署的ECS地區(regionld)資訊。擷取到的地區資訊會在後續步驟中使用,因此需要服務商記錄。

    1. 訪問如下網址,獲得地區資訊。

      curl http://100.100.100.200/latest/meta-data/region-id
    2. 地區返回樣本。

      cn-hangzhou
  2. 在控制台擷取ServiceId

    image

  3. 請求樣本

    此處以在杭州地區發起調用為例,實際調用時應替換地區資訊。

    # 將ServiceId對應的值按實際情況替換。
    curl -H "Content-Type: application/json" -XPOST https://cn-hangzhou.axt.aliyun.com/computeNest/license/check_out_license -d '{"ServiceId":"service-8fff945fe6844906****"}'
  4. 返回樣本

    {
        "code":200,
        "requestId":"6af1efb7-c59c-4cee-9094-e1e3bbefb639",
        "instanceId":"i-0jl957dfri612gxxxxxx",
        "result":{
            "RequestId":"B22723B7-FC31-18F5-A33E-1AF4C82736AA",
            "ServiceInstanceId":"si-0f14037f30c14292****",
            "LicenseMetadata":"{\"TemplateName\":\"Custom_Image_Ecs\",\"SpecificationName\":\"\",\"CustomData\":\"xxxx\"}",
            "TrialType":"NotTrial",
            "Token":"58d4574bd0d967bb431cd8936b5e80c4",
            "ExpireTime":"2024-08-28T06:27:08Z",
            "ServiceId":"service-8fff945fe6844906****",
            "Components":"{\"package_version\":\"yuncode55xxxxxxxx\",\"SystemDiskSize\":\"40\",\"DataDiskSize\":\"100\"}"
        }
     }

    主要參數解釋如下。

    參數

    描述

    樣本值

    ServiceInstanceId

    服務執行個體ID。

    si-0f14037f30c14292****

    ServiceId

    服務ID。

    service-8fff945fe6844906****

    ExpireTime

    服務執行個體的到期時間。

    2024-08-28T06:27:08Z

    LicenseMetadata

    中繼資料。

    需要在自訂售賣配置中定義該資料。

    {\"TemplateName\":\"Custom_Image_Ecs\",\"SpecificationName\":\"\",\"CustomData\":\"xxxx\"}

    Components

    雲市場額外計費項目資訊。

    {\"package_version\":\"yuncode55xxxxxxxx\",\"SystemDiskSize\":\"40\",\"DataDiskSize\":\"100\"}

範例程式碼

Python

import requests
import json
import hashlib
import time
from urllib.request import urlopen

def get_region_id():
    """通過阿里雲中繼資料服務擷取地區 ID(如 cn-hangzhou)"""
    try:
        with urlopen(
            "http://100.100.100.200/latest/meta-data/region-id",
            timeout=2
        ) as response:
            return response.read().decode().strip()
    except Exception as e:
        print(f"Failed to get region ID: {str(e)}", file=sys.stderr)
        sys.exit(1)

def checkout_license():
    # 動態擷取地區 ID 並構建 URL
    region_id = get_region_id()
    url = f"https://{region_id}.axt.aliyun.com/computeNest/license/check_out_license"

    # 發送 POST 請求
    try:
        response = requests.post(
            url,
            json={
              # 可選項可選是否輸入參數
              # "ServiceId": "service-ec9cbf77f9be443db938"
            },
            headers={"Content-Type": "application/json"}
        )
        print(f"Request URL: {url}")
        print(f"Status Code: {response.status_code}")
        print(f"Response: {response.text}")
    except Exception as e:
        print(f"Request Failed: {str(e)}", file=sys.stderr)

if __name__ == "__main__":
    import sys
    # 調用函數
    checkout_license()

運行樣本:

image

Java

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.MessageDigest;     

public class CheckoutLicense {
    public static void main(String[] args) {
        try {
            // === 動態擷取地區 ID === #
            String regionId = getRegionId();
            System.out.println("Detected Region ID: " + regionId);

            String checkoutLicenseString = "{}";
            // 可選項可選是否輸入參數
            // String checkoutLicenseString = "{\"ServiceId\": \"service-ec9cbf77f9be443db938\"}";

            // === 發送 POST 請求 === #
            String urlStr = "https://" + regionId + ".axt.aliyun.com/computeNest/license/check_out_license";
            URL url = new URL(urlStr);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setDoOutput(true);

            try (OutputStream os = conn.getOutputStream()) {
                byte[] input = checkoutLicenseString.getBytes("UTF-8");
                os.write(input, 0, input.length);
            }

            // === 讀取響應 === #
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            StringBuilder response = new StringBuilder();
            String responseLine;
            while ((responseLine = br.readLine()) != null) {
                response.append(responseLine);
            }
            conn.disconnect();
            System.out.println("Response: " + response.toString());
            System.out.println("Request URL: " + urlStr);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // === 動態擷取地區 ID(阿里雲中繼資料服務) === #
    private static String getRegionId() throws Exception {
        String regionIdUrl = "http://100.100.100.200/latest/meta-data/region-id";
        HttpURLConnection conn = (HttpURLConnection) new URL(regionIdUrl).openConnection();
        conn.setRequestMethod("GET");
        conn.setConnectTimeout(2000); // 2秒逾時
        conn.setReadTimeout(2000);

        try (BufferedReader in = new BufferedReader(
            new InputStreamReader(conn.getInputStream()))) {
            return in.readLine().trim();
        }
    }
}

運行樣本:

image