Redshift Serverless で設定できる制限について

AWS Analytics Advent Calendar 2022 の 2 日目のエントリです。
Redshift Serverless について初心者向けのなにがしということで、Redshift Serverless で設定できる制限について記載します。内容はインフラサイドの方向けです。

## 0. はじめに
AWS の Serverless サービスは、利用者がキャパシティやサーバーの詳細な設定・管理をしなくても、AWS 側で自動管理・スケーリングしてくれます。  
Redshift Serverless も例外でなく、従来の Redshift クラスターと違って設定項目が少なくチューニングに手間がかからなくなっています。  
しかし、利用量に合わせて無限にスケールアウト・スケールアップしてしまったら、それに応じた課金が発生してしまいます。  
無尽蔵な課金が発生する前にスペックを管理・利用量を通知する機能として、Redshift Serverless には「使用制限」があります。今回は、この使用制限の設定について詳細をまとめていきます。  

## 1. Redshift Serverless における「制限」の種類
Redshift Serverless コンソール画面でワークグループの詳細を見ていただきますと、そのスペックや利用量を調整するために設定できる「制限」というタブがあります。  
制限タブで設定できる項目は、大きく 3 つに分かれています。  

- Redshift 処理ユニット (RPU) のベース容量
- 使用制限
- クエリの制限

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/d082e66c-6c40-77f6-c0f0-557adf9f03c2.png)

これらの詳細を見ていきます。  

## 2. Redshift 処理ユニット (RPU) のベース容量
この項目では、ワークロードの処理に使用するベース容量を設定します。  
RPU とは、ワークロードの処理に使用される Redshift 処理ユニット（RPU：Redshift Processing Unit） のことで、RPU という単位でベース容量を設定可能です。
  
AWS ドキュメントではベース容量のことを「基本容量」と書いている箇所もあります。  
1 RPU = 16 GiB メモリで、範囲は 8 刻みの 32～512 RPU までとなっており、デフォルトで 128 RPU になります。

クエリのパフォーマンスを向上させるには、RPU のベース容量を増やします。    
32、40、48、56…というように、8 刻みで最大 512 RPU まで設定できるようになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/9b3ee98b-bc8a-0dd1-216b-1f8f642b4f5a.png)

RPU のベース容量は、クエリの実行開始時に使用される最小の RPU 数です。  
クエリ数が増加し、負荷が上昇した場合は、スケーリングが行われ、基本容量以上の RPU が使用される場合があります。  
例えば、ベース容量 32 RPU に設定したワークグループで分析のためのクエリを実行する場合、数秒から数分で終了する軽いクエリであれば、クエリ実行終了まで 32 RPU のスペックのままで分析が実行されます。  
数分から数十分かかるような重いクエリ処理の場合、負荷状況によりベース容量である 32 RPU から自動でスケールアップし、より高いスペックで処理をおこなうようになります。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/615056ef-330e-6043-aa3c-9d06f4bfb0ca.png)

ベース容量に設定した値が自動で変動するわけではなく、あくまで最小 RPU 数として設定するものです。クエリ実行中のスケーリングは内部的に行われます。  
特に大量のリソースを消費するデータ処理ジョブでは、ベース容量を大きく設定することで、クエリのパフォーマンスが向上します。

## 3. 使用制限
使用制限では、Redshift Serverless の使用量を制限するしきい値を設定することができます。設定できるしきい値は、以下の二種類あります。

- Redshift 処理ユニット (RPU) の最大数
- クロスリージョンデータ共有の使用制限

設定したしきい値に達した際のアクションは以下の3種類から選ぶことができます。  

- アラート発報
- システムテーブルへのログ（同時にアラート発報も設定可能）
- ユーザークエリを無効にする（同時にアラート発報も設定可能）

使用制限を設定することによって、想定以上のコスト発生を抑制する目安とすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/03790da3-4c60-28ee-da01-31a8576722e4.png)
設定できるしきい値は「RPU の最大数」「クロスリージョンデータ共有」の二種類ありますが、それぞれ4つまで制限を作成することができます。

注意点として、「RPU の最大数」「クロスリージョンデータ共有」それぞれの制限タイプ対して「ユーザークエリを無効にする」アクションを指定した制限が 1 つまでしか設定できません。

従来の Redshift クラスターにおける使用制限の「機能の無効化」アクションと同様、Redshift Serverless における使用制限の「ユーザークエリを無効にする」アクションは制限タイプ毎に1つまでとなっています。

https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/managing-cluster-usage-limits.html

>機能の無効化 – しきい値に達すると、クォータが次の期間 (日単位、週単位、または月単位) 用に更新されるまで Amazon Redshift が機能を無効にします。無効化アクションを設定できるのは、機能ごとに 1 つの制限だけです。イベントはシステムテーブルにもログ記録され、アラートを生成発行できます。

### 3-1. Redshift 処理ユニット (RPU) の最大数
RPU の最大数についてもう少し見ていきます。
頻度は毎日・毎週・毎月から選択できます。
下図のように、頻度を設定して使用制限の数値を設定してアクションを設定できます。
RPU の最大値の数値を例えば1と設定すると、1 RPU hours と表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/69db4d17-54d3-6001-605e-bc37f743f074.png)

この RPU hours という単位ですが、使用した RPU 値×時間 の数値になっています。
例えば、ベース容量を RPU=32 とする Redshift Serverless を作成し分析する場合、使用制限時間を 32 に設定すると、スケールアップされなかった場合、クエリが1時間実行されたときに閾値に達しアクションが実行されます。

|ベース容量|使用制限（時間）|アクション実行トリガー|
|:--|:--|:--|
|RPU=32|32|クエリが合計 1 時間実行された時にアクション実行|
|RPU=32|1|クエリが合計 1.875 分 (= 60分 /32 *1) 実行された時にアクション実行|
|RPU=128|64|クエリが合計 30 分 (= 60分 /128 *64) 実行された時にアクション実行|

### 3-2. クロスリージョンデータ共有の使用制限
クロスリージョンデータ共有の使用を制御するには、プロデューサーリージョン（データを所有している、共有する側）からコンシューマー（データの利用側）がクエリできるコンシューマーリージョンに転送されるデータ量の制限を設定します。データ転送料金はリージョンによって異なります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/ac5011fd-415d-3215-a7d4-4294a5a81a51.png)

## 4. クエリの制限
クエリの制限は、クエリ実行タイムアウト時間を設定できる項目になっていて、0～86,399 秒の範囲で設定できます。最長で約 1 日ですね。
デフォルトでは 14,400 秒（4 時間）となっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/ec88c7ba-577a-f59b-0a4f-034667060561.png)


以上、Redshift Serverless で設定できる制限についてでした。

## 参考

https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/serverless-capacity.html

https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/managing-cluster-usage-limits.html