EC2のAuto Scalingとスポットインスタンスの設定を試してみる

以下の記事で以前EC2のスポットインスタンスやスポットフリート関係について軽く調べたり触れてみました。

https://qiita.com/simonritchie/items/46ff05d076878852fb50

https://qiita.com/simonritchie/items/fdb343154ce562229395

本記事では追加でAuto Scalingとスポットインスタンスを絡ませた設定を試していってみます。調べてみてスポットフリート的なものも絡ませた設定などもできそうであれば使用してみます。

:::note warn
インフラ・クラウド回りは初心者なので知識が荒い点などはご容赦ください。
:::
:::note info
※基本的にマネジメントコンソール上での操作を試していきます。CloudFormationを利用した設定などは機会があれば別の記事で対応しようと思います。
:::

# まずは起動テンプレートを作成

まずはスポットインスタンスなどの起動時に使うための起動テンプレート（Launch template）を追加していきます。Auto Scaling設定時とかに使用します。

EC2の画面の左メニューからLaunch Templatesを選択しCreate launch templateをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/aa0dc3b8-ca34-71a6-64c5-c9bbc8eb230a.png)

今回はお試しなのでテンプレート名はTestTemplate1としておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/61423e3c-c5af-92c2-3efc-eff65ceff254.png)

Auto Scaling guidanceという箇所でもしAuto Scalingで使おうとしている場合にはチェックを入れてくださいといった説明のものがあるのでチェックを入れてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/6ee1c619-e2ac-f1ec-bd71-84436112440f.png)

通常のインスタンス起動時と同じようにOSの選択のUIがあるので今回はARM版のUbuntu 24.04にしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/c16c0b8b-c246-9c21-c567-bfb566a41700.png)

インスタンスタイプの選択のUIがありますが起動テンプレートで設定しない形（Don't include in launch template）もできるようなのでそちらを設定しておきます（Auto Scaling経由とかで起動したときに設定されるようにします）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/5401d30e-4c76-9a86-4bd7-a78e41ff4907.png)

その他の設定も割愛気味で進めてCreate launch templateをクリックして起動テンプレートを作成しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/38f0eb3d-678b-def9-49c0-00fdfdd32f48.png)

正常に作成されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/f44330ab-187c-4982-6581-32bdb3175a5f.png)

# EC2のAuto Scalingグループを作成する

続いてEC2のAuto Scalingグループを作成していきます。

EC2のページの左メニューからAuto Scaling Groupsを選択し、Create Auto Scaling groupボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/3743178e-1390-b38e-224b-0d4ef19ccb95.png)

名前はTestAutoScalingGroupとしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/d4d801f7-629e-b14c-9bfa-1368bdcb9c26.png)

起動テンプレートは前節で触れたものを設定しておきます。なお、バージョンが表示されているので起動テンプレートにバージョン設定もできそうですね・・・。この辺も後日機会があれば触ってみるかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/a7991213-27bf-aeb9-c92a-7fb077468fb5.png)

続いてインスタンスタイプを設定していきます。

インスタンスの属性で設定する場合（Specify instance attributes）にはvCPU数やメモリの最小～最大値の範囲でインスタンスが選択される形になると思われます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/dbaea403-1cc0-2a7f-dfb4-8460f2d4d806.png)

インスタンスタイプを指定する場合（Manually add instance types）には使いたい個々のインスタンスタイプと重み付け設定（Weight）を指定していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/398e449d-19fd-4ca7-6d2f-2e043632e658.png)

Weightの設定はスペックに応じてどのくらいのキャパシティのインスタンスなのかで設定していきます。例えばnanoで1を設定すればその上のmicroは2、smallは4・・・といった具合です。

GPUインスタンスなどでGPU枚数などが変則的なインスタンスファミリーを使う場合にはGPU1枚で1、2枚で2、4枚で4・・・といったようにWeightを設定していく形でもいいのかもしれません。

t4gなどのバースト可能なファミリーも少々変則的な感じになりますが、今回はお試しなので安いt4gファミリーで設定していってみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/d4ce5906-1692-4274-7a68-5aaf74e1e205.png)

Instance purchase optionsではオンデマンドインスタンスとスポットインスタンスの比率を設定できるようです。たとえば2割はオンデマンド、残り8割はスポットインスタンス・・・みたいな設定ができるようです。便利そうですね。

また、Include On-Demand base capacityのところに0以外のインスタンス台数を指定しておけば比率に関わらず一定数のオンデマンドインスタンスが確保される・・・といったところでしょうか？
要検証ですがスポットインスタンス比率を100％にしてInclude On-Demand base capacityの方を2台にしておけばオンデマンドは2台確保、残りは全部スポットで運用・・・みたいな形もいける感じでしょうか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/1f63f318-7e77-5ff1-b85e-03f2da865dac.png)

中断されてもOKなように作りつつスポットインスタンスメインで扱って、そしてオンデマンドも少し混ぜておく形にして緊急の際にはオンデマンド台数を増やす・・・とかもいいかもしれませんね。
（スポットインスタンスが安定するように必要なスポットプール数は確保しつつ、それでも万一スポットインスタンスが必要数確保できない場合にいつでもオンデマンド数を増やせるようにしておくなど）

On-Demand allocation strategyはオンデマンドインスタンス起動時のインスタンスタイプ選択方針設定のようです。Prioritizedを選択した場合には選択できるインスタンスタイプの中で先頭のインスタンスタイプ、Lowest priceは安いインスタンス・・・といったところでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/9bb247a8-bf1f-5df6-332e-062461ab8dd0.png)

Spot allocation strategyではスポットインスタンス側のインスタンスタイプ選択の方針を設定できます。前記事で触ったスポットフリートの設定で触れた時と同じような内容になります。

基本的には何か理由がなければ推奨されているコスト効率が一番良いもの（Price capacity optimized）を選択しておけばOKかなという印象です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/9e1664d8-b7ba-2377-1836-d18aa1f41551.png)

また、キャパシティリバランスの設定もスポットフリート設定画面と同じようにAuto Scaling側の画面に存在するようです。

その他ネットワークに関してはスポットインスタンスの選択肢が増えた方が好ましいのですべてのアベイラビリティゾーンのサブネットを選択しておきます。

続いてロードバランサーの設定となりました。
今回検証で使っているAWSアカウントだとまだロードバランサーは作っていなかったのですが、どんな設定があるのかの確認用に試しにALBを新規作成していく形で試してみるためAttach to a new load balancerを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/7fa7e179-3847-215e-4655-87c23b668eb7.png)

Load balancer typeはApplication Load Balancerを選択し、TestAutoScalingGroupLoadBalancerと名前を付けておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/8df952f4-5d7e-8b5c-3fd5-640253e4e860.png)

ALBのターゲットグループ設定も新規作成する形にしておきます（今回は80ポートでサーバーを立てたりはしない想定なのでヘルスチェックは通らない形になりますが・・・）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/3553fe2f-9b14-b1a8-5838-7ee6e79ff42a.png)


Default instance warmupの設定でAuto Scalingがメトリクスによる判定とかに使うまでの猶予秒数が設定できるようです。起動して準備が完了するまでにぼちぼちかかるケースなどでは設定しているといいのかなと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/0c52aa9d-c87d-75d3-1059-b1c31cb5d558.png)

Desired capacityにはスケーリングの初期値の指定が必要なようです。少し前にインスタンスタイプとWeightの設定をしましたが、その単位での重み分が確保されるようになると思われます。今回はt4g.nanoでWeightが1にしたのでDesired capacityが4なら4台（もしくは別のインスタンスタイプならもっと少ない数のインスタンス）が起動するかと思われます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/837f1e52-f6eb-d810-fefe-af8c959e6dd2.png)

Scaling limitsの設定ではスケーリングで最小キャパシティと最大キャパシティを設定できるようです。負荷に応じてこの範囲でWeightを参照して台数が変動する形になるかと思われます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/89eecd2f-b1fa-71b1-d820-1fc41d7ec47e.png)

Instance maintenance policyではリバランス時などにインスタンスの入れ替わりが発生するときの方針を設定できるようです。前記事で触れたスポットフリートでもあったような設定となります。終了（破棄）前に追加のインスタンスを起動するのか、終了してから起動するのかなどを選択できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/20aa4bc4-555d-7155-f553-de136ea7b07c.png)

終了前に起動したりするオプションなどではどのくらい余分にヘルスチェックの分を確保してもOKかの最大値設定もできるようです。入れ替え対象が多い場合にこのパーセンテージが大きい方が同時にたくさんの余分なインスタンスを起動できて短時間で処理が終わる・・・とかでしょうか・・・？この辺りは将来もし必要になったら詳しく調べようと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/a920eaab-7686-bca7-5f2b-b29c7854e523.png)

オプションとしてスケーリングでインスタンスが増減した場合にSNSなどでメール通知などを設定できるようです。今回はお試しなので設定は割愛します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/9f9d4089-11e3-c041-c24c-91e2e2790e85.png)

あとはそのままの設定でCreate Auto Scaling groupをクリックして作成処理を流してみます。

無事作成が通ったようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/5adc2261-0f88-104f-fb9b-934fad161b12.png)

少し待って更新したらInstancesが4となり、4台起動した？気配があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/ff44fde3-13f6-eaa3-7711-457c8c88f588.png)

インスタンス一覧を見てみても指定したt4gのインスタンスファミリーで4台起動しており、指定したキャパシティをカバーする分のインスタンスが起動していることが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/d3df08fd-23d7-f39e-1a18-bdc727e3ae40.png)

スポットリクエストのページを確認してみると、オンデマンド以外にも今回Auto Scalingで設定したt4gインスタンスファミリーのスポットインスタンスが増えていることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/80bf4eae-ccca-e8f7-6cbd-9c75ef634695.png)

ひとまずは無事Auto Scalingの設定が反映されたようです。

# 試しに何台かインスタンスを終了してみる

Auto Scalingで自動起動することを確認するため、4台起動したインスタンスのうち3台ほどを終了（破棄）して再度自動起動することを確認してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/20287574-d525-8ec3-4c6c-d918c4965440.png)

終了指定してみたのでしばらくこのままで待ちます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/d59ba4cc-a07d-9b72-9dc7-48bd2f17cd2c.png)

しばらく待っていたら2台目のインスタンスが自動で起動してきました。問題なく動いてくれていそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/5e01aa76-058b-96af-606a-9fa1297e9413.png)

とりあえずこれでマネジメントコンソールからAuto Scalingとスポットインスタンスを組み合わせた設定が軽く確認できました。

後は機会があれば別記事でCloudFormationとかを絡ませた対応などを試したりして記事に出来たら・・・と思います。