Amazon Redshift Spectrumのチュートリアルをやってみた!

2020.04.17

前回「Redshift チュートリアルをやってみた!」というブログを書いたのですが、せっかくなのでRedshift Spectrum チュートリアルもやってみました。

  • 前回のブログ

Amazon Redshiftのチュートリアルをやってみた!

Redshift Spectrumでは、データとデータスキーマを外部のAWSサービスに外出しすることで、継続的に発生するデータロードの負荷(圧縮、正規化、最適化など)を軽減できます。

こちらも備忘録を兼ねてブログ化します。

※個人的にわかりやすい手順にまとめているので、実際のステップと異なる部分がありますが、ご了承ください。

IAM Roleの作成

クラスターにアタッチするロールを作成します。

以下ドキュメントの注釈です。

Amazon Redshift のロールを作成する場合は、次のいずれかのアプローチを選択します。

  • Athena データカタログまたは AWS Glue データカタログで Redshift Spectrum を使用する場合は、Amazon Redshift 用の IAM ロールを作成するには に示されているステップに従って進めます。

  • AWS Lake Formation で有効になっている AWS Glue データカタログ で Redshift Spectrum を使用する場合は、以下の手順に示されているステップに従って進めます。

せかっくなので、今回はAWS Lake Formationを利用してみます。

まずは、ポリシーを作成します。

  • ポリシードキュメント
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "RedshiftPolicyForLF",
            "Effect": "Allow",
            "Action": [
                "glue:*",
                "lakeformation:GetDataAccess"
            ],
            "Resource": "*"
        }
    ]
}

ロールの作成で、先ほど作成したポリシーをアタッチします。

Redshift クラスターを作成しIAM Roleをアタッチ

クラスターの作成は前回のブログを参考にしてください。

基本的な設定は同じで、アタッチするIAM Roleを変えるだけです。

クラスターが起動したら、前回同様にSQL Workbench/Jを使って接続確認をおこないます。

サンプルデータの保存

us-west-2以外のリージョンを利用してる場合は、S3のcopyコマンドを使用したデータコピーが必要です。

私はap-northeast-1を利用するので、下記のコマンドを実行します。

  • コマンド
$ aws s3 cp s3://awssampledbuswest2/tickit/spectrum/sales/ s3://redshift-source-tickit-data/spectrum/sales/ --recursive 

外部スキーマの作成

外部(=Glue Data Catalog)に紐づくスキーマを作成するため、Redshiftで下記のコマンドを実行します。

  • コマンド
create external schema spectrum 
from data catalog 
database 'spectrumdb' 
iam_role 'arn:aws:iam::<account_id>:role/mySpectrumRole'
create external database if not exists;

外部テーブルの作成

外部(=Glue Data Catalog)にテーブルを作成するため、Redshiftで下記のコマンドを実行します。

  • コマンド
create external table spectrum.sales(
salesid integer,
listid integer,
sellerid integer,
buyerid integer,
eventid integer,
dateid smallint,
qtysold smallint,
pricepaid decimal(8,2),
commission decimal(8,2),
saletime timestamp)
row format delimited
fields terminated by '\t'
stored as textfile
location 's3://redshift-source-tickit-data/spectrum/sales/'
table properties ('numRows'='172000');

Lake Formationにロケーションの登録

このままでは、Lake formation側のサービスロールであるAWSServiceRoleForLakeFormationDataAccessにS3へのアクセス権限がないため、新たにロケーションを登録します。

クエリの実行

SQL Workbench/Jから簡単なクエリを実行してみます。

select count(*) from spectrum.sales;

結果に 172456 と表示されればOKです。

環境のリセット

最後は忘れずにゴミ掃除しましょう。

スナップショットは残しておくと課金が発生するので、不要な場合はチェックボックスを外しましょう。

まとめ

いかがだったでしょうか。

今回利用したAWS Lake Formationですが、本来はテーブル/カラムレベルでのきめ細かなアクセスコントロールができるみたいです。

次回はこちらもブログ化してみたいと思います。

以上、どなたかの役に立てば幸いです。