Redshift に入門してみた（AWS）

# はじめに
この前、次のプロジェクトで Redshift を使うかもしれないと教えてもらったので、ちょっと取り組んでみました。

この記事では Redshift クラスターを作る⇒S3 からサンプルデータをロード⇒クラスターを作り⇒クエリーを実行しました。
正直、ネットに Redshift の記事はたくさんあるので、最新の AWS の画面をキャプチャしておくみたいな記事です。

# おおまかな作業の流れ
[・ロールを作成](#ロールを作成)
[・サンプルデータのダウンロード](#サンプルデータのダウンロード)
[・S3にサンプルデータを配置](#s3にサンプルデータを配置)
[・Redshiftクラスターの作成](#redshiftクラスターの作成)
[・クエリエディタを使ってみる](#クエリエディタを使ってみる)
[・クエリの実行](#クエリの実行)

# ロールを作成
今回は S3 からデータをロードするので AmazonS3ReadOnlyAccess ポリシーをアタッチしたロールを作成します。

1. IAM の画面で左側のメニューより「ロール」を選択し、「ロールを作成」ボタンをクリック。
![red001_iam_role.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/732f432f-251c-f7f2-6eac-891c05730709.png)

1. 信頼されたエンティティタイプに「AWSのサービス」を選択。
ユースケースでは、サービスに「Redshift」、ユースケースに「Redshift - Customizable」を選択。
![red002_role.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/593eb502-81f3-29f4-e525-c4f65810873a.png)

1. 許可を追加画面にて「AmazonS3ReadOnlyAccess」を選択して「次へ」をクリック。
![red003_policy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/2f488e7d-4bee-d986-6017-912e2ef71dd1.png)

1. ロール名に適当な名称を入力して「ロールを作成」ボタンをクリック。
（僕は実験段階だと zzz というプレフィックスをつけがち。）
![red004_role_confirm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/dec8c8f8-c61a-5b8b-c32a-86eda3723ceb.png)

# サンプルデータのダウンロード
下記にサンプルデータが公開されています。
こちらから tickitdb.zip を取得しました。
https://docs.aws.amazon.com/ja_jp/redshift/latest/gsg/cm-dev-t-load-sample-data.html

tickitdb.zip には以下のファイルが入っています。
![red050_sample_data.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/fb3980c5-1196-829e-1699-5aeecf7f0cf3.png)

# S3にサンプルデータを配置
1. S3の画面へいき、なにはともあれ「バケットを作成」ボタンをクリック。
![red101_s3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/ee4d91b8-7bd3-5c7e-cee2-1257596b9565.png)

1. バケット の設定は名前を入力したくらいで、あとはデフォルトのままにしました。
「バケットを作成」をクリック。
![red102_bucket_settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/7ec2cd22-47aa-dfe6-8a31-7a3fdf99ae0c.png)

1. 作ったバケットを選択して「アップロード」をクリック。
![red103_bucket.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/663b6e16-4fb0-c70a-836d-144cb16801a4.png)

1. アップロードする画面に先ほど取得しておいたサンプルデータをドラッグ＆ドロップします。
![red104_bucket_upload.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/9ceff6f2-4cf8-281c-7c03-fae688a33a28.png)

※紙面の都合で、とりあえず allusers_pipe.txt だけアップロードしました。
![red105_up_allusers.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/27e057e4-e115-5073-a140-6386885cbca6.png)

# Redshiftクラスターの作成
1. 最初にサブネットグループを作成しておきます。
Redshiftの画面の左側のメニューで「設定 > サブネットグループ」を選択します。
![red201_redshift_subnet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/2f8092cf-d5e9-9e90-b0ef-64fab94fcbfc.png)

1. 「クラスターサブネットグループの作成」をクリック。
名前を入力して、使用するサブネットを選択します。
![red202_redshift_subnet_settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/ac6dfac1-a0c4-ca71-2128-c87bc2e2fa4e.png)

1. 左側のメニューより「クラスター」を選択して、「クラスターを作成」ボタンをクリック。
![red203_redshift.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/7a2224d9-3183-1524-fc1b-46b05bf4ab8e.png)

1. クラスターの設定は以下を変更しました。
・クラスター識別子
・ノード
・データベース設定 > 管理者パスワード（「パスワードの生成」を選択）
・関連付けられた IAM ロール（先ほど作成したロールにチェックを入れた）
・追加設定は特に変更していないですが、必要に応じて見直してください。

設定したら「クラスターを作成」をクリック。
実際にやったときはクリックしてから作成完了まで体感 1 〜 2 分くらいだったと思います。
![red204_cluster_settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/d3554d3b-94f7-a0a1-30c9-eccdb51494d9.png)

# クエリエディタを使ってみる
1. 左側のメニューより「クエリエディタ v2」を選択します。
![red205_click_queryeditor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/5a090839-270e-ce1f-ab13-0daac5ab5b3d.png)

1. クエリエディタが開いたら、左の方にクラスター（の名前）が表示されているのでクリックします。
![red301_query_editor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/4f1c3b88-ce92-ca52-5f14-5cd9bbcf1f62.png)

1. ダイアログが開くので、「Database user name and password」を選択。画面下の方で、先ほど設定したユーザー名やパスワードを入力し「Create connection」をクリック。
![red302_connect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/77a79e8b-84d6-9a78-ff83-78adc05b0a7f.png)

1. 接続できたら、テーブルを作成します。
テーブル定義は以下のページからいただきました。
https://docs.aws.amazon.com/ja_jp/redshift/latest/gsg/new-user-serverless.html
下記を入力して「Run」をクリックします。

```sql
create table users(
userid integer not null distkey sortkey,
username char(8),
firstname varchar(30),
lastname varchar(30),
city varchar(30),
state char(2),
email varchar(100),
phone char(14),
likesports boolean,
liketheatre boolean,
likeconcerts boolean,
likejazz boolean,
likeclassical boolean,
likeopera boolean,
likerock boolean,
likevegas boolean,
likebroadway boolean,
likemusicals boolean);  
```
![red303_create_table.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/64339065-d552-07d3-3b0f-a4811c95e983.png)

create table が成功すると、下記のように public の下に users ができていると思います。
![red304_created.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/50fc5118-0caa-c8d4-d3c9-4247812bd5c4.png)

「Load data」をクリックします。
ダイアログで「Load from S3 bucket」を選択して、先ほど S3 にアップロードしたファイルの URI を指定します。
あと「File options」をクリックして、Delimiter も指定しました。
![red305_load_data_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/0e254a71-7d00-fd23-870b-20a83a3c2576.png)

次にロード先のテーブルを指定し「Load data」をクリック。
![red306_load_data_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/66937969-d132-acb9-3531-697bac65144e.png)

※ロード結果
![red307_load_result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/d91d926e-7723-f0f3-0c0c-aa713004c8ea.png)

お待ちかね、ここまできたらクエリが実行できます！

# クエリの実行
クエリを入力して Run します。
```sql
/* 例 */
select * from users where firstname = 'Rafael';
```
![red308_run_query.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/dbacf79a-7734-48d5-99e6-61ff73f7ff9e.png)

# 取り組んでみて
これで Redshift に入門できたかな。