Amazon Redshift サーバーレスを試してみた

# 背景・目的
2022年7月に、RedshiftサーバレスがGAになりました。
少し間が空いてしまいましたが、どのような特徴があるか整理し、試してみます。

# まとめ
- スケーリングを自動で実行する
- サーバレスのキャパシティはRPUという単位で設定する。RPUは32RPU〜512RPUの間で8 RPU単位で設定する。
- メンテナンスウィンドウは無い
- 名前空間とワークグループという概念が有る
    - 名前空間は、データベースとオブジェクトとユーザのコレクションである。
    - ワークグループは、コンピューティングリソースの集合

# 概要
## 特徴
下記の特徴があります。
- データウェアハウスをプロビジョニングして管理不要
- データウェアハウス容量のプロビジョニングとスケーリングを自動的に実行

## メリット
下記のメリットがあります。
- データにアクセスして分析を行う際に、セットアップや調整、管理の必要はない
- データレイクとの統合などを使用して、データウェアハウス、データレイク、オペレーショナルなデータソースをシームレスにクエリできる
- インテリジェントなオートスケーリングにより、最も要求の厳しい不安定なワークロードでも、高いパフォーマンスとシンプルなオペレーションを実現できる
- ワークグループと名前空間を使用して、きめ細かなコスト管理でコンピューティングリソースとデータを整理できる
- 料金は、データウェアハウスが使用されている場合にのみ発生する。

## 考慮事項
下記の考慮事項があります。（正確な内容は、[こちら](https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/serverless-known-issues.html)をご確認ください。）
- メンテナンスウィンドウは使用できない。ソフトウェアの更新は自動で適用される。
- バージョンを切り替えても既存の接続やクエリの実行は中断されず、新しい接続は常にRedshift Serverlessと瞬時に接続して動作される。
- 3つのサブネットを使用し、3つのAZにまたがる必要がある。
- サーバレスのワークグループを作成する際は、IPアドレスに空きが必要。RPU（Redshift Processing Unit）が増えるにつれて、
    - ※必要なIPアドレス数は必要。詳細は[こちら](https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/serverless-known-issues.html)のワークグループ作成時に必要な最低空きIPアドレス数を確認。
- プロビジョニングされたRedshiftクラスタからServerlessに移行した場合に、移行後にストレージ領域の割り当てが増加する。
- データシェアリングで、Serverlessがプロデューサーで、プロビジョニングクラスタがコンシューマの場合、プロビジョニングされたクラスターバージョンは1.038214以降の必要がある
- 最大のクエリ実行時間について、設定された実行時間を超えるとクエリを中心する。（設定可能な値は0〜86,399）

## 容量
容量の計算には、RPU（Redshift Processing Unit）という単位で容量が測定されます。ワークロードの処理に使用されるリソース
クエリの処理に使用する基本容量を設定する。基本容量はRPUで指定し、大きくすることでパフォーマンスが向上する。
基本容量の設定は、32 RPU〜512 RPUまで8RPU単位で設定が可能。（デフォルトは128 RPU）

## 請求
下記に請求について概要を記載します。詳細は[こちら](https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/serverless-connecting.html)をご確認ください。
- クエリ実行では、秒単位のRPUで請求される。実行されていない場合は請求されない。
    - ワークグループを作成する場合、基本容量を設定可能。
- Redshiftマネージドストレージ(RMS:Redshift Managed Storage)では、保存されたデータ量に基づき請求される。
    - GB/月単位
- RPUの最大時間を設定することで、コスト予測が容易になる。制限に達した場合に、下記のアクションが可能
    - ログエントリをシステムテーブルに書き込む。
    - アラートを受信
    - ユーザクエリをオフ

## 接続
下記の方法で接続できます。
- JDBCドライバ
- DataAPI

その他の接続について、下記に記載します。
- SSL接続がサポートされている
- マネージドVPCエンドポイントからServerlessへの接続
    - 他のVPCエンドポイントからの接続
    - RedshiftマネージドVPCエンドポイントから接続
        - VPCeを作成すると、別のVPCのクライアントアプリからプライベートにアクセス可能。これによりトラフィックはインターネット経由しないのでパブリックIPは使用しない。
        - 通信のプライバシーとセキュリティが向上する
- パブリックにアクセス可能なRedshift Serverlessへ接続
    - パブリックインターネットのSQLクライアントからクエリを実行できる。
    - パブリックにアクセス可能な設定を有効にすることで、ServelerssはElastic IPアドレスを作成する。VPC外部のクライアントはこれを使用して接続する。

## ワークグループと名前空間の概要
下記に概要を記載します。
- 名前空間とは？
    - データベースとオブジェクトとユーザのコレクション
    - ストレージ関連の名前空間は、下記についてKMSキーをグループ化する
        - スキーマ
        - テーブル
        - ユーザ
        - データ
- ワークグループはコンピューティングリソースの集合
    - RPU
    - VPCサブネットグループ
    - セキュリティグループ
    - ネットワークとセキュリティ設定
    - アクセス権限と、使用制限
    - 各名前空間と関連付けるワークグループは1:1の関係

## クエリとワークロードのモニタリング
- モニタリングビュー
    - クエリとワークロードの使用状況を監視するために使用するシステムビュー
    - pg_catalogスキーマ内にある

システムビューは、以下のモニタリング対象をサポートする
- ワークロードモニタリング
    - ベースラインとビジネスSLAにあるものを識別
    - 平常状態からの逸脱を迅速に特定する
- データのロードとアンロードのモニタリング
    - COPYとUNLOADの転送されたバイト/行、完了したファイルの進捗状況をモニタリングする
- 障害と問題の診断
    - システムテーブルを利用
- パフォーマンスチューニング
    - 実行計画、統計、有効期限、リソース消費量
- ユーザオブジェクトでのイベントのモニタリング
    - Materialized Viewの自動更新
- 課金のための使用状況の追跡
    - 下記の目的のために、時間の経過に伴う使用状況の傾向変化をモニタリングする
        - 予測計画並びに事業の拡大見通し
        - コールドデータの削除、潜在的なコスト削減機会の特定

## イベント通知
EventBridgeを使用してイベント通知を管理し、DWHの変更に関する最新情報を伝える。

## ログのモニタリング
- 接続、ユーザ、ユーザアクティビティに関するログをCWLのロググループにエクスポートできる。
- CWアラームを作成して、メトリクスを追跡できる。
- メトリクスは、下記に分割され、それぞれワークグループディメンションセットと名前空間ディメンションセットに分類される。
    - コンピューティングメトリクス
    - データ
    - ストレージメトリクス

## スナップショットと復旧ポイント
スナップショットは、名前空間内の全てのオブジェクトとデータが含まれます。
下記にスナップショット復旧のシナリオを記載します。
- サーバレススナップショットをサーバレス名前空間に復元
- サーバレススナップショットをプロビジョニングされたクラスターに復元
- プロビジョニングされたスナップショットをサーバレス名前空間に復元


## データシェアリング
AWSアカウント内、複数アカウント、AWSリージョンでライブデータを互いに共有できる

# 実践
[こちら](https://aws.amazon.com/jp/blogs/news/amazon-redshift-serverless-now-generally-available-with-new-capabilities/)を元に試してみます。

## 事前準備
### VPCの作成
VPCと３つのAZにサブネットをそれぞれ作成します。またS3へのVPCeも作成しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ffc9a16e-37dd-ccd9-f3a7-d2a9af92998b.png)

## Redshift サーバレスの作成と実行
### ワークグループと名前空間の作成
1. サーバレスダッシュボードで「ワークグループを作成」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/448dde8d-9060-50e0-8019-9189c1c54b9a.png)

1. 下記を指定して「次へ」をクリックします。
    - 任意のワークグループ名
    - 作成済みのVPC
    - セキュリティグループ
    - 作成済みの3つのサブネット
    - 拡張されたVPCのルーティングをチェック
    - ベールRPU容量を32（最小）

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/0515c38d-1bab-f21f-eaec-3c9bc7046d3c.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/2765bfea-614d-4b0c-c0df-8ea917437e18.png)

1. 下記を指定して「次へ」をクリックします。
    - 任意の名前空間
    - データベースの管理者ユーザ名とパスワード
    - IAMロール（デフォルト）を使用
    - 監査ログ記録

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a1099b1e-9187-6388-b1e8-5b71621a421e.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e9cea637-54bd-8d1d-c3dc-9e297f15f80b.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/b24f6611-acbb-85de-24c7-6cc0bd614d12.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/debb0d49-7efd-ab39-0c12-60752bc52bdb.png)

1. 確認と作成画面で、内容に相違がなければ「作成」をクリックします。
1. しばらくすると、名前空間とワークグループがAvailableになります。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c0c2b531-f5d6-d470-6a7d-9cbe625ed0d9.png)

## データの準備
1. 「クエリデータ」をクリックし、クエリエディタを起動します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9b5e25e4-bf32-957b-e946-83b67bbdae3c.png)

1. 作成したワーキンググループを選択します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/614c3ce6-6bd0-ae15-4035-c8e1de8919c3.png)

1. ポップアップされるので、下記を入力し「Create connection」をクリックします。
    - Database user and password
        - Database
        - User name
        - Password
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/6b0f1812-54d7-6a10-64bc-2b93ad62e0be.png)


1. sample_data_devのtickitのフォルダをクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5cd7aa80-3f26-a988-f96e-e45a2a8a7af4.png)
1. Create sample databaseがポップアップされるので「Create」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/3ed8d2c1-526a-369e-d487-4c23986f4186.png)

1. テーブルが作成されたようです。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/858b914a-b1cd-2775-36ff-92d3a918954a.png)

1. 下記のクエリを実行し、それぞれのデータ件数を確認してみます。
    ```
    SELECT 'category' AS table_name ,count(1) FROM "sample_data_dev"."tickit"."category"
    UNION ALL
    SELECT 'date' AS table_name ,count(1) FROM "sample_data_dev"."tickit"."date"
    UNION ALL
    SELECT 'event'  AS table_name ,count(1) FROM "sample_data_dev"."tickit"."event"
    UNION ALL
    SELECT 'listing'  AS table_name ,count(1) FROM "sample_data_dev"."tickit"."listing"
    UNION ALL
    SELECT 'sales'  AS table_name ,count(1) FROM "sample_data_dev"."tickit"."sales"
    UNION ALL
    SELECT 'users'  AS table_name ,count(1) FROM "sample_data_dev"."tickit"."users"
    UNION ALL
    SELECT 'venue'  AS table_name ,count(1) FROM "sample_data_dev"."tickit"."venue"
    ```

1. 下記のクエリを実行し、Selectできるか確認してみます。
    - カリフォルニアを拠点とするイベントの上位5つの seller を見つけるクエリ　※サンプルデータは2008年のもの
    ```
    select sellerid, username, (firstname ||' '|| lastname) as sellername, venuestate, sum(qtysold)
    from "sample_data_dev"."tickit"."sales" AS sales
        , "sample_data_dev"."tickit"."date" AS date
        , "sample_data_dev"."tickit"."users" AS users
        , "sample_data_dev"."tickit"."event" AS event
        , "sample_data_dev"."tickit"."venue" AS venue
    where sales.sellerid = users.userid
    and sales.dateid = date.dateid
    and sales.eventid = event.eventid
    and event.venueid = venue.venueid
    and year = 2008
    and venuestate = 'CA'
    group by sellerid, username, sellername, venuestate
    order by 5 desc
    limit 5;
    ```

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/06c2cc07-c87f-8fce-cd69-0f8db93200dd.png)

## メトリクスの確認
上記の作成からテストクエリの実行までの状態で、メトリクスを確認しています。
1. ダッシュボードに遷移します。ダッシュボードでは下記が確認できます。
    - クエリ
        - 実行中のクエリとキューに入れられたクエリ
        - 完了と失敗したクエリ
        - 全てのクエリ
    - 使用されるRPU容量
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ddb07344-10ae-71c6-e8d0-299c99af6fbc.png)

### クエリの詳細
1. 「詳細を表示」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/20e13cb7-7cfa-147c-9c77-f4dcd9e6e7bb.png)
1. クエリとデータベースでは下記が確認できます。
    - 選択した範囲内と間隔のクエリの数
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/60629f77-6f0b-a14e-fee5-2f8af9ac16d7.png)
    - クエリの状態と実行時間の長さでフィルタリングが可能
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c8b94775-9622-bcdb-69c4-5ebee7f1b7a0.png)
    - SQLコマンド
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/d22405a4-8f9a-0cfa-2b43-74d99dcc5197.png)
1. 上記に指定した条件で、クエリがリスト化されます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/d2df8d17-2331-8f41-7f97-3128925db459.png)
1. 「リソースメトリクス」をクリックすると単位時間あたりのRPU数が確認できます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/74103e39-6300-e78c-adb9-ca3e0d5affca.png)
1. 「データベースパフォーマンス」をクリックすると下記について確認できます。
    - 1秒あたりに完了したクエリ
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8f2c6754-0ee9-9618-cf0a-99b2cf693815.png)
    - クエリ期間
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/7279b753-f812-48f6-8f92-3804153f45bd.png)
    - データベース接続 ※ここでは表示されなかった
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/545ec160-3e37-f70b-72cc-4b066b5a9fe3.png)
    - 実行中のクエリ
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/d1261cab-e473-0f3d-e808-5659fe6aca2f.png)
    - キューに入れられたクエリ  ※ここでは表示されなかった
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/6d5bcf8d-2ddb-1b6a-9822-ca8b15df0ef8.png)
    - RPU容量
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f064b762-4b44-bd20-db82-c24939c3bad2.png)
    - クエリの内訳 ※ここでは表示されなかった
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/d69f78d3-371f-b377-d615-3a0b54e0a742.png)

### リソースのモニタリング
1. ナビゲーションウィンドウの「リソースのモニタリング」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/7413a1f8-5ef0-28f0-f2a6-ce76dddc21d4.png)
1. RPUの容量とコンピューティング使用量状況を、範囲とサマリーする期間を指定して確認することができます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/422a1ba7-e5c0-2286-892a-84b65158f6a7.png)

### アラームの設定と確認
1. ナビゲーションウィンドウの「アラーム」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/054ef1bf-d166-2cce-7cd6-dc3921c164f4.png)
1. 「アラームの作成」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/d4c47271-f309-9e0d-9c26-900d0d5eaa70.png)
1. 下記を指定してアラームの作成をクリックします。
    - ワークグループ
    - メトリクスのアラームに、ComputeCapacityでMinimum
    - 1分間で1RPUより大きい場合
    - アラーム名
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/45cb350e-51e7-0f09-5935-201717a827fb.png)

1. 上記のクエリを何回か実行します。
1. アラームがでました。状態はALERMになっています。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5c4cf382-230f-77df-98b0-f4adc6c6eeb1.png)
1. アラーム名をクリックするとプレビューが確認できます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/3de5f811-13ba-2241-d06f-c77ab27e3025.png)

1. リンクをクリックしてCWで確認します。詳細が確認できます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8fc3714b-fd42-f2d1-b335-ec3e4d7bd43b.png)

1. 履歴をクリックして状態遷移を確認します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/65e0a3dc-cc9c-e527-7df3-aea2e38ba131.png)

# 考察
クラスタに作成するインスタンスタイプや数を指定せずに使用できるので、ライトに利用する場合に有効と感じました。
今後は、プロビジョニングクラスタと比較してどのような設定が可能かを確認したいと思います。

# 参考
https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/working-with-serverless.html

https://aws.amazon.com/jp/blogs/news/amazon-redshift-serverless-now-generally-available-with-new-capabilities/

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