はじめまして。ランサーズインフラエンジニアの金澤です。
AWSのスポットインスタンスを利用したことはありますか?
スポットインスタンスとは、AWSの余剰インスタンスを入札制で提供する仕組みです。
各インスタンスの1時間あたりの料金比較しても、スポットインスタンスは、(リアルタイムな相場の変動はありますが) オンデマンドインスタンスの1/10近い価格で提供されています。
Amazon EC2 料金表
http://aws.amazon.com/jp/ec2/pricing/
1 時間当たりの料金:アジアパシフィック(東京)Linuxの場合
(2014/11/13現在)
| インスタンスクラス | オンデマンド | スポット | 参考:リザーブド (重度1年間) |
|---|---|---|---|
| t1.micro | $0.026 | $0.0031 | $0.016 |
| t2.micro | $0.020 | $0.005 | |
| m3.medium | $0.101 | $0.0115 | $0.030 |
| c3.large | $0.128 | $0.0212 | $0.047 |
| r3.large | $0.210 | $0.0265 | $0.048 |
| i2.xlarge | $1.001 | $0.228 |
デメリットは、以下の条件で強制的にTerminateされてしまうことです。
- 入札価格よりスポット価格が高くなる
- スポットインスタンスの在庫がなくなる
スポットインスタンスを利用する際は、Terminateのリスクを織り込んだ上で運用する必要があります。
ランサーズでは、検証用AWS環境をスポットインスタンスで運用しており、今回は、その手順、および運用方法を紹介いたします。
スポットインスタンスの起動方法
EC2インスタンスの作成時、Step3のPurchasing optionで「Request Spot Instances」をチェックすると、スポットインスタンス関連の項目が追加表示されます。
「Current price」が現在のスポット価格です。
スポットインスタンス稼働時に、この金額を超えるとTerminateされてしまいます。
Maximum priceの設定
「Maximum price」には、スポットインスタンス運用時に「最大で支払える金額」を指定できます。
インスタンスを起動する前に、過去のスポット価格の推移を調べておきましょう。
「Spot Requests」メニューから「Pricing History」を押すと確認できます。
「Maximum price」を高く設定するほどTerminateされにくくなるわけですが、残念ながら設定できる値には上限値があります。
※上限値を超えて設定しようとすると、以下のメッセージが出力されます。
Maximum priceの上限値
上限値は、インスタンスクラスごとに変動します。
※調べた限りでは、以下の値が上限値のようです。
| インスタンスクラス | 上限値 |
|---|---|
| t1.micro | $0.108 |
| m1.small | $0.352 |
| m1.medium | $0.700 |
| m1.large | $1.400 |
| m1.xlarge | $2.800 |
| m3.medium | $0.684 |
| m3.large | $1.368 |
| m3.xlarge | $2.736 |
| m3.2xlarge | $5.472 |
| c3.large | $0.768 |
| c3.xlarge | $1.532 |
| c3.2xlarge | $3.064 |
| c3.4xlarge | $6.128 |
| c3.8xlarge | $12.256 |
| cc2.8xlarge | $2.960 |
| m2.xlarge | $2.020 |
| m2.2xlarge | $4.040 |
| m2.4xlarge | $8.080 |
| hi1.4xlarge | $0.1601 |
プライベートIPアドレスの指定(Webでは不可)
また、現時点では、Webコンソールからは固定プライベートIPアドレスを設定することができないようです。
「Request Spot instance」チェック前。
「Network interfaces」 でIPアドレスが設定可能です。

※「Request Spot instance」をチェックすると「Network interfaces」が消えてしまいます。
プライベートIPを指定してスポットインスタンスを作成する
Webコンソールからはできませんでしたが、AWS CLIを利用すれば、プライベートIPアドレスを指定してインスタンスを起動することが可能です。
AWS CLIによるスポットインスタンスのリクエスト
aws ec2 request-spot-instances \
--spot-price “<入札価格>" \
--instance-count 1 \
--type "one-time" \
--launch-specification "{ \
\"ImageId\":\"\", \
\"InstanceType\":\"<インスタンスタイプ>\", \
\"NetworkInterfaces\":[{\"DeviceIndex\":0, \
\"SubnetId\":\"<起動先サブネット>\",\
\"PrivateIpAddresses\":[{\"PrivateIpAddress\":\"<プライベートIP>\", \"Primary\":\"true\"}] }], \
\"KeyName\":\"<SSH鍵ペア名>\"
}"
スポットインスタンスのリクエストにあたっては、以下の点に注意が必要です。
- リクエスト内にインスタンス名を含めることができない
- Security Groupの設定とネットワークインターフェース設定(パブリックIP付与など)を同時に行うことができない
セキュリティグループはdefaultが割り当てられますので、起動後に適切なものに変更してください。
スポットインスタンス起動コマンドのオプションについて
| オプション | 説明 |
|---|---|
| –instance-count | 作成するインスタンス数を指定します。 ※プライベートIPアドレスを指定して作成するので、1を入力します。 |
| –launch-specifiation | 起動するインスタンスの詳細設定をJSON形式で指定します。 |
| –spot-price | 入札価格をUSDで指定します。 |
| –type | “one-time”と”persistent”の2種類があります”one-time”では一回スポットインスタンスを起動したらリクエストが失効するのに対し、”persistent”を指定した場合はスポットインスタンス起動後も任意で入札をキャンセルするまでリクエストが維持されます。 |
その他のオプションにつきましては、以下のURLをご確認ください。
http://docs.aws.amazon.com/cli/latest/reference/ec2/request-spot-instances.html
スポットインスタンスの日次バックアップ
スポットで稼働中のEC2インスタンスについては、AMIを毎日取得し、Terminateされた場合は、このAMIから再度リクエストしています。
(※最近は発生してませんが、2014/4月~2014/6月頃は、在庫切れによるTerminateが度々発生していました。)
ランサーズでは、サーバーワークス社のCloudAutomatorを利用しています。
http://cloudautomator.com/

無償での利用には条件がありますが、バックアップの世代数が管理でき、バックアップ以外にも便利な機能がいくつもありますので、重宝しております。
最後に
スポットインスタンスは、Terminateのリスクがあるものの、適用領域とリスクコントロールを工夫すれば非常に安価に運用することができます。


