Redshiftのコスト削減！使わないときは一時停止しよう！

# はじめに
本記事は、検証用に構築したRedshiftクラスターを定期的に一時停止してコスト削減を図るために実施した内容のアウトプットになります。

背景として、Redshiftクラスターを起動した後に一時停止するのを忘れてしまうので一時停止を自動化させたいという目的があります。

# 構成図
かなりシンプルな構成です。
Amazon EventBridge Schedulerを利用してRedshiftクラスターを一時停止させます。

![構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/0563e1c2-eb1b-0eca-d174-39a1a184d3b1.png)

# なぜRedshiftの機能で一時停止しないのか
Redshiftのスケジュールされた一時停止は、再開も設定する必要があります。
今回は検証で必要になったときだけ起動したく、定期的に再開させる必要はないので、EventBridgeを利用して一時停止のみを行います。

# 手順まとめ
- ①Redshiftクラスターを作成
- ②EventBridge用のIAMポリシーを作成
- ③EventBridge用のIAMロールを作成
- ④EventBridgeのスケジュールを作成

# 手順詳細
## ①Redshiftクラスターを作成
手順は割愛します。
自由な名称でRedshiftクラスターを作成してください。
注意点として、**自動スナップショットの作成が無効化されているRedshiftクラスターは一時停止できない**ため、一時停止が必要な場合は自動スナップショット保持期間を1以上にしておいてください。
クラスター作成後でも、メンテナンス設定で変更することができます。

クラスターの作成が完了したら、クラスター名を控えておきます。
![スクリーンショット 2025-02-06 105053.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/805514c1-41fa-112c-3a86-b2c2c324a666.png)

https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/rs-mgmt-pause-resume-cluster.html


## ②EventBridge用のIAMポリシーを作成
まずは以下の通り、EventBridgeにアタッチするロール用のIAMポリシーを作成します。
Redshiftを一時停止する際は、Reshift:PauseClusterというアクションの許可が必要になります。
```JSON
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "RedshiftPauseScheduler",
			"Effect": "Allow",
			"Action": [
				"redshift:PauseCluster"
			],
			"Resource": [
				"*"
			]
		}
	]
}
```

## ③EventBridge用のIAMロールを作成
次にEventBridge Schedulerで指定するロールの作成を行います。
まず、今回作成するロールはEventBridge Schedulerが利用するものなので、信頼されたエンティティにEventBridge Schedulerを登録する必要があります。

IAMロールの作成画面でカスタム信頼ポリシーを選択して、PrincipalにEventBridge Schedulerのサービスを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/a7c9038a-2073-5638-2838-d44e18f79c27.png)

```JSON
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "RedshiftScheduler",
            "Effect": "Allow",
            "Principal": {
                "Service": "scheduler.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

次にIAMポリシーをアタッチします。
先ほど作成したカスタマー管理ポリシーを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/b4be307a-7eef-0a23-592a-e4c3ec7cbce1.png)

これでEventBridge用のIAMロールの作成は完了しました。

## ④EventBridgeのスケジュールを作成
EventBridgeのスケジュールを作成する画面で、スケジュールを追加していきます。

今回は、定期的に実行したいので定期的なスケジュールからcronベースのスケジュールを利用します。
スケジュールは自分がクラスターを起動して、作業を終えそうな時間に動くようにしてください。
今回はテストなので適当なスケジュールにしておきます。
フレックスタイムウィンドウは今回特にしないのでここも適当な時間にしておきます。
![スクリーンショット 2025-02-06 105158.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/2b9942d3-d524-c4c1-1f75-6fd4a32c7d1e.png)
![スクリーンショット 2025-02-06 105240.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/3c6afdc7-4385-3a83-adfa-f3d5be9d5895.png)
![スクリーンショット 2025-02-06 105224.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/8de8c87d-fadb-79a7-8e76-345556e1a523.png)

cronの記載方法は以下を参考にしてください。

https://docs.aws.amazon.com/scheduler/latest/UserGuide/schedule-types.html?icmpid=docs_console_unmapped#cron-based

次に時間枠を指定します。
このスケジューラが何時から何時まで動くかを設定します。
![スクリーンショット 2025-02-06 105307.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/f621503d-0446-5806-aca4-59dc848385d0.png)

次は、実行するAPIの選択です。
今回はRedshiftのPauseClusterを実行するので探していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/1a6d8cc1-1ab3-9b28-179d-aaf6eccb7f5e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/e01eff79-1cd8-7d84-82a7-ac714e616cdc.png)

PauseClusterを選択すると、JSONエディターが表示されます。
①で作成したRedshiftクラスターの名前をClusterIdentifierに指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/ebb14e58-cb4b-3a66-4df2-08313b9f7f66.png)

そのあとはスケジュールの細かな部分を設定していきます。
スケジュール完了後のアクションはお好みでOKです。
予定されたスケジュールがすべて実行されるとスケジュールが消えてしまうので、使いまわす予定があればNONEをおすすめします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/6430946e-bc93-3628-55d7-8bea5fc9b5aa.png)

再試行もお好みですが、Redshiftクラスターを停止し続けていることもあるため、
API実行が失敗して何度も実行されるのは嫌なので再試行はオフにしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/8afcdbb7-9dc1-5763-6f43-676ea92d862d.png)

アクセス許可には、先ほど作成したIAMロールを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/1877a2af-8f1d-5db8-e4b3-64812e95e9df.png)

これで、Redshiftクラスターを一時停止するEventBridge Schedulerの作成は完了です。

しばらくするとRedshiftクラスターが停止されました。
![スクリーンショット 2025-02-06 125112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/9af27570-d49d-a9d4-de2e-d7de33f27dfe.png)

# おわりに
今回はコスト削減を目的にRedshiftの一時停止を自動化してみました。
本エントリがどなたかの参考になれば幸いです。