Site cover image

kohei-matsunobu-tech-blog

クラウド・プログラミング関連などのちょっとした気づきを書いてます!Notionでメモしていることを公開してます。このブログはスモールスタートしたばかりなので、UI/UXなどは定期的に改善予定です。

Redshift Serverlessに入門してみた

AWS Certified Data Engineer Associate認定試験でRedshiftに関するハンズオンをしたかったので、Redshift Serverlessを構築してみる。

1. Redshift Serverlessとは

従来のRedshiftを構築する際は、クラスタを構成するノード数やインスタンスタイプの設定、コンピューティングノードのスライス設定など手間がかかるかつインスタンスタイプによっては高額になってしまうところをRedshift Serverlessであればサーバレスの特性を活かし、ノード部分の設定側を意識せず低コストで構築できる機能になります。

クラスタの概念がなくなり、「名前空間」「ワークグループ」というコンポーネントによってRedshiftを管理します。

名前空間やワークグループなどRedshift Serverlessに関する記事は以下が参考になります。

2. 前提
  1. 新規AWSアカウントを作成し、無料利用枠で実施
    1. Organizationから検証用アカウントを作成することをお勧めします
3. Redshift Serverlessを構築してみる

以下AWS公式チュートリアルをもとに一通りRedshift Serverlessを組んでみる

  1. AWSマネジメントコンソールから[Redshift]を開く
    Image in a image block
  2. Redshiftトップ画面の[Redshift Serverlessの無料トライアルをお試しください]を選択
    Image in a image block
  3. [設定]セクションは[デフォルト設定を使用]を選択
    Image in a image block

    [デフォルト設定を使用]を洗濯していると[名前空間]セクション内の設定は自動設定された状態になる。[設定をカスタマイズ]を設定していると[名前空間]セクションのカスタマイズが可能。

    Image in a image block
    Image in a image block
    Image in a image block
  4. その他の設定は行わず、[設定を保存]する

    すると、以下のような画面が表示されるので、Redshift Serverlessが作成されるまで待機(数分ほど)

    Image in a image block

    Redshift Serverlessの作成が完了したら、以下のように[complete]が表示されるので、[次へ]を選択

    Image in a image block
  5. Redshift Serverless ダッシュボードを確認する

    サーバレスダッシュボード画面の[名前空間/ワークグループ]に作成した名前空間が利用可能状態になっていることを確認

    Image in a image block
  6. サンプルデータをロードする

    Redshift Serverlessが作成できているので、サーバレスダッシュボード画面の[データをクエリ]からデータをクエリすることができるので選択する

    Image in a image block

    すると、Redshift query editor v2画面が表示される

    Image in a image block

    Redshift query editor v2画面のリソース一覧にさきほど作成したServerlessが表示されているので選択する

    Image in a image block

    すると、ワークグループに接続するための設定画面が表示される。今回はハンズオン通りに進めるのでデフォルト設定のまま[Create connection]を選択する。実務では要件によって接続情報の設定が必要になる。

    Image in a image block

    正常に接続ができた場合、Serverlessリソース配下に3つのスキ-マが作成される。これらのスキーマにあるデータセットをRedshift Serverless内にロードすることができる。

    Image in a image block

    今回はハンズオン通りに進めるので、[sample_data_dev]>[tickit]データセットを選択し、Redshift Serverlessにロードする

    Image in a image block

    すると、初めてロードする際は以下のようなデータベース作成の確認画面が表示されるので、[Create]を選択する

    Image in a image block

    正常にデータベースが作成されたら、以下のようにクエリエディタが表示される

    Image in a image block
  7. サンプルデータをクエリしてみる

    クエリエディタ上部の[Run all]を選択し、サンプルクエリエディタの内容でクエリを実行してみる

    Image in a image block

    クエリが正常実行された場合、クエリ結果が各クエリエディタごとに出力される。[Result1]タブおよび[Result2]タブから詳細を確認することができる。

    Image in a image block

    出力結果はJSONとCSVでDLできる

    Image in a image block

    [Chart]を有効にすることで、グラフを表示することができる

    Image in a image block

    グラフの場合、PNGとJPEGでDLできる

    Image in a image block
4. Redshift ServerlessにS3データをロードしてみる

Redshift Serverlessの基本的な構築はできたので、実務でもありそうなReshift ServerlessにS3上のデータをロードしてみる

  1. 名前空間の設定を行う

    S3からデータをロードする前に、IAMロールを作成して名前空間にアタッチする必要がある。[Redshift]>[名前空間の設定]から対象名前空間の詳細画面を開く

    Image in a image block

    名前空間詳細画面の[セキュリティと暗号化]タブから[IAMロールを管理]を選択

    Image in a image block

    すると、IAMロールの設定画面が表示される。[IAMロールの管理]>[IAMロールを作成]を選択する。

    Image in a image block

    今回はハンズオンなので、[任意のS3バケット]を選択し、[IAMロールをデフォルトとして作成する]を選択する。実務ではIAMの最小権限の原則に従い、必要な権限のみをアタッチするようにすること。

    Image in a image block

    [関連付けられたIAMロール]の一覧にIAMロールが作成されていることを確認して、[変更を保存]を選択する

    Image in a image block

    さきほど指定したIAMロールが名前空間と同期(in-sync)されたことを確認する

    Image in a image block
  2. S3からデータを実際にロードしてみる

    Redshift query editor v2画面に戻り、以下のように[+]>[Notebook]を選択する。Notebookを選択することで、新たにSQLノートブックを作成することができる。Notebookを使用することでインタラクティブにSQLクエリを実行することができる。

    Image in a image block
    Image in a image block

    今回は、devデータベースを選択する

    Image in a image block

    以下をクエリエディタにコピペする。以下はdevデータベースにテーブルを新規作成するクエリになる。

    CREATE TABLEの詳細は以下AWS公式にあります

    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);                        
    
    create table event(
    eventid integer not null distkey,
    venueid smallint not null,
    catid smallint not null,
    dateid smallint not null sortkey,
    eventname varchar(200),
    starttime timestamp);
    
    create table sales(
    salesid integer not null,
    listid integer not null distkey,
    sellerid integer not null,
    buyerid integer not null,
    eventid integer not null,
    dateid smallint not null sortkey,
    qtysold smallint not null,
    pricepaid decimal(8,2),
    commission decimal(8,2),
    saletime timestamp);
    Image in a image block

    その後、[Run]を選択してクエリを実行する

    Image in a image block

    クエリが正常実行されたこと[Result1][Result2][Result3]タブから確認する

    Image in a image block

    S3からデータをロードするため、[+]>[SQL]を選択してSQLを入力するためのセルを新規追加する。

    Image in a image block
    Image in a image block

    以下S3バケットからデータをロードするためのCOPYコマンドをセル内に設定する。

    COPYコマンドの詳細は以下AWS公式にあります

    COPY users 
    FROM 's3://redshift-downloads/tickit/allusers_pipe.txt' 
    DELIMITER '|' 
    TIMEFORMAT 'YYYY-MM-DD HH:MI:SS'
    IGNOREHEADER 1 
    REGION 'us-east-1'
    IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-name>';                    
                        
    COPY event
    FROM 's3://redshift-downloads/tickit/allevents_pipe.txt' 
    DELIMITER '|' 
    TIMEFORMAT 'YYYY-MM-DD HH:MI:SS'
    IGNOREHEADER 1 
    REGION 'us-east-1'
    IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-name>';
    
    COPY sales
    FROM 's3://redshift-downloads/tickit/sales_tab.txt' 
    DELIMITER '\t' 
    TIMEFORMAT 'MM/DD/YYYY HH:MI:SS'
    IGNOREHEADER 1 
    REGION 'us-east-1'
    IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-name>';
    Image in a image block

    [Run]を選択して、S3からサンプルデータをロードする

    Image in a image block

    正常にロードか完了した場合、[Result1][Result2][Result3]タブにsuccessfullyの文字が表示されている

    Image in a image block

    S3からロードしたデータをSELECTしてみる。新たにSQLセルを追加し、以下のクエリをコピペ実行する。

    SELECT構文の詳細は以下AWS公式にあります

    -- Find top 10 buyers by quantity.
    SELECT firstname, lastname, total_quantity 
    FROM   (SELECT buyerid, sum(qtysold) total_quantity
            FROM  sales
            GROUP BY buyerid
            ORDER BY total_quantity desc limit 10) Q, users
    WHERE Q.buyerid = userid
    ORDER BY Q.total_quantity desc;
    
    -- Find events in the 99.9 percentile in terms of all time gross sales.
    SELECT eventname, total_price 
    FROM  (SELECT eventid, total_price, ntile(1000) over(order by total_price desc) as percentile 
           FROM (SELECT eventid, sum(pricepaid) total_price
                 FROM   sales
                 GROUP BY eventid)) Q, event E
           WHERE Q.eventid = E.eventid
           AND percentile = 1
    ORDER BY total_price desc;
    Image in a image block

    すると、S3からロードされたデータがクエリでき、出力結果に表示されるはず

    Image in a image block
    Image in a image block
5. リソースのクリーンアップ

Redshift Serverlessなので、Redshiftと違いクエリ実行による従量課金となるので、立ち上げた状態でも課金は発生しないが、念の為リソースはクリーンアップしておく

  1. Resshift query editor v2の接続を切断

    Redshift query editor v2画面から対象のリソースの[Delete connection]を選択し、接続を切断する

    Image in a image block
    Image in a image block
  2. ワークグループの削除

    [Redshift]>[ワークグループの設定]から対象ワークグループを選択し、[アクション]>[削除]を選択する

    Image in a image block

    すると、ワークグループ削除の確認画面が表示される。ワークグループの削除に[削除]と入力する。

    また、[関連付けられた名前空間***を削除する]にチェックを入れておくこと。

    加えて、[最終スナップショットを作成]については今回ハンズオンなので、チェックを外すこと。実務の場合は、スナップショットを保持するかどうか確認が必要。スナップショットは保持している間料金が発生するので注意する。

    内容に問題なければ[削除]を選択する

    Image in a image block

    正常に削除されたら、サーバレスダッシュボードから[名前空間/ワークグループ]上にリソースがないことを確認すること

    Image in a image block
6. 感想・まとめ

ハンズオンに要した時間は30分ほどだった。Redshiftだとクラスタ作成からノード、スライスの設定など手動作成する部分が多く時間がかかるが、Redshift Serverlessの構築は短時間でかつシンプルなアーキテクチャを構築可能ですね!

今回のハンズオンではS3からサンプルデータをロードしてみたが、Redshift Spectrumなど直接データロードせずにS3上のデータをクエリする部分についても検証してみたい。