ECS Fargate の AutoScaling設定をCLIでスケジューリングする

# はじめに
毎週特定の時間帯のみサーバーへのアクセス数が伸びるとわかっている場合、特定の時間帯のみタスク数を増やしたいため、AutoScalingをスケジュール設定します。
CLIを使用する場合、アクセスキーを取り扱うため、IAM権限についても言及します。

単純に、タスク数を増減したい場合、こちらの記事が参考になります。
ただし、autoscalingを使用している場合、タスクを増やしてもスケールインする可能性があります。

https://qiita.com/shnagai/items/c74163aa37bfc9d3bb2f

# 前提条件
- vpc上にfargate用の踏み台サーバーがありますので、踏み台サーバーでcliを実行できるようにします
- ECSの`サービス`で、`autoscaling`設定済み
    - ![スクリーンショット 2022-04-26 17.27.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/ce9788a6-1778-8a82-6f7a-30e97a359353.png)


# 流れ

1. 踏み台サーバーのcli　2をインストール
1. IAMポリシーを作成し、作成したIAMユーザーにアタッチ
1. ssh接続して、CLI実行

# 踏み台サーバーのCLI2をインストール
以下のドキュメントのLinuxの手順通り行います。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2.html

踏み台サーバーにssh接続後、3つのコマンドを実行すると、cli　2のインストールできます。

```
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"

$ unzip awscliv2.zip

$ sudo ./aws/install

$ aws --version
aws-cli/2.1.29 Python/3.7.4 Linux/4.14.133-113.105.amzn2.x86_64 botocore/2.0.0
```

アクセスキーを発行し、踏み台サーバーに登録します。

```
$ aws configure

AWS Access Key ID [None]: <アクセスキーを貼り付け>
AWS Secret Access Key [None]: <シークレットキーを貼り付け>
Default region name [None]: ap-northeast-1
Default output format [None]: json
```




# IAMポリシーを作成し、作成したIAMユーザーにアタッチ
アクセスキーを使用しますので、最低限の権限を付与することが重要です。
今回のcliで必要なアクションを以下の3つになります。
また、踏み台サーバーからの実行ですので、送信元IPを絞りましょう。

```json
{
  "Version": "2012-10-17",
  "Statement": [
   {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
          "application-autoscaling:DeleteScheduledAction",
          "application-autoscaling:DescribeScheduledActions",
          "application-autoscaling:PutScheduledAction"
      ],
      "Resource": "*",
      "Condition": {
          "IpAddress": {
              "aws:SourceIp": "11.111.111.11/32"
          }
      }
    }
  ]
}
```
## IAMの権限最小にするための、必要なアクションの確認方法
必要なアクションが３つと判断した理由は、まず、admin権限を付与した状態で、cliで必要なアクションをすべて実行後、
`CloudTrail`の`イベント履歴`のAWSアクセスキーで検索すると、`イベント名`が表示されます。
この`イベント名`が必要なアクションになります。
![スクリーンショット 2021-12-12 10.23.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/cc142e7f-91bd-6f16-b9ee-20f1b8f34b44.png)

IAMユーザーを作成し、先程のIAMポリシーをアタッチしましょう。
アクセスキーの発行を忘れずに！
![スクリーンショット 2021-12-12 10.48.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/baab3130-fd0a-df1f-359c-900be32e71fc.png)

### 必要なアクション
あとから気づきましたが、スケールアウトとスケールインは`put-scheduled-action`、スケジュール確認は、`describe-scheduled-actions`、スケジュール削除は`delete-scheduled-action`、をcliで実行しているので、このアクション名を権限付与すればよいのですね。
勉強になりました。。


# ssh接続して、cli実行
踏み台サーバーからcliを実行しましょう。
コマンドは、下記のコマンドを参考にしてください。

スケジュール名は、かぶらないようにしましょう。
かぶると、スケジュールが上書きされます。

以下のドキュメントを参考にしました。

https://docs.aws.amazon.com/ja_jp/autoscaling/application/userguide/examples-scheduled-actions.html#recurring-schedule-set-time-zone

### スケールアウト
設定：`19:00に最低タスク数3つにする`
スケジュール名：ecs-scale-out

**<コンテナ名>、<サービス名>、<スケジュール名>は、自身の設定によって変えましょう**
タイムゾーンは東京に設定しています。

```terminal
aws application-autoscaling put-scheduled-action \
--service-namespace ecs \
--resource-id service/<コンテナ名>/<サービス名> \
--scheduled-action-name <スケジュール名> \
--schedule "cron(00 19 ? * Sat *)" --timezone "Asia/Tokyo" \
--scalable-dimension ecs:service:DesiredCount \
--scalable-target-action MinCapacity=3,MaxCapacity=10
```

### スケールイン
設定：`20:00に最低タスク数2つにする`
スケジュール名：ecs-scale-in

```
aws application-autoscaling put-scheduled-action \
--service-namespace ecs \
--resource-id service/<コンテナ名>/<サービス名> \
--scheduled-action-name <スケジュール名> \
--schedule "cron(00 19 ? * Sat *)" --timezone "Asia/Tokyo" \
--scalable-dimension ecs:service:DesiredCount \
--scalable-target-action MinCapacity=2,MaxCapacity=10
```

### スケジュールを確認

```
aws application-autoscaling describe-scheduled-actions --service-namespace ecs
```

### スケジュール削除（名前指定）

```
aws application-autoscaling delete-scheduled-action \
    --service-namespace ecs \
    --scalable-dimension ecs:service:DesiredCount \
　　　　　　　　--resource-id service/<コンテナ名>/<サービス名> \
    --scheduled-action-name <スケジュール名>
```

# アクションの詳細

`put-scheduled-action`は、他にもスケジュールを終了する日付が設定できたりします。
詳しくはドキュメントをご確認ください。

https://docs.aws.amazon.com/cli/latest/reference/application-autoscaling/put-scheduled-action.html

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/application-autoscaling/describe-scheduled-actions.html

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/application-autoscaling/delete-scheduled-action.html