Amazon Redshiftに触れてみる

# はじめに
本投稿はAWS Hands-on for Beginnersの「手を動かしながら学ぶAnalyticsサービス入門」で実施した内容のアウトプットになります。
次月から業務でRedshiftを利用するかもしれなかったので、実施してみました。
とりあえずRedshiftを触ってみたかったので、QuickSightのハンズオンは省略しています。
※ハンズオン資料が公開されたのは2021年なので古い箇所があります。

**★AWS Hands-on for Beginners資料リンク**

https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-Analytics-2022-reg-event.html

# Redshiftってなに？
Redshiftとは、AWSが提供するフルマネージド型のデータウェアハウスサービスです。
RDBMSなどの行指向データベースと異なり、列指向のデータベースという特徴があります。
これは、効率的に分析や集計処理がしやすい仕組みであり、データを分析することに特化したサービスであるということがわかります。

Redshiftは「ノード」と呼ばれるコンピューティングリソースの集合で、「クラスター」というグループを構成します。
さらにクラスター内部では、リーダーノードと1つ以上のコンピューティングノードを持ちます。
リーダーノードがクライアントアプリケーションからクエリを受け取り、コンピューティングノードで処理します。
2022年には、クラスターまたはノードの概念がなく、自動的にスケーリングを行ってくれるAmazon Redshift Serverlessというサービスがリリースされています。

**★参考**

https://aws.amazon.com/jp/redshift/

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

# ざっくりの実施内容
- ハンズオンで利用するIAMロールを作成する
- Redshiftクラスターを作成する
- S3バケットを作成してデータを格納する
- RedshiftクラスターにS3のデータをロードする
- Redshiftに対してクエリを実行する

# 実際やったこと
## ①IAMロールの作成
Redshiftクラスターにロールを関連付けることができ、ロールの権限に基づいてデータのロードやアンロードを行うことができます。
本ハンズオンでは、S3からRedshiftにデータをロードするため、S3ReadOnlyAccessの権限を持ったロールを作成します。

ユースケースからRedshiftを選択し、ポリシーを直接アタッチします。
![スクリーンショット 2024-12-27 153223.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/f99b2a5a-2847-dd27-87d2-d7d5d8de8479.png)
![スクリーンショット 2024-12-27 153241.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/4bb29040-70a5-b7c0-5fac-1363873a943c.png)

## ②Redshiftクラスターの作成
Redshiftのクラスターを作成します。
Severlessは無料トライアル枠があるので、そちらを利用したほうがいいかもしれません…。
ゴリゴリ検証するわけではないので、クラスターのサイズは一番格安のノードタイプと最小のノード数にしました。
![スクリーンショット 2024-12-27 160224.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/378c780b-cd96-c437-c6a3-379172669228.png)

データベース設定では、接続に利用する管理ユーザとパスワードを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/a7080fd3-03be-c714-4ade-5adf22d56ade.png)

暗号化設定は、クラスターの暗号化有無を指定します。
今回は、AWS KMSのAWS管理キーを利用した暗号化を利用する設定にしておきました。
カスタマー管理キーの利用があればそちらにしてください。
![スクリーンショット 2024-12-27 160241.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/c2f79aa4-e97a-fd48-3aa3-84764eba9e87.png)

IAMロールを関連付けるという項目から先ほど作成したIAMロールを選択して関連付けます。
![スクリーンショット 2024-12-27 160250.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/6c344fef-8cfb-434b-a5ea-cefb25a657e7.png)

追加設定の箇所は、今回はそのままにします。
デフォルト以外の特定VPC/サブネットに配置する場合や、セキュリティグループを作成したい場合、バックアップの設定など、カスタマイズしたい場合は設定を行います。
![スクリーンショット 2024-12-27 160313.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/50194dde-8186-0933-3425-fbf27ee03ce2.png)

「クラスターを作成」を押下してしばらくするとクラスターの状態がAvailableになって作成が完了します。
![スクリーンショット 2024-12-27 160538.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/7a82b937-c5a5-fb71-4d5d-60a1616deec0.png)

## ③S3バケットを作成してデータを格納する
S3バケットを作成してサンプルデータをアップロードします。
バケット名はグローバルで一意の名称にする必要があるのでご注意ください。
![スクリーンショット 2024-12-27 160949.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/f3746034-f8ae-6b65-5123-afa2f4857b7f.png)
![スクリーンショット 2024-12-27 161046.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/f66cddb8-6301-4587-4c13-72735b348026.png)

## ④RedshiftクラスターにS3のデータをロードする
先ほどS3に格納したデータをRedshiftクラスターにロードします。
今回は、「Redshift query editor v2」を利用してデータのロードを行いました。
v2の利点の一つとして、複数ステートメントのクエリ実行を行えることが挙げられます。
テーブルの作成と、データのロード、ロードの確認で複数のクエリを一度に実行したかったのでv2側を利用しました。

開くとこんな画面になります。
![スクリーンショット 2024-12-27 161943.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/42d66f51-fba1-214f-c9b1-8cc6bb147d4c.png)

左側のペインには作成したRedshiftのクラスターが表示されているため、選択して接続します。
今回は、ユーザ名とパスワードを使って接続します。
ここで利用するユーザ名とパスワードはRedshiftクラスター作成時に指定したものです。
![スクリーンショット 2024-12-27 162041.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/012eb50e-4795-0dae-a9fd-1f41c20a6a9a.png)

接続ができたら、データをロードする前にテーブルの作成を行います。
こんな感じで複数クエリを実行します。
![スクリーンショット 2024-12-27 162344.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/5a48c1f3-2663-d081-14f7-550e5276d241.png)

結果は、クエリごとにタブが分かれて表示されます。
![スクリーンショット 2024-12-27 162355.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/55083fe3-2ff8-2818-e656-b306a74eff6a.png)
左側のペインのRedshiftクラスター名を開いていくと作成したテーブルが表示されていることがわかります。
特段指定がないとテーブルはpublicというデフォルトスキーマに作成されます。
![スクリーンショット 2024-12-27 162434.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/873547ed-4dfb-4d08-76c8-48bf0312fc60.png)

テーブルの作成が完了したらS3のデータをRedshiftクラスターにロードします。
ここでは先ほど作成したS3ReadOnlyAccessのポリシーをアタッチしたIAMロールのARNを指定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/2f64f5e4-0f2e-4c41-5639-811991f16a7c.png)

しばらくするとロードが完了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/9e582c38-8a52-c3bb-c767-952dc48c69da.png)


**★[参考]COPY構文**

https://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html

**★[参考]データのロードにおけるベストプラクティス**

https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/c_loading-data-best-practices.html

## ⑤Redshiftに対してクエリを実行する
データがロードできたので、クエリを実行してみます。
無事、サンプルデータをもとにデータが集計できました。
![スクリーンショット 2024-12-27 164431.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/42f6e413-796d-e9bb-9d86-d7f89e628624.png)
![スクリーンショット 2024-12-27 164448.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/39c92094-98ee-9a9d-7441-278e6ea87484.png)

# おわりに
今回はクラスターの作成からクエリエディタを利用してデータのロードとクエリの実行を行うことができました。
クラスターやノードの概念があるプロビジョニングタイプの利用だったのですが、その概念がないServerlessも試してみたいなと思いました。
Glueを使ってETLの部分も今後チャレンジしてみたいと思います。