ランサーズ(Lancers)エンジニアブログ > AWS > AWSのスポットインスタンス運用

AWSのスポットインスタンス運用

kanazawa|2014年11月12日
AWS

はじめまして。ランサーズインフラエンジニアの金澤です。
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」をチェックすると、スポットインスタンス関連の項目が追加表示されます。

image2014-11-9 20-25-54

「Current price」が現在のスポット価格です。
スポットインスタンス稼働時に、この金額を超えるとTerminateされてしまいます。

Maximum priceの設定

「Maximum price」には、スポットインスタンス運用時に「最大で支払える金額」を指定できます。
インスタンスを起動する前に、過去のスポット価格の推移を調べておきましょう。
「Spot Requests」メニューから「Pricing History」を押すと確認できます。
image2014-11-9 22-40-18「Maximum price」を高く設定するほどTerminateされにくくなるわけですが、残念ながら設定できる値には上限値があります。

※上限値を超えて設定しようとすると、以下のメッセージが出力されます。

SpotRequestFailed

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アドレスが設定可能です。

image2014-11-9 22-57-15
※「Request Spot instance」をチェックすると「Network interfaces」が消えてしまいます。

image2014-10-3 23-44-34

プライベート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/

image2014-10-3 23-40-0

無償での利用には条件がありますが、バックアップの世代数が管理でき、バックアップ以外にも便利な機能がいくつもありますので、重宝しております。

最後に

スポットインスタンスは、Terminateのリスクがあるものの、適用領域とリスクコントロールを工夫すれば非常に安価に運用することができます。