本文为您介绍如何通过接口CheckOutLicense校验服务实例有效期。
使用限制
需满足以下任意一个。
计算巢服务配置了自定义售卖。
计算巢服务上架在云市场。
校验原理
对于计算巢创建的资源,计算巢会将服务实例ID(ServiceInstanceId
)、服务ID(ServiceId
)等标签打在资源上,CheckOutLicense
通过资源所属标签判断所属服务实例。
服务商需从控制台获取对应计算巢服务实例的
ServiceId
。调用
CheckOutLicense
时将ServiceId
作为参数发送给计算巢,由计算巢判断传入的内容与资源中的是否一致。
接口调用示例
本示例是在符合使用限制的前提下,创建的ECS实例并调用CheckOutLicense。
获取ECS地域信息
在调用CheckOutLicense前,您需要获取应用部署的ECS地域(regionld)信息。获取到的地域信息会在后续步骤中使用,因此需要服务商记录。
访问如下网址,获得地域信息。
curl http://100.100.100.200/latest/meta-data/region-id
地域返回示例。
cn-hangzhou
在控制台获取
ServiceId
。请求示例
此处以在杭州地域发起调用为例,实际调用时应替换地域信息。
# 将ServiceId对应的值按实际情况替换。 curl -H "Content-Type: application/json" -XPOST https://cn-hangzhou.axt.aliyun.com/computeNest/license/check_out_license -d '{"ServiceId":"service-8fff945fe6844906****"}'
返回示例
{ "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()
运行示例:
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();
}
}
}
运行示例: