ECS コンソール、SDK、または Terraform を使用してスポットインスタンスを作成し、データ分析などの耐障害性のあるワークロードを従量課金よりも低コストで実行します。
開始する前に
スポットインスタンスを作成する際は、以下の推奨事項に従ってください。
適切な入札戦略の設定: 市場価格の変動を考慮してください。適切な入札により、起動成功率が向上し、リリースリスクが軽減されます。入札額が予算と合致していることを確認してください。
説明入札額が不明な場合は、自動入札を使用してください。自動入札では、リアルタイムの市場価格が課金レートとして適用されます。
データの永続性の確保: 重要なデータは、スポットインスタンスのリリースの影響を受けないストレージメディア (インスタンスと同時にリリースされない独立ディスク、OSS、NAS など) に保存してください。
インスタンスステータスの監視: Cloud Monitor またはインスタンスメタデータを使用して、スポットインスタンスのステータスを追跡してください。詳細については、「スポットインスタンスの中断イベントを検出して対応する」をご参照ください。
中断への対処: スポットインスタンスは、市場価格が最大入札額を超えた場合や在庫が不足した場合にリリースされる可能性があります。予期しないリリースが発生してもアプリケーションが適切に対処できるよう、テストを実施してください。
スポットインスタンスの作成
ECS コンソールでの作成
インスタンス作成ページに移動し、[カスタム起動] タブを選択します。
要件と画面の指示に従って ECS リソースを設定します。
以下のパラメーターにご注意ください。その他の設定については、「カスタム購入によるインスタンスの作成」をご参照ください。
[チャージタイプ]: プリエンプティブルインスタンス を選択します。
[インスタンスの使用期間]
[最低 1 時間] インスタンスは 1 時間、中断されることなく実行されます。その後、システムは在庫と入札の変更を監視し、インスタンスを引き続き使用できるかどうかを判断します。
[使用期間の設定なし] 固定期間はありません。このオプションでは、多くの場合、より有利な価格が提供されます。
[最大価格]
[自動入札] 現在の市場価格が課金レートとして適用されます。
[価格を設定する] 1 時間あたりの支払額の上限を設定します。
[インスタンス中断モード]
[リリース] インスタンスとそのコンピューティングリソース (vCPU、GPU、メモリ)、静的パブリック IP、固定帯域幅、およびディスクがリリースされます。
警告スポットインスタンスは重要なデータの保存には適していません。インスタンス中断モード に リリース を選択すると、データ損失が発生する可能性があります。データを保護するには、インスタンス終了時のディスク解放を無効にするか、定期的にディスクスナップショットを作成します。
[節約停止モード] コンピューティングリソース (vCPU、GPU、メモリ)、静的パブリック IP、固定帯域幅が回収されます。ディスク、Elastic IP Address、スナップショットは保持され、引き続き課金されます。
説明節約モードのスポットインスタンスは、在庫不足または市場価格が入札額を超えた場合、再起動に失敗する可能性があります。
ページの右側で設定を確認し、利用オプションを設定して、注文の確認 をクリックします。
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 (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"))
// Endpoint については、https://api.alibabacloud.com/product/Ecs をご参照ください。
.setEndpoint("ecs.cn-hangzhou.aliyuncs.com");
return new Client(config);
}
}API リクエストオブジェクトの構築
リクエストオブジェクトを構築する前に、API ドキュメントでパラメーターの詳細を確認してください。
// リクエストオブジェクトを構築します
RunInstancesRequest request = new RunInstancesRequest()
// リージョンを設定
.setRegionId("cn-hangzhou")
// スポットインスタンスの課金タイプとして `PostPaid` (従量課金) を指定します
.setInstanceChargeType("PostPaid")
// 入札戦略を自動に設定
.setSpotStrategy("SpotAsPriceGo")
// 1 時間の使用期間を設定: インスタンスが 1 時間、中断されることなく実行されることを保証します
.setSpotDuration(1)
// インスタンスタイプを設定
.setInstanceType("instanceType")
// イメージを設定
.setImageId("imageId")
// セキュリティグループ ID を設定
.setSecurityGroupId("securityGroupId")
// vSwitch 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"))
// Endpoint については、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();
// リクエストオブジェクトを構築します
RunInstancesRequest request = new RunInstancesRequest()
// リージョンを設定
.setRegionId("cn-hangzhou")
// スポットインスタンスの課金タイプとして `PostPaid` (従量課金) を指定します
.setInstanceChargeType("PostPaid")
// 入札戦略を自動に設定
.setSpotStrategy("SpotAsPriceGo")
// 1 時間の使用期間を設定: インスタンスが 1 時間、中断されることなく実行されることを保証します
.setSpotDuration(1)
// インスタンスタイプを設定
.setInstanceType("instanceType")
// イメージを設定
.setImageId("imageId")
// セキュリティグループ ID を設定
.setSecurityGroupId("securityGroupId")
// vSwitch 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-sg.alibabacloud.com を開き、Cloud Shell にログオンします。
Cloud Shell のその他の使用方法については、「Cloud Shell の使用」をご参照ください。
terraformという名前のプロジェクトフォルダーを作成し、そのディレクトリーに移動します。mkdir terraform cd terraformmain.tfという名前の設定ファイルを以下の内容で作成します。terraform initを実行して、設定を初期化します。Terraform has been successfully initialized! You may now begin working with Terraform. Try running "terraform plan" to see any changes that are required for your infrastructure. All Terraform commands should now work. If you ever set or change modules or backend configuration for Terraform, rerun this command to reinitialize your working directory. If you forget, other commands will detect it and remind you to do so if necessary.terraform applyを実行します。入力を求められたら、yesと入力し、[Enter] キーを押します。次のメッセージが表示されると、スポットインスタンスが作成されます。Apply complete! Resources: 5 added, 0 changed, 0 destroyed.terraform showを実行して、作成されたリソースの詳細を表示します。shell@Alicloud: ~ $ terraform show # alicloud_instance.instance: resource "alicloud_instance" "instance" { availability_zone = "cn-beijing-b" cpu = 1 create_time = "2024-11-13T06:52Z" deletion_protection = false dry_run = false enable_jumbo_frame = false expired_time = "2099-12-31T15:59Z" host_name = "xxx" http_put_response_hop_limit = 0 id = "xxx" image_id = "ubuntu_140405_64_40G_xxx" instance_charge_type = "PostPaid" instance_name = "test_fofo" instance_type = "ecs.n2.small" internet_charge_type = "PayByTraffic" internet_max_bandwidth_in = -1 internet_max_bandwidth_out = 10 ipv6_address_count = 0 ipv6_addresses = [] maintenance_action = "AutoRecover" maintenance_notify = false memory = 4096 network_interface_id = "eni-2zehj0xxx" network_interface_traffic_mode = "Standard" os_name = "Ubuntu 14.04 64-bit" os_type = "linux" primary_ip_address = "172.xxx" private_ip = "172.xxx" public_ip = "39.1xxx" queue_pair_number = 0 }
リソースのクリーンアップ
Terraform で作成したリソースを破棄するには、次のコマンドを実行します。詳細については、「一般的なコマンド」をご参照ください。
terraform destroy関連ドキュメント
Terraform の概要については、「Terraform の概要」をご参照ください。
その他の方法
Alibaba Cloud は、より複雑なシナリオでスポットインスタンスを作成する方法として、Auto Scaling、Container Service for Kubernetes (ACK)、自動プロビジョニンググループも提供しています。
Auto Scaling (ESS)
負荷の変動に対応するため、従量課金インスタンスとスポットインスタンスを動的に組み合わせ、リリースされたインスタンスを自動的に置き換えます。詳細については、「スケーリンググループでスポットインスタンスを使用してコストを削減する」をご参照ください。
ACK
ステートレスで耐障害性のあるアプリケーション向けに、低コストの Kubernetes ノードプールを作成します。詳細については、「スポットインスタンスノードプールのベストプラクティス」をご参照ください。
自動プロビジョニンググループ
単一の設定で、複数のゾーンと課金方法 (従量課金とスポット) にまたがるインスタンスクラスターをプロビジョニングします。詳細については、「自動プロビジョニンググループの設定例」をご参照ください。