0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS Lake Formation + Redshift Spectrum(Glue クローラー使用)でQuickSightデータセットを作る

Last updated at Posted at 2025-03-08

はじめに

QuickSightで、Redshift Spectrumを使って接続したいときがあったので、手順をメモします。Lake Formationが絡んでくると、さらにややこしくなるので、結構ハマりました。

やりたいことは、以下の図のようなイメージです(タイトルに出てきたサービスは赤字にしてあります)。この構成だと、S3内のcsvを更新すれば、Glue Data CatalogやRedshiftの更新などせずに、csvファイルの更新が自動で反映されてQuickSightから見られます(SPICEを利用している場合は、SPICEの更新が必要)。

image.png

Redshift Spectrumを利用しなくても、QuickSightのデータセット接続の際に「Athena」を選択することで、Glue Data Catalogに直接接続することもできます。
ただ、Redshift Spectrumを経由することで、Redshift内のテーブルとしてSQLで加工処理を実施できます(ビュー作成や、他の内部テーブルとの結合など)。他のテーブルもすべてRedshiftにあるなど、Redshiftを中心に管理したいという場合は今回ようにRedshift Spectrumを使うとデータ保管、加工がRedshiftで統一できます。

(念のため補足)
SQLで加工処理したいだけであれば、Athena上でビューを作成することも可能です。他もすべてGlue Data Catalogで統一しているなら、Athena上で全て作成する方が、管理が楽になる可能性もあります。

前提条件

  • 既に、Lake Formationの設定は実施済み
  • Redshift Serverlessの名前空間、ワークグループは作成済み
    • パブリックにアクセス可能、SSL有効
  • QuickSight環境も構築済み

大まかな流れ

以下のような流れで実施します。
ポイントは「外部スキーマの定義」で、クローラーを実行しただけだと、Redshift Serverlessのクエリエディタでクエリはできますが、QuickSightのデータセットとして読み込むことが出来ません。外部スキーマを定義してあげることで、Redshift Spectrumを利用してQuickSightからよみこむことができます

  • クローラーでGlue Tableを作成
    • S3にCSVファイルをアップロード
    • Glue DB作成
    • クローラーで利用するIAMロールにLFで権限付与
    • クローラー作成&実行
  • Redshift Spectrumでクエリしてみる
    • 自分自身にLFで権限付与
    • Redshift Serverlessでクエリする
  • 外部スキーマの定義 ★ポイント
    • IAMロールの紐づけとLF権限付与
    • 外部スキーマ作成
    • 外部スキーマ内のテーブルにクエリしてみる
  • QuickSightのデータセット作成
    • データソース作成
    • データセット作成

やってみる

クローラーでGlue Tableを作成

S3にCSVファイルをアップロード

まずは、使用するテストデータ(CSV)をS3にアップロードします。

image.png

ちなみに、テストデータの中身は以下です。LLMに作ってもらいました。

sample_product_list.csv
product_name,price,stock,category
デスクライト,2500,45,家具
シンプルノート,380,120,文具
マグカップ,850,67,キッチン
ブラックペン,650,89,文具
収納ボックス,1200,34,家具
キーホルダー,300,156,アクセサリー
トートバッグ,1800,23,バッグ
カラフル付箋,420,95,文具
ティーポット,2200,12,キッチン
スマホケース,980,78,アクセサリー

Glue DB作成

Glue Tableを作る前に、DBを作成します。
Glueコンソールから作成しますが、この時Locationに先ほどのS3のパスを指定しましょう。
これを指定しておくことで、Lake FormationでData LocationにS3パスとロールを登録しなくても、DBにTableが作成できるようになります。

image.png

クローラーで利用するIAMロールに権限付与

詳細は省きますが、クローラーで利用するIAMロールに、Lake Formationで以下の権限を付与します。

  • DBを対象とした、Super権限
  • DBの中のALL Tablesを対象とした、Super権限

1つ目の権限でDBにテーブルを作成できるようになり、2つ目の権限でDB内の全てのテーブルを参照できるようになります。

クローラー作成&実行

先ほどのテストデータを格納したS3パスをクローリング先に指定して、Glueのクローラーを作成します。
その際、利用するIAMロールは先ほどLake Formationで権限付与したIAMロールにします。

その後、クローラーを実行すると、権限付与などがうまくいっていれば、以下のようにStatusがCompletedになるはずです。

image.png

Redshift Spectrumでクエリしてみる

自分自身にLake Formationで権限付与

今コンソールログインしているIAMユーザーやIAMロールに対して、Lake Formationで以下の権限付与します。

  • DBの中のALL Tablesを対象とした、Super権限

Redshift Serverlessでクエリする

クエリエディタv2を使って、Redshift ServerlessのワークグループにFederated userでログインします(ユーザー名、パスワード認証だと、クエリができません)。

その後、external databasesの中のawsdatacatalogの中に、先ほど作成したDBと、クローリングした結果作成されたテーブルがあるはずです。
それに対して、クエリすると、データが取得できます。

今時点では、Glue Tableに対して、Redshift Serverlessで接続しているFederated userがクエリをしています。そのため、1つ前の「自分自身にLF権限付与」をしないとエラーでクエリできなくなります。

image.png

一般的には、外部スキーマを作成して、外部テーブルを作成するはずですが、今回はGlueクローラーを使って外部テーブルを先に作成しました。

外部スキーマの定義

IAMロールの紐づけと権限付与

Redshift Spectrumでは、Redshift Serverlessの名前空間に紐づいたIAMロールを使ってクエリします。
そのため、以下のようにIAMロールを作成して紐づけておきます。

image.png

その後、そのIAMロールに、Lake Formationで以下の権限を付与します。

  • DBの中のALL Tablesを対象とした、Super権限

外部スキーマ作成

今回はGlueクローラーで外部テーブルを先に作成したので、外部スキーマが存在していません。これがないとQuickSightからテストデータのテーブルに接続できないため作成していきます。

クエリエディタで、以下を実行します(DBはdevにいる事を前提にしてます)。

create external schema spectrum_test_schema from data catalog 
database 'spectrum_test_db' 
iam_role DEFAULT;

もし上記のSQL文を実行してエラーとなったら、管理者ユーザーでログインし直して、以下を実行してデータベースdevに対してのALL権限を付与してみてください。自身のロール名やユーザー名はselect current_user;を実行して確認してください。

GRANT ALL ON DATABASE dev to "IAMR:<Role-name>"

外部スキーマ内のテーブルにクエリしてみる

先ほど作成した外部スキーマ内に、テーブルが存在して、クエリが実行できるはずです。

ここでは、自分自身ではなく、名前空間に紐づいたIAMロールがクエリします。そのため、そのIAMロールにLake Formationでの権限が付与されていないと、Tablesが0件と表示されます。

image.png

QuickSightのデータセット作成

データソース作成

QuickSightのデータソースを作成します。Redshift(手動接続)から、以下のように接続して作成します。

image.png

データセット作成

今作成したデータソースから、外部スキーマの中のテーブルを選択します。

image.png

以下のように中身が見れて、データセットが作成できます。

image.png

おわりに

ポイントは、Glueクローラーでテーブルを作成したとしても、外部スキーマをRedshiftクエリエディタで作成しないといけないことでした。
そうしないと、QuickSight側でデータセットを作成しようとしても、見えないか、見えてもエラーとなります。
今回検証した環境では、そもそもスキーマが見えませんでしたが、別の環境ではテーブル自体は見えますが、データセットの編集をすると以下のようなエラーが出ました。

No columns are found in the source.

ここら辺はなかなかややこしいところですが、しっかり理解していきたいですね。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?