搶占式實例可能會因為價格因素或者市場供需變化而被強制回收,此時會觸發搶占式實例的中斷。搶占式實例被回收前會進入鎖定狀態,系統會提示您實例將會被自動回收。本文介紹如何查詢搶占式實例是否被中斷。
方式一:通過云監控SDK查詢
以云監控Java SDK為例,介紹如何查詢搶占式實例中斷事件。
接入云監控SDK。
具體操作,請參見SDK參考。
通過SDK查詢系統事件。
示例代碼如下所示:
import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.exceptions.ServerException; import com.aliyuncs.profile.DefaultProfile; import com.google.gson.Gson; import java.util.*; import com.aliyuncs.cms.model.v20190101.*; public class DescribeSystemEventAttribute { public static void main(String[] args) { // 初始化DefaultAcsClient實例。 // 請確保代碼運行環境設置了環境變量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。 // 工程代碼泄露可能會導致AccessKey泄露,并威脅賬號下所有資源的安全性。以下代碼示例使用環境變量獲取AccessKey的方式進行調用,建議使用更安全的STS方式。 DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")); IAcsClient client = new DefaultAcsClient(profile); // 查詢搶占式實例中斷事件。 DescribeSystemEventAttributeRequest request = new DescribeSystemEventAttributeRequest(); request.setRegionId("cn-hangzhou"); request.setProduct("ECS"); request.setEventType("StatusNotification"); request.setName("Instance:PreemptibleInstanceInterruption"); try { // 接收響應結果。 DescribeSystemEventAttributeResponse response = client.getAcsResponse(request); System.out.println(new Gson().toJson(response)); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { System.out.println("ErrCode:" + e.getErrCode()); System.out.println("ErrMsg:" + e.getErrMsg()); System.out.println("RequestId:" + e.getRequestId()); } } }
根據返回結果判斷搶占式實例中斷事件。
事件通知的JSON格式如下所示:
{ "ver": "1.0", "id": "2256A988-0B26-4E2B-820A-8A********E5", "product": "ECS", "resourceId": "acs:ecs:cn-hangzhou:169070********30:instance/i-bp1ecr********5go2go", "level": "INFO", "name": "Instance:PreemptibleInstanceInterruption", "userId": "169070********30", "eventTime": "20190409T121826.922+0800", "regionId": "cn-hangzhou", "content": { "instanceId": "i-bp1ecr********5go2go", "action": "delete" } }
content
字段解釋如下表所示。更多參數說明,請參見DescribeSystemEventAttribute。字段
說明
示例值
instanceId
搶占式實例的ID。
i-bp1ecr********5go2go
action
搶占式實例的操作事件。取值delete時表示搶占式實例中斷,將被強制回收。
delete
方式二:通過元數據在實例內部查詢
Linux實例
# 獲取元數據服務器的訪問憑證用于鑒權
TOKEN=`curl -X PUT "http://100.100.100.200/latest/api/token" -H "X-aliyun-ecs-metadata-token-ttl-seconds:<元數據服務器訪問憑證有效期>"`
# 查詢搶占式實例是否被中斷回收
curl -H "X-aliyun-ecs-metadata-token: $TOKEN" http://100.100.100.200/latest/meta-data/instance/spot/termination-time
Windows實例
# 獲取元數據服務器的訪問憑證用于鑒權
$token = Invoke-RestMethod -Headers @{"X-aliyun-ecs-metadata-token-ttl-seconds" = "<元數據服務器訪問憑證有效期>"} -Method PUT –Uri http://100.100.100.200/latest/api/token
# 查詢搶占式實例是否被中斷回收
Invoke-RestMethod -Headers @{"X-aliyun-ecs-metadata-token" = $token} -Method GET -Uri http://100.100.100.200/latest/meta-data/instance/spot/termination-time
如果返回404:實例可持續使用。
如果返回類似
2015-01-05T18:02:00Z
格式的信息(UTC時間):實例將于這個時間被回收。
方式三:通過API查詢
調用DescribeInstances,并根據返回的OperationLocks判斷實例是否進入待回收狀態。
若返回空值:實例可持續使用。
若返回LockReason值為Recycling:搶占式實例被中斷,處于待回收狀態。
代碼示例(DescribeInstancesSample.java)如下所示:
import com.alibaba.fastjson.JSONArray;
import com.aliyuncs.AcsRequest;
import com.aliyuncs.AcsResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.ecs.model.v20140526.DescribeInstancesRequest;
import com.aliyuncs.ecs.model.v20140526.DescribeInstancesResponse;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import java.util.*;
public class DescribeInstancesSample {
public static void main(String[] args) throws InterruptedException {
// 初始化DefaultAcsClient實例。
OpenApiCaller caller = new OpenApiCaller();
// 設置待查詢的一個或多個ECS實例ID。
JSONArray allInstances = new JSONArray();
allInstances.addAll(Arrays.asList("i-bp1i9c3qiv1qs6nc****"));
while (!allInstances.isEmpty()) {
DescribeInstancesRequest request = new DescribeInstancesRequest();
// 指定實例所在的地域。
request.setRegionId("cn-hangzhou");
// 指定實例ID,查詢效率高。
request.setInstanceIds(allInstances.toJSONString());
// 接收響應結果。
DescribeInstancesResponse response = caller.doAction(request);
// 獲取實例相關的返回結果。
List<DescribeInstancesResponse.Instance> instanceList = response.getInstances();
if (instanceList != null && !instanceList.isEmpty()) {
for (DescribeInstancesResponse.Instance instance : instanceList) {
// 輸出被查詢的實例ID與可用區信息。
System.out.println("result:instance:" + instance.getInstanceId() + ",az:" + instance.getZoneId());
if (instance.getOperationLocks() != null) {
for (DescribeInstancesResponse.Instance.LockReason lockReason : instance.getOperationLocks()) {
// 如果實例被鎖定,輸出指定實例ID以及對應的鎖定類型。
System.out.println("instance:" + instance.getInstanceId() + "-->lockReason:" + lockReason.getLockReason() + ",vmStatus:" + instance.getStatus());
if ("Recycling".equals(lockReason.getLockReason())) {
// 輸出即將被回收的實例ID信息。
System.out.println("spot instance will be recycled immediately, instance id:" + instance.getInstanceId());
allInstances.remove(instance.getInstanceId());
}
}
}
}
// 如果搶占式實例還未被鎖定,將每隔兩分鐘查詢一次。
System.out.print("try describeInstances again later ...");
Thread.sleep(2 * 60 * 1000);
} else {
break;
}
}
}
}
// 初始化DefaultAcsClient實例的類。
class OpenApiCaller{
IClientProfile profile;
IAcsClient client;
public OpenApiCaller() {
// 請確保代碼運行環境設置了環境變量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
// 工程代碼泄露可能會導致AccessKey泄露,并威脅賬號下所有資源的安全性。以下代碼示例使用環境變量獲取AccessKey的方式進行調用,建議使用更安全的STS方式。
profile = DefaultProfile.getProfile("cn-hangzhou", System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
client = new DefaultAcsClient(profile);
}
public <T extends AcsResponse> T doAction(AcsRequest<T> var1) {
try {
return client.getAcsResponse(var1);
} catch (Throwable e) {
e.printStackTrace();
return null;
}
}
}
觸發回收時輸出結果如下:
result:instance:i-bp1i9c3qiv1qs6nc****,az:cn-hangzhou-i
instance:i-bp1i9c3qiv1qs6nc****-->lockReason:Recycling,vmStatus:Stopped
spot instance will be recycled immediately, instance id:i-bp1i9c3qiv1qs6nc****
文檔內容是否對您有幫助?