カピバラ好きなエンジニアブログ

興味ある技術とか検証した内容を赴くままに書いていきます。カピバラの可愛さこそ至高。

Redshiftクラスターを構築してみた(AWSチュートリアル)

Redshiftは何回か構築したことがありましたが、記事として残したことはなかったので今更ですが残しておきます。

公式のチュートリアルを参考に実施していきます。
docs.aws.amazon.com

尚、公式に書いてある通り、以下の料金が発生するので気を付けてください。

作成するサンプルクラスターは、ライブ環境で実行されます。本チュートリアルで設計されるサンプルクラスターの使用については、サンプルクラスターを削除するまでのオンデマンドレートが 1 時間あたり 0.25 USD になります。


実施作業

準備

AWSアカウント及びVPCは事前に作成済みです。
作業ユーザは管理者相当の権限を持っています。
Redshiftの設定時に必要になるサブネットグループとセキュリティグループの作成は以下の手順で実施します。

サブネットグループ作成

Redshiftコンソールを開いて、左の設定からサブネットグループを選択します。
f:id:live-your-life-dd18:20210428151211p:plain


クラスターサブネットグループの作成を選択します。
f:id:live-your-life-dd18:20210428151335p:plain


サブネットグループを作成するVPCを選択して、VPC配下のサブネットをグループに割り当てます。
f:id:live-your-life-dd18:20210428151553p:plain


作成できました。
f:id:live-your-life-dd18:20210428151702p:plain

セキュリティグループ作成

Redshiftクラスターに設定するセキュリティグループを作成します。
EC2コンソールを開いてセキュリティグループの作成を押下します。
f:id:live-your-life-dd18:20210428152558p:plain


セキュリティグループ名を入力し、インバウンドルールとアウトバウントルールを設定します。
インバウンドルールはRedshiftのポートへの許可とアクセスする自分のIPを設定します。
アウトバウントルールはデフォルトにしておきます。
f:id:live-your-life-dd18:20210428152752p:plain


タグは設定せずにセキュリティグループを作成を押下します。
f:id:live-your-life-dd18:20210428152904p:plain


セキュリティグループが作成されました。
f:id:live-your-life-dd18:20210428183930p:plain

ステップ 1: 前提条件の設定

前提条件は以下の2つです。

1つ目は実施済みのためスキップするとして、2つ目はRedshiftへのアクセスするためのポートがネットワークとして許可されているかどうかを確認します。


RedshiftのポートはSQLクライアントツールからアクセスするときに必要になるので、もしプライベートなネットワーク上のコンピュータからRedshiftにアクセスする場合はFWなどが許可されているか見ておく必要があります。
今回は不要なのでスキップします。

ステップ 2: IAM ロールを作成する

次はRedshiftに設定するIAMロールを設定します。

Redshiftの中にあるデータであれば、RedshiftのDBユーザ/パスワードが作成されていれば問題ないですが、S3上のCSVファイルをロードする、といったRedshift以外のAWSサービスと連携するときはRedshiftにアタッチされたIAMロールの権限が使用されます。

IAMロール作成

IAMマネジメントコンソールからロールの作成をします。
f:id:live-your-life-dd18:20210428143929p:plain


AWSサービスからRedshiftを選択します。
f:id:live-your-life-dd18:20210428144034p:plain


ユースケースはRedshift - Customizableを選択します。
f:id:live-your-life-dd18:20210428144126p:plain


S3ReadOnlyPolicyを選択して、次のステップを押下します。
f:id:live-your-life-dd18:20210428144314p:plain


タグは設定せずに次のステップを押下します。
f:id:live-your-life-dd18:20210428144418p:plain


ロールの作成を押下して、IAMロールを作成します。
f:id:live-your-life-dd18:20210428144523p:plain


IAMロールが作成されました。
f:id:live-your-life-dd18:20210428144700p:plain

ステップ 3: サンプルAmazon Redshift クラスターの作成

IAMロールができたら次はRedshiftクラスターを作成していきます。

クラスター情報設定

Redshiftコンソールにアクセスし、クラスターを作成を押下します。
f:id:live-your-life-dd18:20210428144900p:plain

クラスター識別子(クラスターの名前)を入力し、無料トライアルを選択します。
すると自動で使用するノード・ストレージ・料金が決定します。
f:id:live-your-life-dd18:20210428145107p:plain

尚、本番稼働を選択するともう少し細かい設定が可能です。
ノードタイプdc2.large以外を使用したい場合はそちらを選択ください。
f:id:live-your-life-dd18:20210428145235p:plain

DB情報・IAM設定

次にRedshiftのDBとマスターユーザの設定をします。
またクラスターにアタッチするIAMロールもここで設定します。
f:id:live-your-life-dd18:20210428145714p:plain

オプション設定

最後に追加のオプションを設定します。
何もしないとデフォルトのもので構築されますが、今回は敢えて手動で設定していきます。
f:id:live-your-life-dd18:20210428150055p:plain


ネットワークとセキュリティは以下のように設定します。
f:id:live-your-life-dd18:20210428153421p:plain


それ以外はバックアップのスナップショット保持期間以外デフォルトで設定し、クラスターを作成を押下します。
f:id:live-your-life-dd18:20210428153652p:plain


以下の2つのエラーが出ました。
f:id:live-your-life-dd18:20210428153750p:plain
f:id:live-your-life-dd18:20210428153803p:plain


以下のように修正しました。
f:id:live-your-life-dd18:20210428153845p:plain
f:id:live-your-life-dd18:20210428153855p:plain


再度クラスターを作成を押下したところ、次は以下のエラーが発生しました。
原文

MasterUsername parameter must be lowercase, begin with a letter, contain only alphanumeric characters, underscore ('_'), plus sign ('+'), dot ('.'), at ('@'), or hyphen ('-'), and be less than 128 characters.

日本語訳

MasterUsernameパラメータは、小文字で、文字で始まり、英数字、アンダースコア('_')、プラス記号('+')、ドット('・')、アット('@')、またはハイフン('-')のみを含み、128文字以下である必要があります。



どうやら大文字が使えないみたいなので、小文字に修正します。
f:id:live-your-life-dd18:20210428154212p:plain


作成中になったので、クラスターが作成されるまでしばし待ちます。
f:id:live-your-life-dd18:20210428154251p:plain

ステップ 4: クラスターへのアクセスの許可

クエリエディタを使用せずにクラスターへのアクセスを確認します。
やりかたは色々ありますが、今回は同VPC上にあるEC2(Linux)からのアクセスを確認します。
f:id:live-your-life-dd18:20210428155124p:plain


まずはEC2を作成して、ローカルPCからSSHでログインします(手順全スキップ)


以下のコマンドを実行してpsqlコマンドを実行可能な状態にします。

sudo yum install postgresql -y



インストールができているとpsqlのヘルプコマンドが実行できるはずです。
f:id:live-your-life-dd18:20210428160037p:plain


Redshiftクラスターへの接続のためのコマンドは以下のドキュメントに書いてあるので、参考にしつつコマンドを作成します。
必要な情報はRedshiftクラスターの詳細設定を確認すると書いてあります。
docs.aws.amazon.com


以下をクリックすると必要な情報がコピーできると思います。
ポートやDB名なども一緒にコピーされるので、コマンドに転記するときはご注意ください。
f:id:live-your-life-dd18:20210428160801p:plain


実際にEC2からコマンドを実行すると以下のようにRedshiftクラスターに接続ができました。

$ psql -h test-redshift-cluster.XXXXXXXXXX.ap-northeast-1.redshift.amazonaws.com -U postgres1 -d tesetdb -p 5439

f:id:live-your-life-dd18:20210428160642p:plain


"\l"を実行するとDB一覧が確認できます。
f:id:live-your-life-dd18:20210428161215p:plain

ステップ 5: クエリエディタへのアクセスを許可し、クエリを実行する

先ほど実施した内容をクエリエディタから実行してみます。
まずはRedshiftコンソールからクエリエディタを開きます。
f:id:live-your-life-dd18:20210428161331p:plain


もしクエリエディタが開けなかった場合は以下のリンクを参考にIAMユーザの権限を確認してみてください。
docs.aws.amazon.com


クエリエディタが開くのでデータベースに接続を押下します。
f:id:live-your-life-dd18:20210428161541p:plain


クラスター、データベース名、データベースユーザーを入力して接続を押下します。
SSMを使用して接続もできますが、今回は直接入力します。
f:id:live-your-life-dd18:20210428161643p:plain


無事接続ができると左側にテーブル名が表示されます。
f:id:live-your-life-dd18:20210428161801p:plain


以下のSQLを真ん中のエディタに入力して実行してみます。

create table shoes(
                shoetype varchar (10),
                color varchar(10));
insert into shoes values 
('loafers', 'brown'),
('sandals', 'black');
select * from shoes; 



最後のselectで取得された結果がRows returnedに表示されています。
f:id:live-your-life-dd18:20210428162230p:plain


表示された結果はファイルとしてダウンロードが可能です。
f:id:live-your-life-dd18:20210428162326p:plain

ステップ 6: Amazon S3 のサンプルデータをロードする

次はS3からRedshiftにデータをロードしてみます。
まずはSQLを実行してテーブルを作成します。


SQLは数が多いので以下リンクにあるものを上から順番に実施します。
docs.aws.amazon.com


実行が完了するとテーブルが以下のように作成されていることが確認できます。
f:id:live-your-life-dd18:20210428162832p:plain


サンプルファイルをダウンロードします。
https://docs.aws.amazon.com/ja_jp/redshift/latest/gsg/samples/tickitdb.zip


ファイルを解凍して一時的に作ったS3バケットにアップロードします。
f:id:live-your-life-dd18:20210428163616p:plain


以下のリンクを確認して、S3上のファイルからRedshiftにロードするSQLを作成して実行します。
docs.aws.amazon.com


全部のSQLはここに書けないので一部だけ載せます。
IAMロールは事前に作成したロールのarnを設定します。
このSQLを実行してみます。

copy users from 's3://test-tmp-20210428/tickitdb/allusers_pipe.txt' 
credentials 'aws_iam_role=arn:aws:iam::XXXXXXXXX:role/testRedshiftRole' 
delimiter '|' region 'ap-northeast-1';



エラーで失敗しました。

ERROR: User arn:aws:redshift:ap-northeast-1:XXXXXXXXX:dbuser:test-redshift-cluster/postgres1 is not authorized to assume IAM Role arn:aws:iam::941996685139:role/testRedshiftRole



確認したところ、アタッチしたと思っていたIAMロールがアタッチされていないことがわかりましたので、手動で設定して再度SQLを実行します。
f:id:live-your-life-dd18:20210428182333p:plain


SQLが正常終了しました。
同じように他のSQLも実行していきます。
f:id:live-your-life-dd18:20210428182510p:plain

全部実行し終えたら次にいきます。

ステップ 7: クエリ例を試す

S3上のファイルから取り込んだデータに対して以下のリンクにあるSQLを実行して結果を取得します。
docs.aws.amazon.com


実際に実行した結果は以下です。
いずれも問題なくデータの取得ができました。
※何回かCOPYコマンドを実行したので複数入っているデータもあります。

その1
f:id:live-your-life-dd18:20210428183301p:plain

その2
f:id:live-your-life-dd18:20210428183320p:plain

その3
f:id:live-your-life-dd18:20210428183341p:plain

その4
f:id:live-your-life-dd18:20210428183401p:plain

感想及び所感

チュートリアルに従って実施するだけなので、比較的サッと終わるかと思いましたが、意外と詰まりどころが多くて時間かかりました。


構築系はコンソールからだとどうしても時間がかかってしまうので、検証用にCloudformationなどを使っていつでも構築できるようにしておいた方が良さそうです。