スポット Elastic Compute Service (ECS) インスタンスは、市場価格の変動やリソース不足により、強制的に回収される場合があります。ビジネスがインスタンスの中断に敏感な場合は、できるだけ早くスポットインスタンスの中断イベントを検出して対応する必要があります。このトピックでは、スポットインスタンスの中断イベントを検出して対応する方法について説明します。
スポットインスタンスの中断イベントの検出
ECS SDK の使用
DescribeInstances 操作を呼び出して ECS インスタンスの情報をクエリし、応答の OperationLocks 配列に基づいて、スポットインスタンスが [回収待ち] 状態であるかどうかを判断できます。
スポットインスタンスの OperationLocks 配列が空の場合、インスタンスは使用可能です。
スポットインスタンスの OperationLocks 配列に
LockReasonパラメーターが含まれ、その値がRecyclingに設定されている場合、スポットインスタンスは中断され、[回収待ち] 状態になります。
ECS SDK を使用したスポットインスタンス中断イベントのクエリ例
準備
AccessKey ペアの作成
Resource Access Management (RAM) ユーザーの AccessKey ペアを作成します。Alibaba Cloud アカウントは、リソースに対するすべての権限を持っています。Alibaba Cloud アカウントの AccessKey ペアが漏洩すると、リソースが大きなリスクにさらされます。RAM ユーザーの AccessKey ペアを使用することをお勧めします。AccessKey ペアの作成方法の詳細については、「AccessKey ペアを作成する」をご参照ください。
RAM ユーザーへの ECS の権限付与
使用する RAM ユーザーに ECS リソースに対する権限を付与します。このトピックで提供されるサンプルコードは、ECS インスタンスに関する情報をクエリします。RAM ユーザーにサンプルコードを実行する権限を付与するには、RAM ユーザーに次のポリシーをアタッチすることをお勧めします。
クラウドサービス
ポリシー
ECS
AliyunECSFullAccess
アクセス認証情報の設定
使用する RAM ユーザーの AccessKey ペアを環境変数で設定します。このトピックで提供されるサンプルコードは、環境変数から AccessKey ペアを読み取り、その AccessKey ペアを Alibaba Cloud サービスにアクセスするための認証情報として使用します。環境変数で AccessKey ペアを設定する方法の詳細については、「Linux、macOS、および Windows で環境変数を設定する」をご参照ください。
ECS SDK のインストール
ECS SDK for Java を入手します。この例では、Maven の依存関係を追加して ECS SDK for Java をインストールします。他のインストール方法の詳細については、「ECS SDK for Java のインストール」をご参照ください。
クライアントの初期化
Alibaba Cloud SDK は、AccessKey ペアやセキュリティトークンサービス (STS) トークンなど、複数のアクセス認証情報をサポートしてクライアントを初期化します。詳細については、「アクセス認証情報の管理」をご参照ください。この例では、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"))
// エンドポイントを指定します。エンドポイントの詳細については、https://api.aliyun.com/product/Ecs をご参照ください。
.setEndpoint("ecs.cn-hangzhou.aliyuncs.com");
return new Client(config);
}
}API 操作のリクエストオブジェクトの作成
リクエストオブジェクトを作成する前に、呼び出す API 操作 のパラメーターを表示します。
// リクエストオブジェクトを作成します。
DescribeInstancesRequest request = new DescribeInstancesRequest().setRegionId("cn-hangzhou");
呼び出しの開始
クライアントから API 操作を呼び出すときに、タイムアウトパラメーターやプロキシパラメーターなどの実行時パラメーターを指定できます。詳細については、「高度な設定」をご参照ください。
// 実行時パラメーターを指定します。
RuntimeOptions runtime = new RuntimeOptions();
// DescribeInstances 操作を呼び出します。
DescribeInstancesResponse response = client.describeInstancesWithOptions(request, runtime);
System.out.println(response.body.toMap());例外の処理
ECS SDK for Java は、例外を次のタイプに分類します。
TeaUnretryableException: ほとんどの場合、このタイプの例外はネットワークエラーが原因で発生し、最大リトライ回数に達したときに報告されます。
TeaException: ほとんどの場合、このタイプの例外はビジネスエラーが原因で発生します。
システムの堅牢性と安定性を確保するために、例外の報告、例外のログ記録、リトライなどの操作を実行して、例外を適切に処理することをお勧めします。
例
import com.aliyun.ecs20140526.Client;
import com.aliyun.ecs20140526.models.DescribeInstancesRequest;
import com.aliyun.ecs20140526.models.DescribeInstancesResponse;
import com.aliyun.ecs20140526.models.DescribeInstancesResponseBody;
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"))
// エンドポイントを指定します。エンドポイントの詳細については、https://api.alibabacloud.com/product/Ecs をご参照ください。
.setEndpoint("ecs.cn-hangzhou.aliyuncs.com");
return new Client(config);
}
public static void main(String[] args) {
try {
Client client = Sample.createClient();
// リクエストオブジェクトを作成します。
// 1 つ以上の ECS インスタンスの ID を指定します。
JSONArray instanceIds = new JSONArray();
instanceIds.addAll(Arrays.asList("i-bp145cvd0exyqj****","i-bp1gehfgfrrk4lah****"));
DescribeInstancesRequest request = new DescribeInstancesRequest()
.setRegionId("cn-hangzhou")
.setInstanceIds(instanceIds.toJSONString());
// 実行時パラメーターを指定します。
RuntimeOptions runtime = new RuntimeOptions();
while (!instanceIds.isEmpty()) {
// DescribeInstances 操作を呼び出します。
DescribeInstancesResponse response = client.describeInstancesWithOptions(request, runtime);
// インスタンス固有の結果を取得します。
DescribeInstancesResponseBody responseBody = response.getBody();
DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstances instanceList = responseBody.getInstances();
// インスタンス情報を取得し、lockReason パラメーターの値に基づいてインスタンスのステータスを判断します。
if (instanceList != null && instanceList.getInstance()!= null && !instanceList.getInstance().isEmpty()) {
for (DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstance instance : instanceList.getInstance()) {
// クエリされたインスタンスの ID とゾーン ID を表示します。
System.out.println("result:instance:" + instance.getInstanceId() + ",az:" + instance.getZoneId());
if (instance.getOperationLocks() != null ) {
DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstanceOperationLocks operationLocks = instance.getOperationLocks();
if(operationLocks.getLockReason()!=null && !operationLocks.getLockReason().isEmpty()){
for (DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstanceOperationLocksLockReason lockReason : operationLocks.getLockReason()) {
// インスタンスがロックされている場合は、インスタンス 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());
instanceIds.remove(instance.getInstanceId());
}
}
}
}
}
// スポットインスタンスがロックされていない場合、インスタンスは 2 分ごとにクエリされます。
System.out.print("try describeInstances again later ...");
Thread.sleep(2 * 60 * 1000);
} else {
break;
}
}
} 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());
// リクエスト ID を含むエラーメッセージを表示します。
System.out.println(e.getMessage());
// サーバーから返された詳細なエラー情報を表示します。
System.out.println(e.getData());
} catch (Exception e) {
// 実際のビジネスシナリオでは例外を慎重に処理し、プロジェクトで例外を無視しないでください。この例では、例外は参考のためにのみ提供されています。
e.printStackTrace();
}
}
}
応答
スポットインスタンスの回収がトリガーされた場合、次の応答が返されます。
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****インスタンスメタデータの使用
スポットインスタンス内のメタデータサービスにアクセスして、インスタンスが終了 (停止およびリリース) される時刻を取得できます。インスタンスメタデータの詳細については、「インスタンスメタデータ」をご参照ください。
スポットインスタンスの終了時刻を指定するメタデータ項目: instance/spot/termination-time
上記のメタデータ項目の値:
404 が返された場合、インスタンスは使用可能です。
2015-01-05T18:02:00Zのような UTC タイムスタンプが返された場合、インスタンスは指定された時点で回収される予定です。
サンプルコード:
Linux ECS インスタンス
# メタデータサーバーのアクセス認証情報を取得して認証します。
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-timeWindows ECS インスタンス
# メタデータサーバーのアクセス認証情報を取得して認証します。
$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-timeCloudMonitor SDK の使用
ECS インスタンス関連のイベントは CloudMonitor に同期されます。CloudMonitor の DescribeSystemEventAttribute 操作を呼び出して、スポットインスタンスの中断イベント (Instance:PreemptibleInstanceInterruption イベント) をクエリし、応答の content パラメーターの action フィールドの値に基づいてスポットインスタンスの中断と回収がトリガーされたかどうかを判断できます。スポットインスタンスの content パラメーターの action フィールドの値が delete の場合、インスタンスの中断と回収がトリガーされます。
CloudMonitor SDK を使用したスポットインスタンス中断イベントのクエリ例
準備
AccessKey ペアの作成
RAM ユーザーの AccessKey ペアを作成します。Alibaba Cloud アカウントは、リソースに対するすべての権限を持っています。Alibaba Cloud アカウントの AccessKey ペアが漏洩すると、リソースが大きなリスクにさらされます。RAM ユーザーの AccessKey ペアを使用することをお勧めします。AccessKey ペアの作成方法の詳細については、「AccessKey ペアを作成する」をご参照ください。
RAM ユーザーへの CloudMonitor の権限付与
使用する RAM ユーザーに CloudMonitor の権限を付与します。このトピックで提供されるサンプルコードは、システムイベントをクエリします。RAM ユーザーにサンプルコードを実行する権限を付与するには、RAM ユーザーに次のポリシーをアタッチすることをお勧めします。
クラウドサービス
ポリシー
CloudMonitor
AliyunCloudMonitorFullAccess
アクセス認証情報の設定
使用する RAM ユーザーの AccessKey ペアを環境変数で設定します。このトピックで提供されるサンプルコードは、環境変数から AccessKey ペアを読み取り、その AccessKey ペアを Alibaba Cloud サービスにアクセスするための認証情報として使用します。環境変数で AccessKey ペアを設定する方法の詳細については、「Linux、macOS、および Windows で環境変数を設定する」をご参照ください。
CloudMonitor SDK のインストール
CloudMonitor SDK for Java を入手します。この例では、Maven の依存関係を追加して CloudMonitor SDK for Java をインストールします。他のインストール方法の詳細については、「CloudMonitor SDK for Java のインストール」をご参照ください。
クライアントの初期化
Alibaba Cloud SDK は、AccessKey ペアや STS トークンなど、複数のアクセス認証情報をサポートしてクライアントを初期化します。詳細については、「アクセス認証情報の管理」をご参照ください。この例では、AccessKey ペアを使用してクライアントを初期化します。
import com.aliyun.cms20190101.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"))
// エンドポイントを指定します。エンドポイントの詳細については、https://api.alibabacloud.com/product/Cms をご参照ください。
.setEndpoint("metrics.cn-hangzhou.aliyuncs.com");
return new Client(config);
}
}API 操作のリクエストオブジェクトの作成
DescribeSystemEventAttribute 操作の次のパラメーターを設定します。これらはスポットインスタンスの中断イベントをクエリするために必要です。
API | パラメーター | 説明 |
Product | サービス名の略称。値を ECS に設定します。 | |
EventType | イベントのタイプ。値を StatusNotification に設定します。 | |
Name | イベントの名前。値を Instance:PreemptibleInstanceInterruption に設定します。 |
// リクエストオブジェクトを作成します。
DescribeSystemEventAttributeRequest request = new DescribeSystemEventAttributeRequest()
.setProduct("ECS");
.setEventType("StatusNotification");
.setName("Instance:PreemptibleInstanceInterruption");
呼び出しの開始
クライアントから API 操作を呼び出すときに、タイムアウトパラメーターやプロキシパラメーターなどの実行時パラメーターを指定できます。詳細については、「高度な設定」をご参照ください。
// 実行時パラメーターを指定します。
RuntimeOptions runtime = new RuntimeOptions();
// DescribeInstances 操作を呼び出します。
DescribeSystemEventAttributeResponse response = client.describeSystemEventAttributeWithOptions(request, runtime);
System.out.println(response.body.toMap());
例外の処理
CloudMonitor SDK for Java は、例外を次のタイプに分類します。
TeaUnretryableException: ほとんどの場合、このタイプの例外はネットワークエラーが原因で発生し、最大リトライ回数に達したときに報告されます。
TeaException: ほとんどの場合、このタイプの例外はビジネスエラーが原因で発生します。
システムの堅牢性と安定性を確保するために、例外の報告、例外のログ記録、リトライなどの操作を実行して、例外を適切に処理することをお勧めします。
例
import com.aliyun.cms20190101.Client;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.cms20190101.models.DescribeSystemEventAttributeRequest;
import com.aliyun.cms20190101.models.DescribeSystemEventAttributeResponse;
import com.aliyun.tea.TeaException;
import com.aliyun.tea.TeaUnretryableException;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
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"))
// エンドポイントを指定します。エンドポイントの詳細については、https://api.alibabacloud.com/product/Ecs をご参照ください。
.setEndpoint("metrics.cn-hangzhou.aliyuncs.com");
return new Client(config);
}
public static void main(String[] args) {
try {
Client client = Sample.createClient();
// リクエストオブジェクトを作成します。
DescribeSystemEventAttributeRequest request = new DescribeSystemEventAttributeRequest()
.setProduct("ECS");
.setEventType("StatusNotification");
.setName("Instance:PreemptibleInstanceInterruption");
// 実行時パラメーターを指定します。
RuntimeOptions runtime = new RuntimeOptions();
// DescribeSystemEventAttribute 操作を呼び出します。
DescribeSystemEventAttributeResponse response = client.describeSystemEventAttributeWithOptions(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());
// リクエスト ID を含むエラーメッセージを表示します。
System.out.println(e.getMessage());
// サーバーから返された詳細なエラー情報を表示します。
System.out.println(e.getData());
} catch (Exception e) {
// 実際のビジネスシナリオでは例外を慎重に処理し、プロジェクトで例外を無視しないでください。この例では、例外は参考のためにのみ提供されています。
e.printStackTrace();
}
}
}応答
応答に基づいてスポットインスタンスの中断イベントを特定します。
次のセクションでは、スポットインスタンスの中断イベント通知のサンプルを 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 |
CloudMonitor でのシステムイベントのサブスクライブ
CloudMonitor でシステムイベントをサブスクライブして、スポットインスタンスの中断イベントをリアルタイムで監視し、ショートメッセージやメールなどの指定された通知方法に基づいてイベントのアラート通知を送信し、Simple Message Queue (旧称:MNS) (SMQ)、Simple Log Service、Function Compute、Webhook などのさまざまなプッシュチャンネルにアラート通知をプッシュします。
ワークフロー
手順
プッシュチャンネルの作成
SMQ
Simple Message Queue (旧称:MNS) コンソールにログインします。
左側のナビゲーションウィンドウで、 を選択します。
上部のナビゲーションバーで、リージョンを選択します。
キュー ページで、キューを作成 をクリックします。
キューを作成 パネルで、次のパラメーターを設定し、OK をクリックします。
名前: キューの名前。
メッセージの最大長さ: キューに送信されるメッセージの最大長。
ロングポーリング期間: ReceiveMessage 操作が呼び出された後、ロングポーリングリクエストが保持される最大期間。
メッセージの可視性タイムアウト時間: メッセージがキューから受信された後、メッセージが非アクティブ状態のままである期間。
メッセージの保持期間: メッセージがキューに存在する最大期間。指定された保持期間が経過すると、メッセージが受信されたかどうかに関係なく、メッセージは削除されます。
メッセージ遅延時間: キューに送信されたすべてのメッセージが消費されるまでの期間。
ログ機能の有効化: ロギング機能を有効にするかどうかを指定します。
キューが作成されると、キュー ページに表示されます。
Webhook
重要Webhook サービスは、インターネットにアクセスできるサーバーにデプロイする必要があります。サーバーの Webhook ポートが、対応するセキュリティグループとファイアウォールで開いていることを確認してください。
Java のサンプルコード:
import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController public class WebhookController { @PostMapping("/callback") public ResponseEntity<String> receiveWebhook(@RequestBody String payload) { // ペイロードを処理します (ロギングやビジネスロジックの実行など)。 System.out.println("Received webhook payload: " + payload); // 成功応答を返します。 return ResponseEntity.ok("Webhook received"); } }サブスクリプションポリシーの作成
CloudMonitor コンソールにログインします。
左側のナビゲーションウィンドウで、 を選択します。
[サブスクリプションポリシー] タブで、[サブスクリプションポリシーの作成] をクリックします。
[サブスクリプションポリシーの作成] ページで、パラメーターを設定します。
スポットインスタンスの中断イベントをサブスクライブするために必要な次のパラメーターに注意してください。他のパラメーターの詳細については、「イベントサブスクリプションの管理 (推奨)」をご参照ください。
基本情報: サブスクリプションポリシーの名前と説明を入力します。
アラームサブスクリプション:
サブスクリプションタイプ: [システムイベント] を選択します。
サブスクリプション範囲:
製品: Elastic Compute Service (ECS) を選択します。
イベントタイプ:[ステータス通知] を選択します。
イベント名: [Instance:PreemptibleInstanceInterruption] を選択します。
イベントレベル: [警告 (Warning)] を選択します。
アプリケーショングループ、イベント内容、および イベントリソース: パラメーターを空のままにします。これは、現在のアカウントに属するすべてのアプリケーショングループ内のすべての ECS インスタンスの [Instance:PreemptibleInstanceInterruption] システムイベントをサブスクライブすることを示します。
複合ノイズリダクション: デフォルト設定を使用します。
通知: [カスタム通知方法] パラメーターには、デフォルト設定を使用します。
プッシュと統合: [チャンネルの追加] をクリックします。表示されるダイアログボックスで、[チャンネルの増加] をクリックします。[プッシュチャンネルの作成] パネルで、[ターゲットタイプ] パラメーターをステップ 1 で作成したプッシュチャンネルに設定します。次に、画面の指示に従って他のパラメーターを設定します。プッシュチャンネルの詳細については、「プッシュチャンネルの管理」をご参照ください。
スポットインスタンス中断イベントのシミュレーション
スポットインスタンスの中断イベントはトリガーイベントです。スポットインスタンスの中断イベントハンドラを開発するとき、コードをデバッグすることはできません。CloudMonitor の [イベントサブスクリプションのデバッグ] 機能を使用して、スポットインスタンスの中断イベントをシミュレートできます。
[サブスクリプションポリシー] タブで、[イベントサブスクリプションのデバッグ] をクリックします。
[イベントデバッグの作成] パネルで、[プロダクト] パラメーターを [Elastic Compute Service (ECS)] に、[名前] パラメーターを [Instance:PreemptibleInstanceInterruption] に設定します。
CloudMonitor は、JSON 形式でデバッグコンテンツを自動的に生成します。デバッグコンテンツ内のリソース情報を、中断イベントをシミュレートするスポットインスタンスの情報に置き換えます。
<Alibaba Cloud アカウント ID>変数を Alibaba Cloud アカウントの ID に置き換えます。<リソース ID>と<インスタンス ID>変数をスポットインスタンスの ID に置き換えます。<リージョン ID>変数をスポットインスタンスのリージョン ID に置き換えます。{ "product": "ECS", "resourceId": "acs:ecs:cn-shanghai:<Alibaba Cloud アカウント ID>UID:instance/<リソース ID>", "level": "WARN", "instanceName": "instanceName", "regionId": "<リージョン ID>", "groupId": "0", "name": "Instance:PreemptibleInstanceInterruption", "content": { "instanceId": "i-2zeg014dfo4y892z***", "instanceName": "wor***b73", "action": "delete" }, "status": "Normal" }
[OK] をクリックします。
[操作は成功しました] メッセージが表示されます。CloudMonitor は、サブスクリプションポリシーで指定された通知方法に基づいて、テストアラート通知を自動的に送信します。
スポットインスタンス中断イベントのアラート通知の受信と表示
SMQ
SMQ コンソールにログインします。左側のナビゲーションウィンドウで、[キューモデル] > [キュー] を選択します。
上部のナビゲーションバーで、リージョンを選択します。キュー ページで、管理するキューを見つけ、[操作] 列の メッセージの送受信 をクリックします。
(オプション) [クイックエクスペリエンス] ページの [メッセージの受信] セクションで、受信メッセージパラメータの編集 をクリックします。受信メッセージパラメータの編集 パネルで、一回に取得できる最大メッセージ数 と ポーリング期間 パラメーターを設定し、[OK] をクリックします。
[クイックエクスペリエンス] ページで、メッセージを受信 をクリックします。メッセージのリストが [メッセージの受信] セクションに表示されます。
(オプション) メッセージリストでメッセージを見つけ、[操作] 列の 詳細情報 をクリックします。[メッセージ詳細] ダイアログボックスで、メッセージ内容などのメッセージに関する情報を表示します。
Webhook
Webhook サービスの呼び出しログと、サービスにプッシュされたアラート通知を表示します。
スポットインスタンス中断イベントへの対応
ビジネスシナリオと要件に基づいて、スポットインスタンスの中断イベントに対応します。アプリケーションをテストして、アプリケーションがスポットインスタンスの中断と回収を適切に処理できることを確認することをお勧めします。参考のために、いくつかのアイデアと提案を以下に示します。
スポットインスタンスの中断を適切に処理する
中断イベント通知にタイムリーに対応し、タスク処理の進行状況を保存し、リソースをクリアし、タスクを終了します。
データの永続化とチェックポイント
タスク処理の進行状況と中間結果を、オンプレミスのファイルやデータベースなどの永続ストレージに定期的に保存して、重要なビジネスデータと構成が保持されるようにします。スポットインスタンスのデータを保持および復元する方法の詳細については、「スポットインスタンスのデータを保持および復元する」をご参照ください。
サービス統合が成功したかどうかを確認する
CloudMonitor でスポットインスタンスの中断イベントをシミュレートし、アプリケーションが期待どおりに応答するかどうかを確認します。詳細については、「SMQ を使用してスポットインスタンスの中断イベントを検出して対応する」をご参照ください。