Elastic Compute Service (ECS) コンソール、SDK、または Terraform を通じてスポットインスタンスを作成し、データ分析などの耐障害性のあるワークロードを、従量課金よりも低コストで実行します。
事前準備
スポットインスタンスを作成する際は、以下の推奨事項に従ってください。
-
合理的な入札戦略の設定:市場価格の変動を考慮してください。合理的な入札は、起動が成功する可能性を高め、リリースのリスクを低減します。入札額が予算の期待値と一致していることを確認してください。
説明入札額が不明な場合は、リアルタイムの市場価格を課金レートとして受け入れる自動入札を使用してください。
-
データ永続性の確保:重要なデータは、独立ディスク (インスタンスと一緒にリリースされない)、OSS、NAS など、スポットインスタンスのリリースに影響されないストレージメディアに保存してください。
-
インスタンスステータスの監視:CloudMonitor またはインスタンスメタデータを使用して、スポットインスタンスのステータスを追跡してください。詳細については、「スポットインスタンスの中断イベントの検出と対応」をご参照ください。
-
中断の処理:市場価格が最大入札額を超えた場合や、在庫がなくなった場合にスポットインスタンスがリリースされることがあります。アプリケーションが予期しないリリースを適切に処理できることを確認するために、テストを実施してください。
スポットインスタンスの作成
ECSコンソールでの作成
-
インスタンス作成ページに移動し、[カスタム起動] タブを選択します。
-
ニーズと画面の指示に従って ECS リソースを設定します。
以下のパラメーターに注意してください。その他の設定については、「カスタム起動インスタンス」をご参照ください。
-
[チャージタイプ]:プリエンプティブルインスタンス を選択します。
-
[インスタンスの使用期間]:
-
[最低 1 時間]:インスタンスは1時間中断なく実行されます。その後、システムは在庫と入札の変更を監視し、使用を継続できるかどうかを判断します。
-
[使用期間の設定なし]:固定期間はありません。このオプションは、多くの場合、より低価格で利用できます。
-
-
[インスタンスごとの最大時間料金]:
-
[自動入札]:現在の市場価格を課金レートとして受け入れます。
-
[最大価格を設定]:支払う意思のある1時間あたりの最高価格を設定します。
-
-
[インスタンス中断モード]:
-
[リリース]:インスタンスとその計算リソース (vCPU、GPU、メモリ)、静的パブリック IP、およびディスクがリリースされます。
警告スポットインスタンスは重要なデータの保存には適していません。インスタンス中断モード を リリース にすると、データが失われる可能性があります。インスタンス終了時のディスクリリースを無効にするか、定期的にディスクスナップショットを作成してデータを保護してください。
-
[節約停止モード]:計算リソース (vCPU、GPU、メモリ)、静的パブリック IP、および固定帯域幅が回収されます。ディスク、Elastic IP アドレス、およびスナップショットは保持され、引き続き課金されます。
説明節約モードのスポットインスタンスは、在庫不足や市場価格が入札額を上回った場合に再起動に失敗することがあります。
-
-
-
ページの右側で設定を確認し、使用オプションを設定して、注文の確認 をクリックします。
SDKでの作成
前提条件
-
AccessKeyの作成
Alibaba Cloud アカウント (プライマリアカウント) はすべてのリソースに対する完全な権限を持っているため、その AccessKey が漏洩すると深刻なリスクが生じます。最小限の必要な権限を持つ RAM ユーザーの AccessKey を使用してください。詳細については、「AccessKeyの作成」をご参照ください。
-
RAM ユーザーへの ECS 権限の付与
RAM ユーザーに ECS の管理権限を付与してください。サンプルコードにはインスタンス作成権限が必要です。推奨される権限:
クラウド製品
権限
Elastic Compute Service
AliyunECSFullAccess
-
アクセス認証情報の設定
サンプルコードは、システムの環境変数から AccessKey を読み取ります。設定手順については、「Linux、macOS、およびWindowsでの環境変数の設定」をご参照ください。
-
ECS SDKのインストール
ECS SDK を取得してください。この例では Maven を使用します。その他の方法については、「ECS Java SDKのインストール」をご参照ください。
クライアントの初期化
Alibaba Cloud SDK は、AccessKey や Security Token Service トークンなど、複数の認証情報タイプをサポートしてクライアントを初期化します。詳細については、「アクセス認証情報の管理」をご参照ください。この例では 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 ドキュメントでパラメーターの詳細を確認してください。
// リクエストオブジェクトを構築
RunInstancesRequest request = new RunInstancesRequest()
// リージョンを設定
.setRegionId("cn-hangzhou")
// 課金方法を従量課金に設定
.setInstanceChargeType("PostPaid")
// 入札戦略を自動に設定
.setSpotStrategy("SpotAsPriceGo")
// 1時間の使用期間を設定:インスタンスが1時間中断されずに実行されることを保証
.setSpotDuration(1)
// インスタンスタイプを設定
.setInstanceType("instanceType")
// イメージを設定
.setImageId("imageId")
// セキュリティグループIDを設定
.setSecurityGroupId("securityGroupId")
// 仮想スイッチIDを設定
.setVSwitchId("vSwitchId");
呼び出しの実行
OpenAPI を呼び出す際に、タイムアウトやプロキシ設定などのランタイムオプションを設定できます。詳細については、「高度な設定」をご参照ください。
// ランタイムオプションを設定
RuntimeOptions runtime = new RuntimeOptions();
// RunInstances API を呼び出す
RunInstancesResponse response = client.runInstancesWithOptions(request, runtime);
System.out.println(response.body.toMap());
例外処理
Java SDK は例外を TeaUnretryableException と TeaException に分類します。
-
TeaUnretryableException:最大リトライ回数に達した後のネットワーク問題。
-
TeaException:ビジネス関連のエラー。
例外を適切に処理して、システムの堅牢性を確保してください。たとえば、例外を伝播させる、詳細をログに記録する、回復を試みるなどです。
完全な例
import com.aliyun.ecs20140526.Client;
import com.aliyun.ecs20140526.models.RunInstancesRequest;
import com.aliyun.ecs20140526.models.RunInstancesResponse;
import com.aliyun.ecs20140526.models.RunInstancesResponseBody;
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();
// リクエストオブジェクトを構築
RunInstancesRequest request = new RunInstancesRequest()
// リージョンを設定
.setRegionId("cn-hangzhou")
// 課金方法を従量課金に設定
.setInstanceChargeType("PostPaid")
// 入札戦略を自動に設定
.setSpotStrategy("SpotAsPriceGo")
// 1時間の使用期間を設定:インスタンスが1時間中断されずに実行されることを保証
.setSpotDuration(1)
// インスタンスタイプを設定
.setInstanceType("instanceType")
// イメージを設定
.setImageId("imageId")
// セキュリティグループIDを設定
.setSecurityGroupId("securityGroupId")
// 仮想スイッチIDを設定
.setVSwitchId("vSwitchId");
// ランタイムオプションを設定
RuntimeOptions runtime = new RuntimeOptions();
// RunInstances API を呼び出す
RunInstancesResponse response = client.runInstancesWithOptions(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());
// エラーメッセージを出力 (RequestId を含む)
System.out.println(e.getMessage());
// サーバー側の詳細なエラーを出力
System.out.println(e.getData());
} catch (Exception e) {
// この例では例外を出力するだけです。本番コードでは例外を慎重に処理し、決して無視しないでください。
e.printStackTrace();
}
}
}
Terraformでの作成
以下の手順には、すぐに実行できるサンプルコードが含まれています。今すぐ実行
前提条件
-
AccessKeyの作成
Alibaba Cloud アカウント (プライマリアカウント) はすべてのリソースに対する完全な権限を持っています。AccessKey が漏洩した場合の不正使用を防ぐため、最小限の必要な権限を持つ RAM ユーザーの AccessKey を使用してください。詳細については、「RAM ユーザーの作成」および「AccessKeyの作成」をご参照ください。
-
カスタムポリシーの作成
ECS インスタンスの起動、インスタンス詳細の表示、およびスポット価格履歴の確認を許可するカスタムポリシーを作成してください。詳細については、「カスタムポリシーの作成」をご参照ください。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "ecs:RunInstances", "ecs:DescribeInstances", "ecs:DescribeSpotPriceHistory" ], "Resource": "*" } ] }
使用するリソース
-
alicloud_vpc:VPC を作成します。
-
alicloud_vswitch:サブネットセグメンテーションのために VPC に vSwitch を作成します。
-
alicloud_security_group:default という名前のセキュリティグループを作成し、VPC に関連付けます。
-
alicloud_instance:ECS インスタンスを作成します。
-
alicloud_security_group_rule:セキュリティグループのルールを定義します。
操作手順
-
https://shell.aliyun.com を開き、Cloud Shell にログオンします。
Cloud Shell のその他の使用方法については、「Cloud Shellの使用」をご参照ください。
-
terraform という名前のプロジェクトフォルダーを作成し、そのディレクトリに移動します。
mkdir terraform cd terraform -
以下の内容で、main.tf という名前の設定ファイルを作成します。
-
terraform initを実行して設定を初期化します。
-
terraform applyを実行します。プロンプトが表示されたらyesと入力し、[Enter] キーを押します。以下のメッセージが表示されたら、スポットインスタンスが作成されたことを示します。
-
terraform showを実行して、作成されたリソースの詳細を表示します。
リソースのクリーンアップ
Terraform で作成したリソースを削除するには、次のコマンドを実行します。詳細については、「共通コマンド」をご参照ください。
terraform destroy
関連ドキュメント
-
Terraform の概要については、「Terraformの概要」をご参照ください。
Other methods
Alibaba Cloud also offers Auto Scaling, ACK, and auto provisioning groups for spot instance creation in more complex scenarios.
Auto Scaling (ESS)
Dynamically mixes pay-as-you-go and spot instances to respond to load fluctuations, and replaces released instances automatically. See Use spot instances in scaling groups to reduce costs.
ACK
Creates low-cost Kubernetes node pools for stateless, fault-tolerant applications. See Best practices for spot instance node pools.
Auto provisioning group
Provisions instance clusters across multiple zones and billing methods (pay-as-you-go and spot) with a single configuration. See Auto provisioning group configuration example.