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

Elastic Compute Service:プリエンプティブルインスタンスの作成

最終更新日:Jan 06, 2025

このトピックでは、Elastic Compute Service (ECS) コンソール、API操作の呼び出し、またはTerraformを使用してプリエンプティブルインスタンスを作成する方法について説明します。

使用状況のメモ

プリエンプティブインスタンスを作成して使用するには、次の点に留意してください。

  • 合理的な入札をします。

    あなたが入札をするとき、市場価格の変動を考慮に入れてください。 妥当な入札価格は、プリエンプティブルインスタンスを作成する可能性を高め、入札価格が市場価格よりも低くなったインスタンスをリリースする可能性を減らします。 ワークロードの要件に基づいて入札価格を提出する必要があります。

    説明

    プリエンプティブルインスタンスの入札価格を決定できない場合は、購入時の市場価格を入札価格として使用することを推奨します。

  • 必要なソフトウェアの設定を含むイメージを使用して、インスタンスの作成後にインスタンスを起動できるようにします。 インスタンスのユーザーデータを使用して、インスタンスの起動時にコマンドを実行することもできます。 詳細については、「インスタンスの初期化設定のカスタマイズ」をご参照ください。

  • プリエンプティブルインスタンスのリリースの影響を受けないストレージメディアに重要なデータを保存することを推奨します。

    ストレージメディアには、個別に作成されたクラウドディスク、Object Storage Service (OSS) バケット、およびApsaraDB RDSインスタンスが含まれます。

  • グリッド、Hadoop、またはキューベースのアーキテクチャを使用してタスクをより小さなタスクに分割するか、チェックポイントを使用して計算結果を保存します。

  • ECSからのインスタンスリリース通知を確認して、プリエンプティブルインスタンスのステータスを監視します。

    ECSは、プリエンプティブルインスタンスをリリースする5分前にインスタンスメタデータを更新します。 インスタンスのメタデータを確認することで、プリエンプティブインスタンスのステータスを毎分取得できます。 詳細については、「ECSインスタンスメタデータの概要」をご参照ください。

  • 従量課金インスタンスでアプリケーションを実行し、インスタンスをリリースします。

    インスタンスのリリース時にアプリケーションが自動的に設定を変更できるかどうかを確認できます。

手順

ECSコンソールで

  1. ECSコンソールのECSインスタンス購入ページに移動します。

  2. [カスタム起動] タブをクリックします。

  3. ビジネス要件に基づいて、プロンプトに従って設定を構成します。

    次のパラメータに注意してください。 その他のパラメーターについては、「カスタム起動タブでインスタンスを作成する」をご参照ください。

    • 課金方法

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

    • インスタンス使用期間

      :

      • 1時間: プリエンプティブルインスタンスの1時間の保護期間を指定します。 インスタンスは、インスタンス作成後1時間以内に自動的にリリースされません。 期間が終了すると、5分ごとにインスタンスタイプの在庫と市場価格がチェックされ、インスタンスをリリースするかどうかが判断されます。

      • None: プリエンプティブルインスタンスの保護期間を指定しません。 保護期間のないプリエンプティブルインスタンスは、保護期間のあるプリエンプティブルインスタンスよりも費用対効果が高くなります。

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

      :

      • 自動入札の使用: 購入時の市場価格が入札価格として使用されます。

      • [最大価格の設定]: インスタンスタイプの支払いを希望する最大価格を指定する必要があります。

  4. [順序の作成] をクリックしてプリエンプティブルインスタンスを作成する前に、インスタンスの使用期間などのインスタンス設定を確認し、すべての設定が要件を満たしていることを確認します。

  5. ECS利用規約製品利用規約を読み、[注文の作成] をクリックします。

API操作の呼び出し

Alibaba Cloud CLI、OpenAPI Explorer、Alibaba Cloud SDKなどの開発者ツールを使用して、RunInstances操作を呼び出し、プリエンプティブルインスタンスを作成できます。 詳細は、「RunInstances」をご参照ください。

説明
  • 購入時の市場価格を入札価格として使用するには、SpotStrategyパラメーターをSpotAsPriceGoに設定します。 SpotStrategyパラメーターをSpotWithPriceLimitに設定し、支払いを希望するプリエンプティブルインスタンスの最大価格を指定することもできます。

  • DescribeSpotPriceHistory操作を呼び出して、プリエンプティブルインスタンスの過去の価格を照会できます。 これは、支払いを希望するプリエンプティブルインスタンスの適切な最大価格を設定するのに役立ちます。

Terraform の使用

説明

次のサンプルコードは、Terraformを使用してプリエンプティブインスタンスを作成する方法の例を示しています。 [ワンクリック実行] をクリックして、次のサンプルコードを実行することもできます。

前提条件

  • Alibaba Cloudアカウントには、リソースに対するすべての権限があります。 AccessKeyペアの漏洩による権限の悪用を防ぐために、Resource Access Management (RAM) ユーザーを作成し、最小権限の原則に基づいてAccessKeyペアにアクセスするために必要な権限をRAMユーザーに付与することを推奨します。 詳細については、「RAMユーザーの作成」および「AccessKeyペアの作成」をご参照ください。

  • 次のサンプルコードでは、RAMユーザーにアタッチされたカスタムポリシーを作成する方法の例を示します。 RAMユーザーには、ECSインスタンスの起動、ECSインスタンスの詳細の表示、プリエンプティブインスタンスの過去の料金の確認を行う権限があります。 詳細については、「カスタムポリシーの作成」をご参照ください。

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ecs:RunInstances",
        "ecs:DescribeInstances",
        "ecs:DescribeSpotPriceHistory"
      ],
      "Resource": "*"
    }
  ]
}
  • 次のいずれかの方法を使用して、Terraformランタイムを準備します。

    • Terraform ExplorerでのTerraformの使用: Alibaba Cloudがオンラインランタイム環境を提供し、インストールは必要ありません。 ログオンしてTerraformを使用することができます。 この方法は、Terraform機能をコストフリーですばやく使用し、デフォルト設定するシナリオに適しています。

    • Cloud Shell: Terraformはプリインストールされており、ID資格情報がプリプロビジョニングされています。 これにより、Cloud ShellでTerraformコマンドを実行できます。 この方法は、Terraform機能を低コストですばやく使用し、デフォルト設定するシナリオに適しています。

    • Terraformのインストールと設定: この方法は、ネットワーク接続が不十分なシナリオや、カスタム開発環境が必要なシナリオに適しています。

リソースの準備

  • alicloud_vpc: 仮想プライベートクラウド (VPC) を作成します。

  • alicloud_vswitch: インスタンスが属するVPCにvSwitchを作成します。

  • alicloud_security_group: defaultという名前のセキュリティグループを作成し、作成したVPCに追加します。

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

  • alicloud_security_group_rule: 作成したセキュリティグループにセキュリティグループルールを追加します。

手順

  1. ブラウザを開き、アドレスバーに https://shell.aliyun.com を入力して、Cloud Shellにアクセスします。

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

  2. Cloud Shellにログインします。

  3. という名前のディレクトリを作成します。terraformTerraformリソースを整理します。

  4. 次のコマンドを実行して、プロジェクトディレクトリにアクセスします

    cd terraform
  5. 次のコードスニペットを実行して、という名前の構成ファイルを作成します。main.tf.

provider "alicloud" {
  region = var.region
}

# The region ID.
variable "region" {
  type    = string
  default = "cn-beijing"
}

# The VPC name.
variable "vpc_name" {
  type    = string
  default = "tf_test_fofo"
}

# The CIDR block of the VPC.
variable "vpc_cidr_block" {
  type    = string
  default = "172.16.0.0/12"
}

# The CIDR block of the vSwitch.
variable "vswitch_cidr_block" {
  type    = string
  default = "172.16.0.0/21"
}

# The zone ID.
variable "availability_zone" {
  type    = string
  default = "cn-beijing-b"
}

# The security group name.
variable "security_group_name" {
  type    = string
  default = "default"
}

# The instance type.
variable "instance_type" {
  type    = string
  default = "ecs.n2.small"
}

# The type of the system disk.
variable "system_disk_category" {
  type    = string
  default = "cloud_efficiency"
}

# The operating system image.
variable "image_id" {
  type    = string
  default = "ubuntu_140405_64_40G_cloudinit_20161115.vhd"
}

# The instance name.
variable "instance_name" {
  type    = string
  default = "test_fofo"
}

# The Internet bandwidth.
variable "internet_max_bandwidth_out" {
  type    = number
  default = 10
}

# The billing method.
variable "instance_charge_type" {
  type    = string
  default = "PostPaid"
}

# The bidding strategy of the preemptible instance.
variable "spot_strategy" {
  type    = string
  default = "SpotAsPriceGo"
}

# The protection period of the preemptible instance.
variable "spot_duration" {
  type    = number
  default = 0
}

# The port range in the inbound security group rule.
variable "port_range" {
  type    = string
  default = "1/65535"
}

# The priority of the inbound security group rule.
variable "priority" {
  type    = number
  default = 1
}

# The CIDR in the inbound security group rule.
variable "cidr_ip" {
  type    = string
  default = "0.0.0.0/0"
}

resource "alicloud_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
  availability_zone = var.availability_zone
}

resource "alicloud_security_group" "default" {
  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
}
  1. terraform initコマンドを実行して、Terraform設定を初期化します。

    次のサンプルコマンド出力が返されます。image

  2. terraform applyコマンドを実行します。 プロンプトに従ってyesと入力し、Enterキーを押します。 コマンドが完了するのを待ちます。 次のコマンド出力が表示された場合、プリエンプティブルインスタンスは期待どおりに作成されます。

    次のサンプルコマンド出力が返されます。image

Verify the result

terraform showコマンドを実行します。

Terraformによって作成されたインスタンスの詳細を表示するには、次のコマンドを実行します。

terraform show

image

ECSコンソールでの確認

ECSコンソールにログインし、作成したプリエンプティブルインスタンスを表示します。

image

リソースのリリース

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

terraform destroy

例:

説明

[ワンクリック実行] をクリックして、次のサンプルコードを実行することもできます。

サンプルコード

provider "alicloud" {
  region = var.region
}

# Region
variable "region" {
  type    = string
  default = "cn-beijing"
}

# VPC Name
variable "vpc_name" {
  type    = string
  default = "tf_test_fofo"
}

# VPC CIDR Block
variable "vpc_cidr_block" {
  type    = string
  default = "172.16.0.0/12"
}

# VSwitch CIDR Block
variable "vswitch_cidr_block" {
  type    = string
  default = "172.16.0.0/21"
}

# Zone
variable "availability_zone" {
  type    = string
  default = "cn-beijing-b"
}

# Security Group Name
variable "security_group_name" {
  type    = string
  default = "default"
}

# Instance Type
variable "instance_type" {
  type    = string
  default = "ecs.n2.small"
}

# System Disk Type
variable "system_disk_category" {
  type    = string
  default = "cloud_efficiency"
}

# Operating System Image
variable "image_id" {
  type    = string
  default = "ubuntu_140405_64_40G_cloudinit_20161115.vhd"
}

# Instance Name
variable "instance_name" {
  type    = string
  default = "test_fofo"
}

# Public Bandwidth
variable "internet_max_bandwidth_out" {
  type    = number
  default = 10
}

# Billing Type
variable "instance_charge_type" {
  type    = string
  default = "PostPaid"
}

# Preemptible Instance Bidding Strategy
variable "spot_strategy" {
  type    = string
  default = "SpotAsPriceGo"
}

# Preemptible Instance Protection Period
variable "spot_duration" {
  type    = number
  default = 0
}

# Inbound Rule Port Range
variable "port_range" {
  type    = string
  default = "1/65535"
}

# Inbound Rule Priority
variable "priority" {
  type    = number
  default = 1
}

# Inbound Rule CIDR
variable "cidr_ip" {
  type    = string
  default = "0.0.0.0/0"
}

resource "alicloud_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
  availability_zone = var.availability_zone
}

resource "alicloud_security_group" "default" {
  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
}

関連ドキュメント