📋 このステップで学ぶこと
Amazon Redshiftとは何か
クラスターの作成方法
テーブル設計の基本(DISTKEY・SORTKEY)
SQLクライアントでの接続
実践演習:初めてのテーブル作成とデータロード
⚠️ 重要:Redshiftは有料サービスです
Redshiftには無料枠がありません
最小構成(dc2.large × 2ノード)でも月額 約$360 (約54,000円)
使わない時は必ず一時停止 または削除 してください
学習目的なら2時間以内に一時停止 を推奨($1程度で済みます)
🎯 このステップのゴール
このステップを終えると、Redshiftクラスターを作成し、テーブルを設計・作成できるようになります 。STEP 11で学んだDWHの概念を、実際に手を動かして体験しましょう。
🎯 1. Amazon Redshiftとは
Redshiftの基本
Amazon Redshift は、AWSが提供するクラウド型データウェアハウス です。STEP 11で学んだMPPとカラムナーストレージを採用しており、大量のデータを高速に分析できます。
💡 例え話:Redshift = 巨大な計算工場
【従来のデータベース = 1人の職人】
・1人で全部の作業をする
・データが増えると、作業時間も増える
・限界がある
【Redshift = 巨大な工場】
・工場長(リーダーノード)が指示を出す
・複数の作業員(ワーカーノード)が分担して作業
・データが増えても、作業員を増やせばOK
・並列で同時に処理するので超高速
例:100万件のデータを集計
・1人の職人:10分かかる
・10人の作業員:1分で完了!(10倍速)
Redshiftの特徴
📝 Redshiftの5つの特徴
MPPアーキテクチャ :複数のノードで並列処理(STEP 11で学習)
カラムナーストレージ :列指向で高速・高圧縮(STEP 11で学習)
PostgreSQL互換 :PostgreSQLのSQLがほぼそのまま使える
S3連携 :S3から簡単にデータをロード(COPYコマンド)
スケーラブル :ノードを追加するだけで性能向上
Redshiftのユースケース
📊 ビジネス分析
売上分析、顧客分析など、大量データの集計とレポート作成。「今月の売上は?」「どの商品が人気?」
📈 ダッシュボード
Tableau、QuickSight、Power BIなどのBIツールと連携して可視化。経営層向けレポート作成。
🔍 ログ分析
Webアクセスログ、アプリログなどの大量ログを分析。「どのページがよく見られている?」
🤖 機械学習前処理
大量データの集計・加工を行い、ML用データセットを作成。特徴量エンジニアリング。
Redshiftのアーキテクチャ
🏗️ クラスター構成
【Redshiftクラスターの構成】
┌─────────────────────────────────────────────────────┐
│ リーダーノード │
│ ・クエリを受け取る(窓口) │
│ ・実行計画を作成(司令塔) │
│ ・各ワーカーに指示を出す │
│ ・結果を集約してクライアントに返す │
└─────────────────────────────────────────────────────┘
↓ ↓ ↓
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ ワーカー │ │ ワーカー │ │ ワーカー │
│ ノード1 │ │ ノード2 │ │ ノード3 │
│ ┌─────────┐│ │ ┌─────────┐│ │ ┌─────────┐│
│ │スライス1││ │ │スライス3││ │ │スライス5││
│ └─────────┘│ │ └─────────┘│ │ └─────────┘│
│ ┌─────────┐│ │ ┌─────────┐│ │ ┌─────────┐│
│ │スライス2││ │ │スライス4││ │ │スライス6││
│ └─────────┘│ │ └─────────┘│ │ └─────────┘│
└─────────────┘ └─────────────┘ └─────────────┘
↓ ↓ ↓
データ1/3 データ2/3 データ3/3
【スライス】
・各ノードは複数のスライスに分割される
・スライスごとに並列処理
・データはスライス間で分散
🛠️ 2. クラスターの作成
クラスター作成の準備
⚠️ 作成前の確認事項
AWSアカウント が必要(STEP 3で作成済み)
IAMユーザー に適切な権限があること
リージョン を確認(東京リージョン推奨:ap-northeast-1)
コスト を理解していること(上記参照)
クラスター作成手順(AWSコンソール)
📝 ステップ1:Redshiftコンソールにアクセス
AWSマネジメントコンソールにログイン
サービス検索で「Redshift」 と入力
「Amazon Redshift」 を選択
左メニューから「クラスター」 を選択
「クラスターを作成」 ボタンをクリック
📝 ステップ2:クラスター設定
クラスター識別子
例:my-first-redshift(小文字、ハイフン使用可)
クラスターのタイプ
「無料試用版」 を選択(2ヶ月間、750時間無料。ただしdc2.largeのみ)
ノードタイプ
dc2.large (学習用、最安)160GB SSD、2vCPU、15GB RAM
ノード数
2 (最小構成)1ノードだとMPPの効果が体験できない
📝 ステップ3:データベース設定
データベース名
mydb(デフォルトのまま or 任意)
マスターユーザー名
admin(任意)
マスターパスワード
強力なパスワードを設定(8文字以上、大文字・小文字・数字を含む)
⚠️ パスワードは忘れないようにメモしておきましょう!
📝 ステップ4:ネットワーク設定(学習用)
VPC :デフォルトVPCを選択
VPCセキュリティグループ :デフォルトを選択
パブリックアクセス可能 :「はい」 を選択(学習用。本番環境では「いいえ」推奨)
📝 ステップ5:作成と待機
「クラスターを作成」 ボタンをクリック
ステータスが「作成中」から「利用可能」になるまで待機(通常5〜10分程度)
「利用可能」になったら完了!
【ステータスの遷移】
作成中 → 変更中 → 利用可能
「利用可能」になるまでお待ちください。
コーヒーでも飲みながら待ちましょう ☕
セキュリティグループの設定
🔐 重要:ポート5439を開放する
Redshiftに外部から接続するには、セキュリティグループでポート5439 を開放する必要があります。
EC2コンソールを開く(サービス → EC2)
左メニューから「セキュリティグループ」 を選択
Redshiftで使用しているセキュリティグループを選択(名前に「redshift」が含まれているもの)
「インバウンドルール」 タブ → 「インバウンドルールを編集」
「ルールを追加」 をクリック
以下を入力:
タイプ:カスタムTCP
ポート範囲:5439
ソース:マイIP (自分のIPアドレスのみ許可)
「ルールを保存」
🗄️ 3. テーブル設計の基本
Redshiftのテーブル作成
RedshiftのテーブルはPostgreSQL互換ですが、Redshift固有の設定 があります。これらを適切に設定することで、クエリが10倍以上高速になることもあります。
💡 例え話:本棚の整理
【DISTKEY = どの棚に置くか】
・「著者別」に棚を分ける → 同じ著者の本は同じ棚
・JOINで使う列を指定 → 関連データが同じノードに
【SORTKEY = 棚の中でどう並べるか】
・「発売日順」に並べる → 新しい本がすぐ見つかる
・WHERE句で使う列を指定 → 検索が高速に
【効果】
整理されていない本棚:「2025年の村上春樹の新刊は?」→ 全部見る(遅い)
整理された本棚:著者の棚 → 発売日順 → すぐ見つかる(速い)
基本的なCREATE TABLE文
— 最もシンプルなテーブル作成
CREATE TABLE sales (
sale_id INT NOT NULL,
sale_date DATE NOT NULL,
product_id INT NOT NULL,
customer_id INT NOT NULL,
amount DECIMAL(10,2) NOT NULL,
quantity INT NOT NULL
);
— これでも動くが、性能は最適化されていない
💡 CREATE TABLE文の各行を詳しく解説
【行ごとの解説】
CREATE TABLE sales (
├── CREATE TABLE = 新しいテーブルを作成する命令
└── sales = テーブル名(任意の名前を付ける)
sale_id INT NOT NULL,
├── sale_id = カラム名(任意の名前)
├── INT = データ型(整数、-21億〜21億)
└── NOT NULL = 空欄禁止(必ず値が入る)
sale_date DATE NOT NULL,
└── DATE = 日付型(YYYY-MM-DD形式)
amount DECIMAL(10,2) NOT NULL,
└── DECIMAL(10,2) = 固定小数点数
├── 10 = 全体の桁数(整数部+小数部)
└── 2 = 小数点以下の桁数
例:12345678.99 まで格納可能
※金額にはDECIMALを使う(FLOATは誤差が出る)
quantity INT NOT NULL
└── 最後のカラムにはカンマ(,)を付けない
);
└── セミコロン(;)でSQL文を終了
【Redshift固有のデータ型】
┌────────────────┬───────────────────────────────────┐
│ データ型 │ 説明 │
├────────────────┼───────────────────────────────────┤
│ SMALLINT │ 小さい整数(-32768〜32767) │
│ INT / INTEGER │ 整数(-21億〜21億) │
│ BIGINT │ 大きい整数(-922京〜922京) │
│ DECIMAL(p,s) │ 高精度数値(金額向け) │
│ FLOAT / REAL │ 浮動小数点(科学計算向け) │
│ VARCHAR(n) │ 可変長文字列(最大65535文字) │
│ CHAR(n) │ 固定長文字列 │
│ DATE │ 日付(YYYY-MM-DD) │
│ TIMESTAMP │ 日時(YYYY-MM-DD HH:MM:SS) │
│ BOOLEAN │ 真偽値(TRUE/FALSE) │
└────────────────┴───────────────────────────────────┘
📝 よくある間違いと修正例
【間違い①】最後のカラムにカンマを付けてしまう
❌ quantity INT NOT NULL, ← 余分なカンマ
);
✅ quantity INT NOT NULL ← カンマなし
);
【間違い②】金額にFLOATを使ってしまう
❌ amount FLOAT NOT NULL
→ 1000.99 + 0.01 = 1001.0000001 になることがある
✅ amount DECIMAL(10,2) NOT NULL
→ 1000.99 + 0.01 = 1001.00 正確に計算
【間違い③】VARCHARのサイズを忘れる
❌ product_name VARCHAR NOT NULL
→ PostgreSQLではOKだが、Redshiftではエラー
✅ product_name VARCHAR(255) NOT NULL
→ 最大255文字まで格納可能
【間違い④】日付文字列をVARCHARで保存
❌ sale_date VARCHAR(10) NOT NULL
→ ‘2025-01-15’ 文字列だと集計しにくい
✅ sale_date DATE NOT NULL
→ 日付関数が使えて集計が簡単
DISTKEY(ディストリビューションキー)
1️⃣ DISTKEYとは
データをどのようにノード間で分散するか を指定します。
— customer_idでデータを分散
CREATE TABLE sales (
sale_id INT NOT NULL,
customer_id INT NOT NULL,
amount DECIMAL(10,2) NOT NULL
)
DISTKEY(customer_id);
— 同じcustomer_idのデータは同じノードに保存される
— → customersテーブルとJOINする時に高速
DISTKEYの選び方:
JOINでよく使うカラム を指定
値が均等に分散 するカラム(偏りが少ない)
例:customer_id、order_id、user_id
❌ 避けるべき:日付(偏りやすい)、フラグ(値が少ない)
💡 DISTKEYの効果
【DISTKEYなし(ラウンドロビン分散)】
salesテーブル: ノード1、ノード2、ノード3にランダム分散
customersテーブル: ノード1、ノード2、ノード3にランダム分散
JOIN時:全ノード間でデータを転送(ネットワーク負荷大)
【DISTKEY(customer_id)あり】
salesテーブル: customer_id=1はノード1、customer_id=2はノード2…
customersテーブル: customer_id=1はノード1、customer_id=2はノード2…
JOIN時:同じノード内でJOIN(ネットワーク転送なし)
→ 10倍以上高速になることも!
SORTKEY(ソートキー)
2️⃣ SORTKEYとは
データをどの順番で保存するか を指定します。
— sale_date順でデータを保存
CREATE TABLE sales (
sale_id INT NOT NULL,
sale_date DATE NOT NULL,
amount DECIMAL(10,2) NOT NULL
)
SORTKEY(sale_date);
— sale_date順でソートされて保存される
— → 日付範囲での検索が高速になる
SORTKEYの選び方:
WHERE句でよく使うカラム を指定
範囲検索 するカラム(日付、数値)
例:sale_date、created_at、order_date、timestamp
💡 SORTKEYの効果
【クエリ例】
SELECT * FROM sales
WHERE sale_date BETWEEN ‘2025-01-01’ AND ‘2025-01-31’;
【SORTKEYなし】
・全データをスキャン(100万件)
・その中から条件に合うものを抽出
・時間:10秒
【SORTKEY(sale_date)あり】
・日付順にソートされているので、該当範囲だけスキャン(3万件)
・時間:0.3秒
→ 30倍以上高速!
DISTSTYLE(ディストリビューションスタイル)
3️⃣ DISTSTYLEの種類
スタイル
説明
使用場面
KEY
指定したDISTKEYで分散
大きいテーブル、JOINが多い
EVEN
全ノードに均等に分散(ラウンドロビン)
JOINしないテーブル
ALL
全ノードに全データをコピー
小さいテーブル(マスタ)
最適化されたテーブル作成例
— =============================================
— 売上テーブル(大きいテーブル、数百万件)
— =============================================
CREATE TABLE sales (
sale_id INT NOT NULL,
sale_date DATE NOT NULL,
product_id INT NOT NULL,
customer_id INT NOT NULL,
amount DECIMAL(10,2) NOT NULL,
quantity INT NOT NULL
)
DISTKEY(customer_id) — customersとJOINするので
SORTKEY(sale_date); — 日付で絞り込むことが多いので
— =============================================
— 商品マスタ(小さいテーブル、数千件)
— =============================================
CREATE TABLE products (
product_id INT NOT NULL,
product_name VARCHAR(200),
category VARCHAR(100),
price DECIMAL(10,2)
)
DISTSTYLE ALL; — 小さいので全ノードにコピー
— どのノードでもJOIN可能
— =============================================
— 顧客マスタ(中規模テーブル、数万件)
— =============================================
CREATE TABLE customers (
customer_id INT NOT NULL,
customer_name VARCHAR(200),
email VARCHAR(200),
city VARCHAR(100)
)
DISTKEY(customer_id) — salesとJOINするので
SORTKEY(customer_id); — プライマリキー順
🔌 4. SQLクライアントでの接続
接続情報の確認
📋 クラスターのエンドポイントを確認
Redshiftコンソールを開く
作成したクラスターをクリック
「プロパティ」 タブを開く
「エンドポイント」 をコピー
【エンドポイント例】
my-first-redshift.xxxxxxxxxxxx.ap-northeast-1.redshift.amazonaws.com:5439/mydb
【接続情報まとめ】
・ホスト: my-first-redshift.xxxxxxxxxxxx.ap-northeast-1.redshift.amazonaws.com
・ポート: 5439
・データベース: mydb
・ユーザー: admin
・パスワード: 作成時に設定したもの
接続方法
1️⃣ クエリエディタv2(推奨:初心者向け)
ブラウザで使える公式のSQLエディタ。一番簡単です。
Redshiftコンソールを開く
左メニューから「クエリエディタv2」 を選択
クラスターを選択して接続
SQLを入力して実行
2️⃣ DBeaver(GUI、無料)
無料のデータベース管理ツール。
dbeaver.io からダウンロード
新しい接続 → Amazon Redshift
接続情報を入力
接続テスト → OK
3️⃣ psql(コマンドライン)
PostgreSQLのコマンドラインツール。ターミナルから使えます。
# psqlのインストール(Mac)
brew install postgresql
# psqlのインストール(Ubuntu)
sudo apt-get install postgresql-client
# Redshiftに接続
psql -h my-first-redshift.xxxxxxxxxxxx.ap-northeast-1.redshift.amazonaws.com \
-p 5439 \
-U admin \
-d mydb
# パスワードを入力
Password for user admin: ********
# 接続成功!
mydb=> SELECT version();
# 切断
mydb=> \q
4️⃣ Python(プログラム)
# psycopg2をインストール
pip install psycopg2-binary –break-system-packages
# Pythonコード
import psycopg2
# 接続情報
conn = psycopg2.connect(
host=’my-first-redshift.xxxxxxxxxxxx.ap-northeast-1.redshift.amazonaws.com’,
port=5439,
database=’mydb’,
user=’admin’,
password=’your-password’ # 実際のパスワードに置き換え
)
# カーソル作成
cur = conn.cursor()
# SQLを実行
cur.execute(“SELECT version();”)
result = cur.fetchone()
print(f”Redshiftバージョン: {result[0]}”)
# テーブル一覧を取得
cur.execute(“””
SELECT tablename
FROM pg_tables
WHERE schemaname = ‘public’
“””)
tables = cur.fetchall()
print(f”テーブル一覧: {tables}”)
# 接続を閉じる
cur.close()
conn.close()
💪 5. 実践演習:初めてのテーブル作成
演習1:売上データのテーブルを作成
演習 1
基礎
Redshiftで売上テーブルを作成し、サンプルデータを挿入してみましょう
要件:
テーブル名:sales
カラム:sale_id、sale_date、product_name、amount、quantity
SORTKEYを適切に設定
3件のサンプルデータを挿入
解答を見る
【解答例】
1. テーブル作成
— salesテーブル作成
CREATE TABLE sales (
sale_id INT NOT NULL,
sale_date DATE NOT NULL,
product_name VARCHAR(200),
amount DECIMAL(10,2) NOT NULL,
quantity INT NOT NULL
)
SORTKEY(sale_date);
— テーブル確認
SELECT * FROM pg_tables WHERE tablename = ‘sales’;
2. データ挿入
— サンプルデータ挿入
INSERT INTO sales VALUES
(1, ‘2025-01-19’, ‘ノートPC’, 80000.00, 1),
(2, ‘2025-01-19’, ‘マウス’, 2000.00, 2),
(3, ‘2025-01-20’, ‘キーボード’, 15000.00, 1);
— 確認
SELECT * FROM sales;
— 実行結果
sale_id | sale_date | product_name | amount | quantity
———|————|————–|———-|———-
1 | 2025-01-19 | ノートPC | 80000.00 | 1
2 | 2025-01-19 | マウス | 2000.00 | 2
3 | 2025-01-20 | キーボード | 15000.00 | 1
3. 集計クエリを実行
— 日付別の売上合計
SELECT
sale_date,
SUM(amount) as total_sales,
SUM(quantity) as total_quantity
FROM sales
GROUP BY sale_date
ORDER BY sale_date;
— 実行結果
sale_date | total_sales | total_quantity
————|————-|—————-
2025-01-19 | 84000.00 | 3
2025-01-20 | 15000.00 | 1
演習2:S3からデータをロード(COPY)
演習 2
中級
S3に保存したCSVファイルをRedshiftにロードしてみましょう
要件:
S3にCSVファイルをアップロード
COPYコマンドでRedshiftにロード
ロード後のデータを確認
解答を見る
【解答例】
1. CSVファイルを作成(ローカル)
# sales_data.csvファイルの内容(ヘッダーなし)
1,2025-01-19,ノートPC,80000.00,1
2,2025-01-19,マウス,2000.00,2
3,2025-01-20,キーボード,15000.00,1
4,2025-01-20,モニター,30000.00,1
5,2025-01-21,スピーカー,5000.00,2
2. S3にアップロード
# AWS CLIでアップロード
aws s3 cp sales_data.csv s3://my-bucket/redshift/sales_data.csv
# または、AWSコンソール → S3 → バケット → アップロード
3. IAMロールの設定(初回のみ)
【IAMロールの作成】
1. IAMコンソール → ロール → ロールを作成
2. 信頼されたエンティティ:AWS サービス → Redshift → Redshift – Customizable
3. ポリシー:AmazonS3ReadOnlyAccess を選択
4. ロール名:RedshiftS3Role
5. ロールを作成
【Redshiftにアタッチ】
1. Redshiftコンソール → クラスター → 選択
2. アクション → IAMロールを管理
3. 作成したロールを追加
4. Redshiftにテーブル作成
— テーブル作成
CREATE TABLE sales_from_s3 (
sale_id INT,
sale_date DATE,
product_name VARCHAR(200),
amount DECIMAL(10,2),
quantity INT
)
SORTKEY(sale_date);
5. COPYコマンドでロード
— COPYコマンド実行
COPY sales_from_s3
FROM ‘s3://my-bucket/redshift/sales_data.csv’
IAM_ROLE ‘arn:aws:iam::123456789012:role/RedshiftS3Role’
CSV
DELIMITER ‘,’
REGION ‘ap-northeast-1’;
— ロード結果を確認
SELECT * FROM sales_from_s3;
— 件数確認
SELECT COUNT(*) FROM sales_from_s3;
— 結果: 5
ポイント:
COPY コマンドはINSERT文より100倍以上速い
IAM Role が必要(S3へのアクセス権限)
REGION を指定(S3バケットのリージョン)
⏰ 演習終了後は必ずクラスターを一時停止!
Redshiftコンソールを開く
クラスターを選択
「アクション」 → 「クラスターを一時停止」
確認して実行
一時停止中は計算リソースの課金が止まります。再開したい時は「クラスターを再開」。
📝 STEP 12 のまとめ
✅ このステップで学んだこと
Redshift はAWSのクラウド型データウェアハウス
クラスターはリーダーノード とワーカーノード で構成
DISTKEY :JOINでよく使うカラムを指定(データ分散)
SORTKEY :WHERE句でよく使うカラムを指定(ソート)
様々な方法で接続可能(クエリエディタ、psql、DBeaver、Python)
COPYコマンド でS3から高速にデータをロード
💡 重要ポイント
Redshiftは有料サービス 。使わない時は一時停止を忘れずに
DISTKEY はJOINでよく使うカラム、SORTKEY はWHEREでよく使うカラム
大量データのロードはCOPYコマンド を使う(INSERT文は遅い)
本番環境ではセキュリティ設定 を適切に行う(パブリックアクセスOFF)
🎯 次のステップの準備
次のSTEP 13では、「Redshiftへのデータロード」 を詳しく学びます。
S3からの効率的なデータロード方法、エラーハンドリングをマスターしましょう!
❓ よくある質問
Q1: Redshiftの料金はいくらですか?
ノードタイプと台数によります。
・dc2.large (学習用):$0.25/時間
・dc2.8xlarge (本番用):$4.80/時間
・ra3.xlplus (最新):$1.086/時間
最小構成(dc2.large × 2ノード)だと:
$0.25 × 2 × 24時間 × 30日 = 約$360/月(約54,000円)
使わない時は一時停止 すれば課金されません。
Q2: Redshiftを一時停止するにはどうすればいいですか?
AWSコンソールから簡単に停止できます。
1. Redshiftコンソールを開く
2. クラスターを選択
3. 「アクション」→「クラスターを一時停止」
4. 確認して実行
一時停止中は計算リソースの料金は発生しませんが、ストレージ料金($0.024/GB/月)はかかります。
Q3: DISTKEYとSORTKEYは必須ですか?
必須ではありませんが、強く推奨されます。
指定しない場合:
・DISTKEY:自動でラウンドロビン分散(EVEN)
・SORTKEY:ソートされない
小規模データ(数千件)なら問題ありませんが、大規模データ(数百万件以上)では性能が大幅に低下します。
Q4: COPYコマンドで「Access Denied」エラーが出ます
IAM Roleの権限が不足しています。 以下を確認:
1. IAM Roleが設定されているか :Redshiftクラスターにアタッチされているか確認
2. S3へのアクセス権限 :IAM RoleにAmazonS3ReadOnlyAccessポリシーがあるか
3. S3バケットのリージョン :REGIONパラメータを正しく指定しているか
Q5: RedshiftとAthenaの違いは何ですか?
Redshiftはクラスター型、Athenaはサーバーレスです。
Redshift: クラスターを作成、時間課金、高速、頻繁にクエリする場合に最適
Athena: サーバーレス、クエリ課金、やや遅い、たまにクエリする場合に最適
頻繁に分析するならRedshift、たまに分析するならAthenaがおすすめです。