プリエンプティブルインスタンスは、価格要因または市場の需給変動により強制的に回収される場合があります。ビジネスがインスタンスの割り込みに影響を受けやすい場合は、プリエンプティブルインスタンスの割り込みイベントをタイムリーに認識し、それに応じて対応することに注意する必要があります。このドキュメントでは、さまざまな方法で割り込みイベントを認識する方法について説明します。
割り込みイベントを確認する
ECS SDK を使用してクエリを実行する
Elastic Compute Service(ECS)の DescribeInstances インターフェースを使用してインスタンス情報をクエリし、返された Recycling ステータスに基づいて、インスタンスが OperationLocks 状態になっているかどうかを確認します。
null が返された場合、インスタンスは使用可能です。
スポットインスタンスの OperationLocks 配列に、
LockReason
パラメーターが含まれており、それがRecycling
に設定されている場合、スポットインスタンスは中断され、リサイクル予定状態にあります。
SDK 呼び出し例
準備
AccessKey を作成する
Alibaba Cloud アカウントはリソースに対するすべての権限を持っているため、AccessKey が漏洩した場合、大きなリスクとなります。したがって、最小限の権限要件を満たす RAM ユーザーの AccessKey を使用することをお勧めします。詳細については、「AccessKey を作成する」をご参照ください。
RAM ユーザーに ECS 関連の権限を付与する
RAM ユーザーに ECS 関連のリソースを操作する権限を付与します。このドキュメントで提供されているサンプルコードでは、インスタンス情報クエリを作成する必要があります。次の権限を付与することをお勧めします。
クラウドプロダクト
付与された権限
Elastic Compute Service (ECS)
この例では、システムポリシーである AliyunECSFullAccess を選択します
アクセス認証情報を構成する
このドキュメントのサンプルコードは、クラウドサービスにアクセスするための認証情報として、システム環境変数から AccessKey を読み取ります。具体的な手順については、「Linux、macOS、および Windows で環境変数を構成する」をご参照ください。
ECS SDK をインストールする
ECS SDK を取得します。このドキュメントでは、Maven の依存関係を追加することでインストールします。その他のインストール方法については、ECS Java SDK のインストール を参照してください。
クライアントを初期化する
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 ドキュメント を参照してパラメータ情報を取得してください。
// リクエストオブジェクトを作成する
DescribeInstancesRequest request = new DescribeInstancesRequest().setRegionId("cn-hangzhou");
呼び出しを開始する
クライアントを介して OpenAPI を呼び出す場合、タイムアウト構成やプロキシ構成などのランタイムパラメータを設定できます。詳細については、「詳細設定」をご参照ください。
// ランタイムパラメータを指定する
RuntimeOptions runtime = new RuntimeOptions();
// DescribeInstances インターフェースを呼び出す
DescribeInstancesResponse response = client.describeInstancesWithOptions(request, runtime);
System.out.println(response.body.toMap());
例外処理
Java SDK は、例外を TeaUnretryableException と TeaException に分類します。
TeaUnretryableException: このタイプの例外は、ネットワークの問題が原因で発生します。再試行回数が上限に達すると、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.aliyun.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 とゾーン情報を表示します。
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("スポットインスタンスはすぐにリサイクルされます。インスタンス ID:" + instance.getInstanceId());
instanceIds.remove(instance.getInstanceId());
}
}
}
}
}
// プリエンプティブルインスタンスがロックされていない場合は、2 分ごとにクエリされます。
System.out.print("後で DescribeInstances を再試行します...");
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
スポットインスタンスはすぐにリサイクルされます。インスタンス ID:i-bp1i9c3qiv1qs6nc****
インスタンス内からメタデータを使用してクエリを実行する
ECS インスタンス内のメタデータサービスにアクセスして、プリエンプティブルインスタンスの終了時刻を取得できます。インスタンスメタデータの詳細については、「インスタンスメタデータ」をご参照ください。
スポットインスタンスの終了時刻を指定するメタデータ項目: instance/spot/termination-time
予期される結果:
404 エラーが返された場合、インスタンスは終了予定されていません。
2015-01-05T18:02:00Z
などの UTC タイムスタンプが返された場合、インスタンスは指定された時点で回収される予定です。
呼び出しの例:
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
CloudMonitor SDK を使用してクエリを実行する
ECS インスタンス関連のイベントは CloudMonitor に同期されます。CloudMonitor の DescribeSystemEventAttribute オペレーションを呼び出して、スポットインスタンスの中断イベント(Instance:PreemptibleInstanceInterruption
イベント)をクエリし、レスポンスの content
パラメーターの action フィールドの値に基づいて、スポットインスタンスの中断と回収がトリガーされたかどうかを判断できます。スポットインスタンスの content パラメーターの action フィールドの値が delete
の場合、インスタンスの中断と回収がトリガーされます。
SDK 呼び出し例
準備
AccessKey を作成する
Alibaba Cloud アカウントはリソースに対するすべての権限を持っているため、AccessKey が漏洩すると重大なリスクが生じます。必要な最小限の権限を持つ RAM ユーザーの AccessKey を使用することをお勧めします。詳細については、「AccessKey を作成する」をご参照ください。
RAM ユーザーに CMS 関連の権限を付与する
RAM ユーザーに CloudMonitor CMS を操作する権限を付与します。このドキュメントのサンプルコードではシステムイベントのクエリが必要となるため、次の権限を付与することをお勧めします。
クラウドプロダクト
付与された権限
CloudMonitor CMS
AliyunCloudMonitorFullAccess
アクセス認証情報を構成する
このドキュメントのサンプルコードは、クラウドサービスにアクセスするための認証情報として、システム環境変数から AccessKey を使用します。具体的な構成手順については、「Linux、macOS、および Windows で環境変数を構成する」をご参照ください。
CMS SDK をインストールする
CMS SDK を取得します。このドキュメントでは、Maven の依存関係によるインストールについて説明します。その他のインストール方法については、 と CMS Java SDK のインストール を参照してください。
クライアントを初期化する
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.aliyun.com/product/Ecs を参照してください
.setEndpoint("metrics.cn-hangzhou.aliyuncs.com");
return new Client(config);
}
}
インターフェースのリクエストオブジェクトを作成する
プリエンプティブルインスタンスの割り込みイベントのクエリパラメータを設定します。その他のパラメータについては、「DescribeSystemEventAttribute」をご参照ください。
API | パラメータ | サンプル値 |
Product | 製品の略語: ECS | |
EventType | イベントタイプ: StatusNotification | |
Name | イベント名: Instance:PreemptibleInstanceInterruption |
// リクエストオブジェクトを作成する
DescribeSystemEventAttributeRequest request = new DescribeSystemEventAttributeRequest()
.setProduct("ECS");
.setEventType("StatusNotification");
.setName("Instance:PreemptibleInstanceInterruption");
呼び出しを開始する
クライアントを介して OpenAPI を呼び出す場合、タイムアウトやプロキシ構成などのランタイムパラメータを設定できます。詳細については、「詳細設定」をご参照ください。
// ランタイムパラメータを指定する
RuntimeOptions runtime = new RuntimeOptions();
// DescribeInstances インターフェースを呼び出す
DescribeSystemEventAttributeResponse response = client.describeSystemEventAttributeWithOptions(request, runtime);
System.out.println(response.body.toMap());
例外処理
Java SDK は、例外を TeaUnretryableException と TeaException に分類します。
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.aliyun.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 システムイベントをサブスクライブすることにより、プリエンプティブルインスタンスのリアルタイムの割り込みイベントを監視し、ショートメッセージ、メール、Function Compute、メッセージキュー、Webhook などのさまざまなチャネルを通じてプッシュ通知を送信できます。
ワークフロー
手順
受信チャネルを準備する
Function Compute
Function Compute コンソール にログインします。左側のナビゲーションウィンドウで、[関数] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。[サービス] ページで、目的のサービスをクリックします。
[関数] ページで、[関数の作成] をクリックします。
[関数の作成] ページで、関数を作成する方法を選択し、次のパラメータを設定して、[作成] をクリックします。
説明この例では、組み込みランタイムの使用 と カスタムランタイムの使用 が使用されています。Function Compute が提供するランタイムがビジネス要件を満たせない場合は、コンテナーイメージの使用 を選択して関数を 作成 できます。詳細については、「カスタムコンテナ関数の作成」をご参照ください。
[基本設定]: [関数名] や [ハンドラタイプ] など、関数の基本情報を設定します。[ハンドラタイプ] は、次のいずれかの値に設定できます。
[イベントハンドラ]: タイマーの使用、API オペレーションの呼び出し、SDK の使用、または他の Alibaba Cloud サービスと統合されたトリガーを使用して関数をトリガーします。
[HTTP ハンドラ]: HTTP リクエストまたは WebSocket リクエストによって関数の実行をトリガーします。Web シナリオでは、カスタムランタイムの使用 を選択することをお勧めします。
[コード] セクションで、関数のランタイムとコード関連の情報を設定します。
パラメータ
説明
例
[ランタイム]
Function ComputePython、Java、PHP、Node.js などのプログラミング言語を選択します。Function Compute でサポートされているランタイムの詳細については、「Function Compute でサポートされているランタイム」をご参照ください。
Node.js 14
[コードのアップロード方法]
Function Compute に機能コードをアップロードする方法を選択します。
[サンプルコードを使用]: Function Compute が提供するサンプルコードを選択して、ビジネス要件に基づいて関数を作成します。これはデフォルトのメソッドです。
[ZIP をアップロード]: コードを含む ZIP パッケージを選択してアップロードします。
[JAR をアップロード]: 関数コードを含む JAR ファイルを選択してアップロードします。
[フォルダをアップロード]: 関数コードを含むフォルダを選択してアップロードします。
[OSS]: 関数コードの [バケット名] パラメータと [オブジェクト名] パラメータを指定します。
説明[コードのアップロード方法] を [サンプルコードを使用] に設定した場合、[ハンドラ] を変更する必要はありません。別のコードアップロード方法を選択した場合は、ビジネス要件に基づいて [ハンドラ] を変更する必要があります。そうしないと、関数の実行時にエラーが報告されます。
[ランタイム] を [Java 8] または [Java 11] に設定した場合、[サンプルコードを使用]、[JAR をアップロード]、または [OSS] のみを選択して関数コードをアップロードできます。他のランタイムの場合は、[サンプルコードを使用]、[ZIP をアップロード]、[フォルダをアップロード]、または [OSS] を選択できます。
サンプルコードを使用
[起動コマンド]
説明このパラメータは、カスタムランタイムの使用 を選択して関数を作成する場合にのみ設定する必要があります。
プログラムの起動コマンドを設定します。起動コマンドを設定しない場合は、コードのルートディレクトリに bootstrap という名前の起動スクリプトを手動で作成する必要があります。bootstrap スクリプトは、プログラムを起動するために使用されます。
npm run start
[リスニングポート]
説明このパラメータは、カスタムランタイムの使用 を選択して関数を作成する場合にのみ設定する必要があります。
コード内の HTTP サーバーがリスニングするポートを指定します。
9000
[詳細設定]: インスタンス情報と関数の実行タイムアウト期間を設定します。
パラメータ
説明
例
[仕様]
ビジネス要件に基づいて、[vCPU 容量] と [メモリ容量] を設定します。リソースの課金については、「課金の概要」をご参照ください。
説明vCPU 容量とメモリ容量 (GB) の比率は 1:1 から 1:4 の範囲で設定する必要があります。
0.35 vCPU、512 MB
[一時ディスクのサイズ]
ビジネス要件に基づいて、ファイルを一時的に保存するために使用するハードディスクのサイズを指定します。
有効な値:
512 MB(デフォルト): このサイズのテンポラリ ディスクの使用は課金されません。Function Compute は 512 MB の無料ディスク容量を提供します。
10 GB: 9.5 GB のディスクサイズに基づいて課金されます。
説明データは一時ハードディスクのすべてのディレクトリに書き込むことができます。ディレクトリは一時ハードディスクのスペースを共有します。
一時ハードディスクのライフサイクルは、基盤となるインスタンスのライフサイクルと一致します。インスタンスがシステムによってリサイクルされると、ハードディスク上のデータはクリアされます。保存されたデータを永続化するには、NAS ファイルシステムまたは Object Storage Service (OSS) を使用できます。詳細については、「NAS ファイルシステムを設定する」および「OSS ファイルシステムを設定する」をご参照ください。
512 MB
[インスタンスの同時実行性]
インスタンスの同時実行性を指定します。詳細については、「インスタンスの同時実行性を設定する」をご参照ください。
10
[実行タイムアウト期間]
関数の実行のタイムアウト期間を指定します。[実行タイムアウト期間] のデフォルト値は 60 秒で、最大値は 86,400 秒です。
60
[ハンドラ]
関数のハンドラを指定します。Function Compute ランタイムは、ハンドラをロードして呼び出し、リクエストを処理します。 カスタムランタイムの使用 または [コンテナイメージを使用] を選択した場合は、このパラメーターは必須ではありません。
説明[コードのアップロード方法] を [サンプルコードを使用] に設定した場合、[ハンドラ] を変更する必要はありません。別のコードアップロード方法を選択した場合は、ビジネス要件に基づいて [ハンドラ] を変更する必要があります。そうしないと、関数の実行時にエラーが報告されます。
index.handler
[タイムゾーン]
関数のタイムゾーンを指定します。関数のタイムゾーンを設定すると、環境変数 [TZ] が関数に自動的に追加されます。値は設定したタイムゾーンです。
UTC
[環境変数]: 関数のランタイムの環境変数を設定します。詳細については、「環境変数」をご参照ください。
[トリガー設定] セクションで、ビジネス要件に基づいて関数のトリガーを設定します。トリガーを使用して関数をトリガーできます。詳細については、「トリガーを管理する」をご参照ください。
Simple Message Queue
SMQ コンソール にログインします。
左側のナビゲーションウィンドウで、[キューモデル] > キュー を選択します。
上部のナビゲーションバーで、リージョンを選択します。
キュー ページで、キューを作成 をクリックします。
キューを作成 パネルで、次のパラメータを設定し、OK をクリックします。
名前: キューの名前。
メッセージの最大長さ: キューに送信されるメッセージの最大長。
ロングポーリング期間: ReceiveMessage オペレーションが呼び出された後、ロングポーリングリクエストが保持される最大期間。
メッセージの可視性タイムアウト時間: メッセージがキューから受信された後、メッセージが非アクティブ状態にとどまる期間。
メッセージの保持期間: メッセージがキューに存在する最大期間。指定された保存期間の後、メッセージが受信されたかどうかに関係なく、メッセージは削除されます。
メッセージ遅延時間: キューに送信されたすべてのメッセージが消費されるまでの期間。
ログ機能の有効化: ロギング機能を有効にするかどうかを指定します。
キューが作成されると、キュー ページに表示されます。
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) { // Webhook ペイロードを受信する // ペイロードを処理する(例:ロギングまたはビジネスロジック処理) System.out.println("Received webhook payload: " + payload); // 成功レスポンスを返す return ResponseEntity.ok("Webhook received"); } }
サブスクリプションポリシーを作成する
CloudMonitor コンソール にログインします。
左側のナビゲーションウィンドウで、
を選択します。[サブスクリプションポリシー] タブで、[サブスクリプションポリシーの作成] をクリックします。
[サブスクリプションポリシーの作成] ページで、サブスクリプションポリシーの関連パラメータを設定します。
この例では、プリエンプティブルインスタンスの割り込みイベントのサブスクライブに関連するパラメータのみを説明します。その他のパラメータの説明については、「<イベントサブスクリプションの管理 (推奨)」をご参照ください。
[基本情報]: サブスクリプションポリシーの [名前] と [説明] を入力します。
[アラートサブスクリプション]:
[サブスクリプションタイプ]: [システムイベント] を選択します。
[サブスクリプションスコープ]:
[プロダクト]: [elastic Compute Service (ECS)] を選択します。
[イベントタイプ]: [ステータス通知] を選択します。
[イベント名]: [プリエンプティブルインスタンスの割り込み通知] を選択します。
[イベントレベル]: [警告] を選択します。
[アプリケーショングループ]、[イベントコンテンツ]、および [イベントリソース]: これらのパラメータは設定しません。これは、このアカウント内のすべてのアプリケーショングループのすべての ECS インスタンスのすべてのシステムイベントが [プリエンプティブルインスタンスの割り込み通知] をサブスクライブしていることを示します。
[マージとノイズリダクション]: デフォルト値を使用します。
[通知]: [カスタム通知方法] のデフォルトの通知方法を使用します。
[プッシュと統合]: [チャネルを追加] をクリックします。ポップアップウィンドウで、[チャネルを追加] をクリックします。[ターゲットタイプ] に手順 1 で準備したチャネルを選択します。指示に従って他のパラメータを入力します。プッシュチャネルの詳細については、「プッシュチャネルの管理」をご参照ください。
割り込みイベントをシミュレートする
プリエンプティブルインスタンスの割り込みイベントは、パッシブにトリガーされるイベントです。プリエンプティブルインスタンスの割り込みイベントハンドラを開発する場合、コードを効果的にデバッグすることはできません。[イベントサブスクリプションのデバッグ] を使用して、プリエンプティブルインスタンスの割り込みイベントをシミュレートできます。
[サブスクリプションポリシー] タブで、[イベントサブスクリプションのデバッグ] をクリックします。
[イベントデバッグの作成] パネルで、[プロダクト] を [elastic Compute Service (ECS)] として選択し、[名前] を [プリエンプティブルインスタンスの割り込み通知] として選択します。
システムは JSON 形式でデバッグコンテンツを自動的に生成します。JSON ファイルのリソース関連情報を、割り込みイベントをシミュレートするプリエンプティブルインスタンスの情報に置き換える必要があります。
<Alibaba Cloud アカウント ID>
変数を Alibaba Cloud アカウント ID に置き換えます。<resource-id>
変数と<instanceId>
変数をスポットインスタンスの ID に置き換えます。<リージョン ID>
変数をスポットインスタンスのリージョン ID に置き換えます。{ // デバッグコンテンツの例 "product": "ECS", // プロダクト名。変更しないでください。 "resourceId": "acs:ecs:cn-shanghai:Alibaba Cloud アカウント UID:instance/<resource-id>", // リソース ID。<resource-id> を実際の値に置き換えてください。 "level": "WARN", // イベントレベル。変更しないでください。 "instanceName": "instanceName", // インスタンス名 "regionId": "<region ID>", // リージョン ID。<region ID> を実際の値に置き換えてください。 "groupId": "0", // アプリケーショングループ ID "name": "Instance:PreemptibleInstanceInterruption", // イベント名。変更しないでください。 "content": { // イベントコンテンツ "instanceId": "i-2zeg014dfo4y892z***", // インスタンス ID。<instanceId> を実際の値に置き換えてください。 "instanceName": "wor***b73", // インスタンス名 "action": "delete" // アクション。変更しないでください。 }, "status": "Normal" // ステータス }
[OK] をクリックします。
システムに [操作は成功しました] メッセージが表示されます。その後、CloudMonitor はサブスクリプションポリシーで指定された通知方法に従って、アラームテスト通知を自動的に発行します。
受信と表示
Function Compute
Function Compute コンソール にログインします。左側のナビゲーションウィンドウで、[サービスと関数] をクリックします。
トップメニューバーで、リージョンを選択します。[サービスリスト] ページで、[アクション] 列のターゲットサービスをクリックし、[関数管理] をクリックします。
[関数管理] ページで、ターゲットの関数名をクリックします。関数の詳細ページで、[呼び出しログ] タブをクリックします。
Simple Message Queue
SMQ コンソール にログインします。左側のナビゲーションウィンドウで、[キューモデル] > [キュー] を選択します。
上部のナビゲーションバーで、リージョンを選択します。キュー ページで、管理するキューを見つけ、 列の メッセージの送受信アクション をクリックします。
オプション: [メッセージ受信] セクションの [クイックエクスペリエンス] ページで、受信メッセージパラメータの編集 をクリックします。受信メッセージパラメータの編集 パネルで、一回に取得できる最大メッセージ数 パラメーターと ポーリング期間 パラメーターを設定し、[OK] をクリックします。
[クイックエクスペリエンス] ページで、メッセージを受信 をクリックします。[メッセージの受信] セクションにメッセージのリストが表示されます。
オプション:メッセージリストで、ターゲットメッセージを見つけます。[アクション] 列で、詳細情報 をクリックします。[メッセージの詳細] ダイアログボックスで、メッセージの内容やその他の情報を表示します。
Webhook
Webhook がデプロイされているプログラムで、呼び出しステータスと通知コンテンツを表示します。
割り込みイベントに対応する
割り込みへの対応は、特定のビジネスシナリオと要件に合わせて調整する必要があります。プリエンプティブルインスタンスの割り込みとリサイクルを効果的に管理できることを確認するために、アプリケーションをテストすることを強くお勧めします。検討すべき戦略と推奨事項を以下に示します。
割り込みを適切に処理する
割り込みシグナルに迅速に対応し、タスク処理の進捗状況を保存し、リソースを解放し、タスクの実行を終了します。
データの永続性とチェックポイント
重要なビジネスデータと構成を保護するために、タスクの進捗状況と中間結果をローカルファイルやデータベースなどの永続ストレージに一貫して保存します。データの保持と回復の構成の詳細については、「プリエンプティブルインスタンスのデータ保持と回復」をご参照ください。
統合の成功をテストする
CloudMonitor でテストイベントを開始し、プログラムが適切に応答することを確認します。詳細については、「Simple Message Queue を使用してプリエンプティブルインスタンスの割り込みイベントを認識して対応する」をご参照ください。