すべてのプロダクト
Search
ドキュメントセンター

Elastic Compute Service:スポットインスタンスの作成

最終更新日:Dec 02, 2025

スポットインスタンスは、Alibaba Cloud が提供する低コストの計算リソースです。データ分析、テスト、開発など、中断を許容できるコスト重視のタスクに適しています。スポットインスタンスの価格は通常、従量課金インスタンスよりもはるかに低く設定されています。ただし、市場価格の変動やリソースの可用性の変化により、システムがスポットインスタンスを自動的にリリースする場合があります。このトピックでは、Elastic Compute Service (ECS) コンソール、SDK (Software Development Kit)、または Terraform を使用してスポットインスタンスを作成する方法について説明します。

提案

スポットインスタンスを作成する際は、以下の提案をご検討ください。

  • 合理的な入札モードの選択:入札する際は、市場価格の変動を考慮してください。合理的な入札は、スポットインスタンスの作成成功率を高めます。また、入札価格が市場価格を下回った場合にインスタンスがリリースされる可能性を低減します。入札価格は、ビジネスニーズにも合致している必要があります。

    説明

    入札価格を決定できない場合は、自動入札オプションを使用できます。このオプションは、インスタンスタイプの課金価格としてリアルタイムの市場価格を受け入れます。

  • データの永続化:重要なデータは、インスタンスとともにリリースされない独立したディスク、Object Storage Service (OSS)、Apsara File Storage NAS (NAS) など、スポットインスタンスがリリースされても影響を受けないストレージメディアに保存してください。

  • インスタンスステータスの監視:CloudMonitor またはインスタンスメタデータを使用して、スポットインスタンスのステータスを監視できます。これにより、インスタンスが中断され、回収されたかどうかを判断するのに役立ちます。詳細については、「スポットインスタンスの中断イベントの検知と対応」をご参照ください。

  • 中断への対応:市場価格が入札価格を上回った場合や、リソースインベントリが不足した場合、スポットインスタンスはリリースされる可能性があります。アプリケーションをテストして、予期せぬインスタンスのリリースに対応できることを確認する必要があります。

手順

ECS コンソールでの作成

  1. インスタンス作成ページに移動し、[カスタム起動] タブをクリックします。

  2. 画面の指示に従い、要件に基づいて ECS リソースの設定を行います。

    以下のパラメーターに注意してください。その他の設定項目については、「[カスタム起動] タブでのインスタンスの作成」をご参照ください。

    • 課金方法: [スポットインスタンス] を選択します。

    • インスタンスの使用期間:

      • [1 時間]:インスタンスは安定して 1 時間稼働し、自動的にリリースされることはありません。1 時間後、システムはインベントリと入札の変更をリアルタイムで監視し、リソースを引き続き使用できるかどうかを判断します。

      • [なし]:使用期間は設定されません。ビジネスニーズに基づいてこのオプションを選択してください。このオプションは、1 時間の使用期間と比較してより良い価格を提供します。

    • インスタンスあたりの最高価格:

      • [自動入札を使用]:入札は現在の市場価格に従います。これは、インスタンスタイプの課金価格として常にリアルタイムの市場価格を受け入れることを意味します。

      • [最高価格を設定]:指定されたインスタンスタイプの上限価格を設定する必要があります。上限価格は、このインスタンスタイプに対して支払う意思のある最高価格です。

    • インスタンス中断モード

      • [リリース]:中断が発生すると、インスタンスは直ちにリリースされます。リリースされるリソースには、計算リソース (vCPU、GPU、メモリ)、固定パブリック IP アドレス、固定帯域幅、およびディスク (システムディスクとデータディスク) が含まれます。

        警告

        スポットインスタンスは重要なデータの保存には適していません。[インスタンス中断モード][リリース] に設定すると、データが失われる可能性があります。データのセキュリティを確保するために、インスタンスとともにディスクをリリースする機能を無効にするか、定期的にディスクのスナップショットを作成することができます。

      • [節約モードで停止]:中断が発生すると、インスタンスは節約モードに入ります。計算リソース (vCPU、GPU、メモリ)、固定パブリック IP アドレス、および固定帯域幅は回収されます。ディスク (システムディスクとデータディスク)、EIP、スナップショット、およびその他のリソースは保持され、引き続き課金されます。

        説明

        節約モードに入ったスポットインスタンスは、再起動に失敗することがあります。これは、インベントリの不足や、市場価格が入札価格を上回る変動があった場合に発生する可能性があります。

  3. ページの右側で、インスタンス全体の構成を確認し、使用期間などのオプションを設定します。その後、[注文の作成] をクリックして作成プロセスを完了します。

SDK を使用した作成

準備

  1. AccessKey ペアの作成

    最小権限の要件を満たすために、Resource Access Management (RAM) ユーザーに属する AccessKey ペアを使用することを推奨します。Alibaba Cloud アカウントはすべてのリソースに対する完全な権限を持っており、その AccessKey ペアが漏洩すると高いセキュリティリスクをもたらします。詳細については、「AccessKey ペアの作成」をご参照ください。

  2. RAM ユーザーへの ECS 関連権限の付与

    RAM ユーザーに ECS リソースを操作する権限を付与する必要があります。このトピックのサンプルコードはインスタンスを作成します。以下の権限を付与することを推奨します。

    Alibaba Cloud サービス

    付与する権限

    Elastic Compute Service

    AliyunECSFullAccess

  3. アクセス認証情報の設定

    このトピックのサンプルコードは、Alibaba Cloud サービスにアクセスするための認証情報として、システム環境変数から AccessKey ペアを読み取ります。詳細については、「Linux、macOS、Windows での環境変数の設定」をご参照ください。

  4. ECS SDK のインストール

    ECS SDK for Java を取得します。この例では、Maven 依存関係を追加して ECS SDK for Java をインストールします。他のインストール方法については、「ECS SDK for Java のインストール」をご参照ください。

    次の例は、Maven 依存関係を追加する方法を示しています。

    <dependencies>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>ecs20140526</artifactId>
            <version>5.3.0</version>
        </dependency>
    </dependencies>

クライアントを初期化する

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 ドキュメントを参照してパラメーター情報を取得してください。

// リクエストオブジェクトを構築します。
RunInstancesRequest request = new RunInstancesRequest()
    // リージョンを設定します。
    .setRegionId("cn-hangzhou")
    // 課金方法を従量課金に設定します。
    .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 操作を呼び出します。
RunInstancesResponse response = client.runInstancesWithOptions(request, runtime);
System.out.println(response.body.toMap());

例外処理

Java SDK は、例外を TeaUnretryableException と TeaException の 2 つの主要なタイプに分類します。

  • 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")
                    // vSwitch ID を設定します。
                    .setVSwitchId("vSwitchId");
            // 実行時パラメーターを設定します。
            RuntimeOptions runtime = new RuntimeOptions();
            // RunInstances 操作を呼び出します。
            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 ペアの作成

    最小権限を持つ RAM ユーザーの AccessKey ペアを使用することを推奨します。Alibaba Cloud アカウントはすべてのリソースに対する完全な権限を持っています。このプラクティスは、AccessKey ペアが漏洩した場合の誤用を防ぎます。詳細については、「RAM ユーザーの作成」および「AccessKey ペアの作成」をご参照ください。

  • カスタムポリシーの作成

    以下の例を使用して、RAM ユーザー用のカスタムポリシーを作成できます。このポリシーにより、ユーザーは ECS インスタンスの起動、インスタンス詳細の表示、および ECS スポットインスタンスの価格履歴の表示が可能になります。詳細については、「カスタムポリシーの作成」をご参照ください。

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "ecs:RunInstances",
            "ecs:DescribeInstances",
            "ecs:DescribeSpotPriceHistory"
          ],
          "Resource": "*"
        }
      ]
    }

使用されるリソース

  • alicloud_vpc:VPC を作成します。

  • alicloud_vswitch:VPC 内に vSwitch を作成します。vSwitch は VPC 内のインスタンスにサブネットを提供します。

  • alicloud_security_group:`default` という名前のセキュリティグループを作成し、以前に作成した VPC に関連付けます。

  • alicloud_instance:ECS インスタンスを作成します。

  • alicloud_security_group_rule:セキュリティグループルールを定義します。

手順

  1. ブラウザで https://shell.aliyun.com にアクセスし、Cloud Shell にログインします。

    Cloud Shell へのアクセス方法と使用方法の詳細については、「Cloud Shell の使用」をご参照ください。

  2. Terraform リソースを保存するために terraform という名前のプロジェクトフォルダを作成し、そのプロジェクトディレクトリに移動します

    mkdir terraform
    cd terraform
  3. main.tf という名前の設定ファイルを作成し、以下の内容を含めます。

    main.tf

    provider "alicloud" {
      region = var.region
    }
    
    # リージョン
    variable "region" {
      type    = string
      default = "cn-beijing"
    }
    
    # VPC 名
    variable "vpc_name" {
      type    = string
      default = "tf_test_fofo"
    }
    
    # VPC CIDR ブロック
    variable "vpc_cidr_block" {
      type    = string
      default = "172.16.0.0/12"
    }
    
    # vSwitch CIDR ブロック
    variable "vswitch_cidr_block" {
      type    = string
      default = "172.16.0.0/21"
    }
    
    # ゾーン
    variable "availability_zone" {
      type    = string
      default = "cn-beijing-b"
    }
    
    # セキュリティグループ名
    variable "security_group_name" {
      type    = string
      default = "default"
    }
    
    # インスタンスタイプ
    variable "instance_type" {
      type    = string
      default = "ecs.n2.small"
    }
    
    # システムディスクタイプ
    variable "system_disk_category" {
      type    = string
      default = "cloud_efficiency"
    }
    
    # オペレーティングシステムイメージ
    variable "image_id" {
      type    = string
      default = "ubuntu_140405_64_40G_cloudinit_20161115.vhd"
    }
    
    # インスタンス名
    variable "instance_name" {
      type    = string
      default = "test_fofo"
    }
    
    # パブリック帯域幅
    variable "internet_max_bandwidth_out" {
      type    = number
      default = 10
    }
    
    # 課金方法
    variable "instance_charge_type" {
      type    = string
      default = "PostPaid"
    }
    
    # スポットインスタンスの入札ポリシー
    variable "spot_strategy" {
      type    = string
      default = "SpotAsPriceGo"
    }
    
    # スポットインスタンスの保護期間
    variable "spot_duration" {
      type    = number
      default = 0
    }
    
    # Ingress ルールのポート範囲
    variable "port_range" {
      type    = string
      default = "1/65535"
    }
    
    # Ingress ルールの優先度
    variable "priority" {
      type    = number
      default = 1
    }
    
    # Ingress ルールの CIDR
    variable "cidr_ip" {
      type    = string
      default = "0.0.0.0/0"
    }
    
    resource "alicloud_vpc" "vpc" {
      vpc_name       = var.vpc_name
      cidr_block = var.vpc_cidr_block
    }
    
    resource "alicloud_vswitch" "vsw" {
      vpc_id            = alicloud_vpc.vpc.id
      cidr_block        = var.vswitch_cidr_block
      zone_id = var.availability_zone
    }
    
    resource "alicloud_security_group" "default" {
      security_group_name   = var.security_group_name
      vpc_id = alicloud_vpc.vpc.id
    }
    
    resource "alicloud_instance" "instance" {
      availability_zone          = var.availability_zone
      security_groups = [alicloud_security_group.default.id]
      instance_type              = var.instance_type
      system_disk_category       = var.system_disk_category
      image_id                   = var.image_id
      instance_name              = var.instance_name
      vswitch_id                 = alicloud_vswitch.vsw.id
      internet_max_bandwidth_out = var.internet_max_bandwidth_out
      instance_charge_type       = var.instance_charge_type
      spot_strategy              = var.spot_strategy
      spot_duration              = var.spot_duration
    }
    
    resource "alicloud_security_group_rule" "allow_all_tcp" {
      type              = "ingress"
      ip_protocol       = "tcp"
      nic_type          = "intranet"
      policy            = "accept"
      port_range        = var.port_range
      priority          = var.priority
      security_group_id = alicloud_security_group.default.id
      cidr_ip           = var.cidr_ip
    }
  4. terraform init コマンドを実行して設定を初期化します。

    image

  5. terraform apply コマンドを実行します。プロンプトが表示されたら、yes と入力して Enter キーを押します。コマンドが完了するのを待ちます。以下の情報が表示された場合、スポットインスタンスが作成されています。

    image

  6. terraform show コマンドを実行して、Terraform によって作成されたリソースの詳細をクエリします。

    image

リソースのクリーンアップ

Terraform によって作成または管理されているリソースが不要になった場合は、以下のコマンドを実行してそれらをリリースします。詳細については、「一般的なコマンド」をご参照ください。

terraform destroy

参考資料

  • Terraform の概要については、「Terraform とは」をご参照ください。

他の方法によるスポットインスタンスの作成

Alibaba Cloud は、Auto Scaling、Container Service for Kubernetes (ACK)、自動プロビジョニンググループなどのサービスを提供しており、これらを利用することで、リソースの作成と O&M の自動化をより効率的に行うことができます。

Auto Scaling (ESS)

この方法は、ビジネス負荷の変動に動的に対応する必要があるシナリオに適しています。従量課金インスタンスとスポットインスタンスを調整可能な比率で自動的に組み合わせ、既存のインスタンスが解放された際には新しいインスタンスを自動的に補充します。詳細については、「スケーリンググループでスポットインスタンスを使用してコストを削減する」をご参照ください。

コンテナサービス ACK

この方法は、ステートレスでフォールトトレラントなアプリケーションに適しています。お使いの Kubernetes クラスターで低コストのノードプールが必要な場合は、スポットインスタンスのノードプールを作成できます。詳細については、「スポットインスタンスノードプールのベストプラクティス」をご参照ください。

自動プロビジョニンググループ

自動プロビジョニングは、ECS インスタンスのクラスターを迅速に配信するためのソリューションです。簡単な構成を行うだけで、複数のゾーンにまたがって、異なる課金方法 (従量課金とスポット) と複数のインスタンスタイプを持つインスタンスのコレクションを自動的に配信できます。これにより、多数のインスタンスをバッチで配信する効率が向上します。詳細については、「自動プロビジョニンググループの構成例」をご参照ください。