ECSサービスのターゲット追跡ポリシーで最小タスク0に設定した時の挙動

# 目的
ECSサービスのスケーリングポリシーでは最小タスクに`0`をセットすることが出来ます。
例えば、日中のみ利用するサービスで、深夜帯の負荷がない時はタスクを全て停止し、必要な時だけ起動してコストを抑える、といったユースケースに対応するためと考えていました。
しかし、ターゲットの追跡ポリシーで実際に設定すると、タスクが１つになるまでスケールインしますが、最後のタスクはスケールインの条件を満たしているにも関わらず、残り続けてしまいます。
何故このような挙動になるのか、調査してみました。

# 結果

#### １．ECSサービスメトリクスを「ALBRequestCountPerTarget」にする
根本的な原因は、タスク「0」へのスケールインに”実際の0の値”が必要という点です。
>When a metric emits real 0 values to CloudWatch (for example, ALBRequestCountPerTarget), Application Auto Scaling can scale in to 0 when there is no traffic to your application for a sustained period of time.
>メトリックスから実際の 0 の値 CloudWatch （などALBRequestCountPerTarget）が出力される場合、アプリケーションへのトラフィックが一定時間ないときに、Application Auto Scaling は 0 にスケールインできます。

https://docs.aws.amazon.com/ja_jp/autoscaling/application/userguide/target-tracking-scaling-policy-overview.html#target-tracking-considerations


つまり、タスク「0」へのスケールインは設定された閾値を下回るだけでなく、 **メトリクスの計測値が一定期間「0」である** ことが条件となります。

そのため、メトリクスにCPU使用率やメモリ使用率を設定している場合、トラフィックが一切無くても計測値は「0」にならず、「0.29」等の小数点になってしまうため、最後のタスクは停止されずに残り続けます。

一方、ALBリクエスト数では、計測値「0」（アクセス数「0」）を物理的に満たすことが可能ですので、メトリクスは「ALBRequestCountPerTarget」にする必要があります。


#### ２．複数のターゲット追跡ポリシーを設定しない
ターゲット追跡ポリシーを複数設定した場合、スケールアウトはOR条件で実行されますが、スケールインはAND条件で実行されます。
> It will scale out the service if any of the target tracking policies are ready for scale out, but will scale in only if all of the target tracking policies (with the scale-in portion turned on) are ready to scale in.
> いずれかのターゲット追跡ポリシーがスケールアウトの準備ができている場合はサービスがスケールアウトされますが、すべてのターゲット追跡ポリシー (スケールイン部分がオンになっている) がスケールインの準備ができている場合にのみスケールインされます

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-autoscaling-targettracking.html

一方のメトリクスを「ALBRequestCountPerTarget」にして計測値「0」の条件を満たしても、スケールインは全てのメトリクスで計測値を「0」にしないとスケールインされません。

よって、CPU使用率やメモリ使用率では計測値「0」を満たすことは困難なので、メトリクスは「ALBRequestCountPerTarget」１つだけにする必要があります。


#### ３．連続15分間アクセス数が「0」であること
ターゲットの追跡で自動的に設定されるスケールインのCloudWatchのアラームは、
「メトリクスが1分間隔で15分内の15ポイントが閾値を下回る」です。

つまり、連続15分間アクセス数が「0」の場合にスケールインされます。


# 実験
### 前提
* タスクの最小数を`0`にする
* ３つのタスクを立ち上げて何もせずにスケールインされるか待機
* スケールインのクールダウンは60秒とする
* 15分でアラーム、16分でタスク2、17分でタスク1、18分で全停止と予測（誤差あり）


### ①CPU使用率

![cpuスクリーンショット 2024-06-12 110130.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778723/ad184aa8-b57f-74bc-d2cd-bdfa4dd91f7b.png)
##### 15分経過（タスク3）
![スクリーンショット 2024-06-12 111737.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778723/54ec056c-e384-3a2c-3947-2f590035701d.png)
##### 16分経過（タスク3→2）
![スクリーンショット 2024-06-12 111903.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778723/abe42170-94c1-8d37-789c-ba92105d7ddb.png)
##### 17分経過（タスク2→1）
![スクリーンショット 2024-06-12 111937.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778723/e12ab57b-56cd-a589-7772-b210f9d04e6d.png)
##### 20分経過（タスク1のまま）
![スクリーンショット 2024-06-12 112227.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778723/1a13d6f8-2770-55a2-a1d2-5e286bf2a3dd.png)

20分待機してもタスクは停止していません。
CPU使用率では計測値「0」を満たすことができないためと考えられます。
メモリ使用率も同様の結果でした。

### ②ALBリクエスト数
![albスクリーンショット 2024-06-12 113556.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778723/b1838c3b-98ff-dc15-234f-ff08ba509da7.png)
##### 15分経過（タスク3）
![スクリーンショット 2024-06-12 190736.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778723/6d525dee-527f-340c-6d6b-3b77c5f1435d.png)
##### 16分経過（タスク3→2）
![スクリーンショット 2024-06-12 190915.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778723/8339f49f-fb06-3cb6-442a-00e608cc21cc.png)
##### 18分経過（タスク2→1）
![スクリーンショット 2024-06-12 191115.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778723/72e3bf58-6237-e3a3-921e-5f8ea45c195d.png)
##### 20分経過（タスク1のまま）
![スクリーンショット 2024-06-12 191337.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778723/95d6e14d-e14a-8daa-a322-ca9c88852095.png)

 **あれ？** 
CloudWatchを確認すると

![スクリーンショット 2024-06-12 191419.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778723/daa9b574-adc6-f408-811c-28abad917cfc.png)
まさかのタイミングで2件のリクエストが来てました。延長戦です。

##### 35分経過
![スクリーンショット 2024-06-12 192738.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778723/45da0565-5ebe-820c-4399-c47659a04dca.png)

##### 36分経過（タスク1→0）
![スクリーンショット 2024-06-12 192816.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778723/f3668702-feb1-96b9-43f6-2fb95c8203df.png)

![スクリーンショット 2024-06-12 192832.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778723/83d85108-363a-b38d-14e1-160fffb7e066.png)

予想通りの動きが確認出来ました。