市場価格の変更またはリソース不足のためにプリエンプティブルインスタンスが強制的にリサイクルされた場合、中断イベントがトリガーされます。 プリエンプティブルインスタンスがリサイクルされる前に、インスタンスはロック状態になり、インスタンスが自動的にリサイクルされることを示すプロンプトが表示されます。 このトピックでは、プリエンプティブルインスタンスが中断されるかどうかを照会する方法について説明します。
方法1: CloudMonitor SDKの使用
このセクションでは、CloudMonitor SDK for Javaを使用してプリエンプティブルインスタンスの割り込みイベントをクエリする方法について説明します。
Cloud Monitor SDK for Javaにアクセスします。
詳細については、「SDK リファレンス」をご参照ください。
SDKを使用して、プリエンプティブルインスタンスの割り込みイベントを照会します。
サンプルコード:
com.aliyuncs.DefaultAcsClientをインポートします。com.aliyuncs.IAcsClientをインポートします。com.aliyuncs.exceptions.ClientExceptionをインポートします。com.aliyuncs.exceptions.ServerExceptionをインポートします。com.aliyuncs.profile.DefaultProfileをインポートします。com.google.gson.Gsonをインポートします。java.util.* をインポートします。com.aliyuncs.cms.mo del.v20190101をインポートします。*; publicクラスDescribeSystemEventAttribute { public static void main(String[] args) { // DefaultAcsClientインスタンスを初期化します。 // ALIBABA_CLOUD_ACCESS_KEY_ID環境変数とALIBABA_CLOUD_ACCESS_KEY_SECRET環境変数がコードランタイム環境で設定されていることを確認します。 // プロジェクトコードが漏洩すると、AccessKeyペアが漏洩し、アカウント内のリソースのセキュリティが侵害される可能性があります。 次のサンプルコードは、環境変数を使用してAccessKeyペアを取得し、AccessKeyペアを使用してAPI操作を呼び出す方法を示しています。 より高いセキュリティを提供するSecurity Token Service (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); // プリエンプティブルインスタンスの割り込みイベントを照会します。 DescribeInstanceAutoRenewAttributeRequest request = new DescribeInstanceAutoRenewAttributeRequest(); request.setRegionId("cn-hangzhou"); request.setProduct ( "ECS") ; request.setEventType ( "StatusNotification") ; request.setName ( "Instance:PreemptibleInstanceInterruption") ; try { // 応答を取得します。 DescribeClusterResponse 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
方法2: インスタンスメタデータを使用してプリエンプティブルインスタンスの割り込みイベントを照会する
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" = "<メタデータサーバーのアクセス資格情報の有効期間>"} -メソッドPUT -Uri http:// 100.100.100.200/latest/api/token
# プリエンプティブルインスタンスが中断およびリサイクルされているかどうかを照会します。
Invoke-RestMethod -Headers @{"X-aliyun-ecs-metadata-token" = $token} -メソッドGET -Uri http:// 100.100.100.200/latest/meta-data/instance/spot/termination-time
404が返された場合、インスタンスは使用可能です。
2015-01-05T18:02:00Z
などのUTCタイムスタンプが返された場合、インスタンスは指定された時点でリサイクルされる予定です。
API操作を呼び出してプリエンプティブルインスタンスの割り込みイベントを照会します
このセクションでは、DescribeInstances操作を呼び出して、応答内のOperationLocks配列に基づいてインスタンスがリリース対象状態であるかどうかを確認する方法について説明します。
nullが返された場合、インスタンスは使用可能です。
LockReasonパラメーターに対してRecyclingが返された場合、プリエンプティブルインスタンスは中断され、リサイクルされる予定です。
サンプルDescribeInstancesSample.javaコード:
com.alibaba.fastjson.JSONArrayをインポートします。com.aliyuncs.AcsRequestをインポートします。com.aliyuncs.AcsResponseをインポートします。com.aliyuncs.DefaultAcsClientをインポートします。com.aliyuncs.IAcsClientをインポートします。com.aliyuncs.ecs.mo del.v20140526.DescribeInstancesRequestをインポートします。com.aliyuncs.ecs.mo del.v20140526.DescribeInstancesResponseをインポートします。com.aliyuncs.profile.DefaultProfileをインポートします。com.aliyuncs.profile.IClientProfileをインポートします。java.util.* をインポートします。パブリッククラスDescribeInstancesSample {
public static void main(String[] args) throws InterruptedException {
// DefaultAcsClientインスタンスを初期化します。
OpenApiCaller caller = new OpenApiCaller();
// 1つ以上のインスタンスのIDを指定します。
JSONArray allInstances = new JSONArray();
allInstances.addAll (配列. asList("i-bp1i9c3qiv1qs6nc ****"));
しばらく(!allInstances.isEmpty()){
DescribeInstancesRequest request = new DescribeInstancesRequest();
// インスタンスのリージョンIDを指定します。
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());
}
}
}
}
// プリエンプティブルインスタンスがロックされていない場合、2分ごとに照会されます。
System.out.print( "後で再describeInstancesを試してみてください...");
Thread.sleep(2 * 60 * 1000);
} else {
break;
}
}
}
}
// DefaultAcsClientインスタンスを初期化します。
クラスOpenApiCaller {
IClientProfile profile;
IAcsClient client;
public OpenApiCaller() {
// ALIBABA_CLOUD_ACCESS_KEY_ID環境変数とALIBABA_CLOUD_ACCESS_KEY_SECRET環境変数がコードランタイム環境で設定されていることを確認します。
// プロジェクトコードが漏洩すると、AccessKeyペアが漏洩し、アカウント内のリソースのセキュリティが侵害される可能性があります。 次のサンプルコードは、環境変数を使用してAccessKeyペアを取得し、AccessKeyペアを使用してAPI操作を呼び出す方法の例を示しています。 より高いセキュリティを提供する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);
}キャッチ(ThrowableをE){
e.printStackTrace();
ヌルを返します。
}
}
}
リサイクルがトリガーされると、次のレスポンスが返されます。
結果: instance:i-bp1i9c3qiv1qs6nc ****,az:cn-hangzhou-i
インスタンス: i-bp1i9c3qiv1qs6nc ****->lockReason:Recycling,vmStatus:Stopped
スポットインスタンスはすぐにリサイクルされます。インスタンスid:i-bp1i9c3qiv1qs6nc ****