Elastic Beanstalk のスポットインスタンスの設定

# はじめに
先日、Elastic Beanstalk でスポットインスタンスが利用できるようになりました。

[AWS Elastic Beanstalk に Amazon EC2 スポットインスタンスのサポートが追加](https://aws.amazon.com/jp/about-aws/whats-new/2019/11/aws-elastic-beanstalk-adds-support-for-amazon-ec2-spot-instances/)

[公式のドキュメント](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.managing.as.html#environments-cfg-autoscaling-spot)に書かれていることがすべてですが、この記事を書いた時点でまだ日本語の翻訳が存在しませんでした。そこで、Beanstalk でのスポットインスタンスの設定について解説しようと思います。

# 設定可能な項目
Beanstalk のスポットインスタンスでは次の項目が設定可能です。

<img width="1045" alt="スクリーンショット 2019-12-17 11.41.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41604/df5400c2-c236-cde8-84f7-0ae951d62bdf.png">

- フリートの構成
- 最大スポット料金
- インスタンスの最小（MinSize）
- インスタンスの最大（MaxSize）
- オンデマンドベース（SpotFleetOnDemandBase）
- ベースを超える場合のオンデマンド（SpotFleetOnDemandAboveBasePercentage）
- インスタンスタイプ

## フリートの構成
当該環境で使うインスタンスをオンデマンドインスタンスのみで構成するか、スポットインスタンスとオンデマンドインスタンスを混在させて構成するかを選択します。

スポットインスタンスを使いたい場合は「購入オプションとインスタンスの組み合わせ」を選びます。

## 最大スポット料金
スポットインスタンスの上限価格（スポット入札）を設定します。上限価格とは、スポットインスタンスに対して支払う 1 時間あたりの上限値です。

「デフォルト」を選ぶと、上限価格がオンデマンドインスタンスの価格となります。
「上限価格の設定」を選ぶと、入力された値が上限価格となります。

どちらにせよ、スポット料金が設定された上限価格を超えた場合にはスポットインスタンスが中断されます。

スポット料金やスポット入札についての詳細は[こちら](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-spot-instances.html#spot-features)を参照してください。
スポットインスタンスの中断については[こちら](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/spot-interruptions.html)を参照してください。

## インスタンスの最小（MinSize）
環境におけるインスタンス数の最小値です。
この値は環境のインスタンスの初期容量となります。

## インスタンスの最大（MaxSize）
環境におけるインスタンスの数の最大値です。

## オンデマンドベース（SpotFleetOnDemandBase）
オンデマンドインスタンスを最低何台利用するかを設定します。

すなわち、スポットインスタンスが起動する前に、ここで指定した数のオンデマンドインスタンスが起動します。

この値は環境のインスタンスの初期容量とは関係ありません。インスタンスの初期容量は MinSize で決まります。

## ベースを超える場合のオンデマンド（SpotFleetOnDemandAboveBasePercentage）
オンデマンドベースのインスタンス数を超えてインスタンスが起動する場合に、オンデマンドインスタンスが占める割合です。

## インスタンスタイプ
利用するインスタンスタイプを指定します。

スポットインスタンスの利用では複数のインスタンスタイプを指定することができます。特定のインスタンスタイプが利用できなかった場合、バックアップとして他のインスタンスタイプを利用します。


# 設定例について
## 設定例１

| 設定項目 | 値 |
|:--|--:|
| MinSize | 10 |
| MaxSize | 24 |
| SpotFleetOnDemandBase | 4 |
| SpotFleetOnDemandAboveBasePercentage | 50|

**初期容量**

|種類| 値 |
|:--|:--|
|オンデマンド| 7|
|スポット| 3 |
|合計| 10 | 

まず、MinSize が 10 なので初期容量として 10 台のインスタンスが起動します。
このうち、SpotFleetOnDemandBase が 4 台なので、4 台はオンデマンドで起動します。残り 6 台のインスタンスを起動する必要がありますが、SpotFleetOnDemandAboveBasePercentage が 50（50%）なので、

- オンデマンドが 3 台
- スポットが 3 台

となり、合計でオンデマンド 7 台、スポット 3 台となります。

**最大容量**

|種類| 値 |
|:--|:--|
|オンデマンド| 14|
|スポット| 10 |
|合計| 24 |

まず、MaxSize が 24 なので最大容量としては 24 台のインスタンスが起動します。
このうち、SpotFleetOnDemandBase が 4 台なので、4 台はオンデマンドで起動します。残り 20 台のインスタンスを起動する必要がありますが、SpotFleetOnDemandAboveBasePercentage が 50（50%）なので、

- オンデマンドが 10 台
- スポットが 10 台

となり、合計でオンデマンド 14 台、スポット 10 台となります。


## 設定例２

| 設定項目 | 値 |
|:--|--:|
| MinSize | 3 |
| MaxSize | 24 |
| SpotFleetOnDemandBase | 6 |
| SpotFleetOnDemandAboveBasePercentage | 50 |

**初期容量**

|種類| 値 |
|:--|:--|
|オンデマンド| 3|
|スポット| 0 |
|合計| 3 | 

まず、MinSize が 3 なので初期容量として 3 台のインスタンスが起動します。
このうち、SpotFleetOnDemandBase が 6 台なので、3 台すべてがオンデマンドで起動します。この場合、スポットインスタンスは起動しません。

**最大容量**

|種類| 値 |
|:--|:--|
|オンデマンド| 15 |
|スポット| 9 |
|合計| 24 |

まず、MaxSize が 24 なので最大容量としては 24 台のインスタンスが起動します。
このうち、SpotFleetOnDemandBase が 6 台なので、6 台まではオンデマンドで起動します。残り 18 台のインスタンスを起動する必要がありますが、SpotFleetOnDemandAboveBasePercentage が 50（50%）なので、

- オンデマンドが 9 台
- スポットが 9 台

となり、合計でオンデマンド 15 台、スポット 9 台となります。

## 設定例３

| 設定項目 | 値 |
|:--|--:|
| MinSize | 4 |
| MaxSize | 24 |
| SpotFleetOnDemandBase | 4 |
| SpotFleetOnDemandAboveBasePercentage | 0 |

**初期容量**

|種類| 値 |
|:--|:--|
|オンデマンド| 4 |
|スポット| 0 |
|合計| 4 | 

まず、MinSize が 4 なので初期容量として 4 台のインスタンスが起動します。
このうち、SpotFleetOnDemandBase が 4 台なので、4 台すべてがオンデマンドで起動します。この場合、スポットインスタンスは起動しません。

**最大容量**

|種類| 値 |
|:--|:--|
|オンデマンド| 4 |
|スポット| 20 |
|合計| 24 |

まず、MaxSize が 24 なので最大容量としては 24 台のインスタンスが起動します。
このうち、SpotFleetOnDemandBase が 4 台なので、4 台まではオンデマンドで起動します。残り 20 台のインスタンスを起動する必要がありますが、SpotFleetOnDemandAboveBasePercentage が 0（0%）なので、

- オンデマンドが 0 台
- スポットが 20 台

となり、合計でオンデマンド 4 台、スポット 20 台となります。