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

Elastic Compute Service:ECS コンソール、SDK、Terraform によるスポットインスタンスの作成

最終更新日:Aug 21, 2026

ECS コンソール、SDK、または Terraform を使用してスポットインスタンスを作成し、データ分析などの耐障害性のあるワークロードを従量課金よりも低コストで実行します。

開始する前に

スポットインスタンスを作成する際は、以下の推奨事項に従ってください。

  • 適切な入札戦略の設定: 市場価格の変動を考慮してください。適切な入札により、起動成功率が向上し、リリースリスクが軽減されます。入札額が予算と合致していることを確認してください。

    説明

    入札額が不明な場合は、自動入札を使用してください。自動入札では、リアルタイムの市場価格が課金レートとして適用されます。

  • データの永続性の確保: 重要なデータは、スポットインスタンスのリリースの影響を受けないストレージメディア (インスタンスと同時にリリースされない独立ディスク、OSS、NAS など) に保存してください。

  • インスタンスステータスの監視: Cloud Monitor またはインスタンスメタデータを使用して、スポットインスタンスのステータスを追跡してください。詳細については、「スポットインスタンスの中断イベントを検出して対応する」をご参照ください。

  • 中断への対処: スポットインスタンスは、市場価格が最大入札額を超えた場合や在庫が不足した場合にリリースされる可能性があります。予期しないリリースが発生してもアプリケーションが適切に対処できるよう、テストを実施してください。

スポットインスタンスの作成

ECS コンソールでの作成

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

  2. 要件と画面の指示に従って ECS リソースを設定します。

    以下のパラメーターにご注意ください。その他の設定については、「カスタム購入によるインスタンスの作成」をご参照ください。

    • [チャージタイプ]: プリエンプティブルインスタンス を選択します。

    • [インスタンスの使用期間]

      • [最低 1 時間] インスタンスは 1 時間、中断されることなく実行されます。その後、システムは在庫と入札の変更を監視し、インスタンスを引き続き使用できるかどうかを判断します。

      • [使用期間の設定なし] 固定期間はありません。このオプションでは、多くの場合、より有利な価格が提供されます。

    • [最大価格]

      • [自動入札] 現在の市場価格が課金レートとして適用されます。

      • [価格を設定する] 1 時間あたりの支払額の上限を設定します。

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

      • [リリース] インスタンスとそのコンピューティングリソース (vCPU、GPU、メモリ)、静的パブリック IP、固定帯域幅、およびディスクがリリースされます。

        警告

        スポットインスタンスは重要なデータの保存には適していません。インスタンス中断モード に リリース を選択すると、データ損失が発生する可能性があります。データを保護するには、インスタンス終了時のディスク解放を無効にするか、定期的にディスクスナップショットを作成します。

      • [節約停止モード] コンピューティングリソース (vCPU、GPU、メモリ)、静的パブリック IP、固定帯域幅が回収されます。ディスク、Elastic IP Address、スナップショットは保持され、引き続き課金されます。

        説明

        節約モードのスポットインスタンスは、在庫不足または市場価格が入札額を超えた場合、再起動に失敗する可能性があります。

  3. ページの右側で設定を確認し、利用オプションを設定して、注文の確認 をクリックします。

SDK による作成

前提条件

  1. AccessKey の作成

    Alibaba Cloud アカウント (プライマリアカウント) はすべてのリソースに対する完全な権限を持つため、AccessKey が漏洩すると深刻なリスクをもたらします。必要最小限の権限を持つ RAM ユーザーの AccessKey を使用してください。詳細については、「AccessKey の作成」をご参照ください。

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

    RAM ユーザーに ECS の管理権限を付与します。サンプルコードでは、インスタンス作成権限が必要です。推奨される権限は次のとおりです。

    クラウド製品

    権限

    Elastic Compute Service

    AliyunECSFullAccess

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

    サンプルコードは、システム環境変数から AccessKey を読み取ります。設定方法については、「Linux、macOS、Windows での環境変数の設定」をご参照ください。

  4. ECS SDK のインストール

    ECS SDK を取得します。この例では Maven を使用します。その他の方法については、「ECS Java SDK のインストール」をご参照ください。

    Maven の依存関係を次のように追加します。

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

クライアントの初期化

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": "*"
        }
      ]
    }

使用するリソース

操作手順

  1. https://shell-sg.alibabacloud.com を開き、Cloud Shell にログオンします。

    Cloud Shell のその他の使用方法については、「Cloud Shell の使用」をご参照ください。

  2. 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"
    }
    
    # OSイメージ
    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 = 1
    }
    
    # インバウンドルールのポート範囲
    variable "port_range" {
      type    = string
      default = "1/65535"
    }
    
    # インバウンドルールの優先度
    variable "priority" {
      type    = number
      default = 1
    }
    
    # インバウンドルールの 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 を実行して、設定を初期化します。

    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.
  5. terraform apply を実行します。入力を求められたら、yes と入力し、[Enter] キーを押します。次のメッセージが表示されると、スポットインスタンスが作成されます。

    Apply complete! Resources: 5 added, 0 changed, 0 destroyed.
  6. 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

関連ドキュメント

その他の方法

Alibaba Cloud は、より複雑なシナリオでスポットインスタンスを作成する方法として、Auto Scaling、Container Service for Kubernetes (ACK)、自動プロビジョニンググループも提供しています。

Auto Scaling (ESS)

負荷の変動に対応するため、従量課金インスタンスとスポットインスタンスを動的に組み合わせ、リリースされたインスタンスを自動的に置き換えます。詳細については、「スケーリンググループでスポットインスタンスを使用してコストを削減する」をご参照ください。

ACK

ステートレスで耐障害性のあるアプリケーション向けに、低コストの Kubernetes ノードプールを作成します。詳細については、「スポットインスタンスノードプールのベストプラクティス」をご参照ください。

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

単一の設定で、複数のゾーンと課金方法 (従量課金とスポット) にまたがるインスタンスクラスターをプロビジョニングします。詳細については、「自動プロビジョニンググループの設定例」をご参照ください。