Redshiftのデータ共有機能とAWS Lake Formationでアクセス制御してみた(3.コンシューマーアカウント編)

「Redshiftの「データ共有」とAWS Lake Formationを利用して一元的にアクセスを制御してみた」シリーズの第3回目となります。

前回の「2.ガバナンスアカウント編」に引き続き、「3.コンシューマーアカウント編」を解説していきます。

ここでは、主にコンシューマーアカウントでの設定手順を紹介します。

また、コンシューマーアカウント設定手順の後に、追加設定と手順に利用していたリソースのクリーンアップも記載してますので、ぜひ最後まで読んでいただければ幸いです。

AWS Lake Formationで管理するRedshift「データ共有」機能の設定手順の流れ

1.データプロデューサーアカウントでデータ共有作成(「1.プロデューサーアカウント編」)

プロデューサーアカウントの管理者ユーザーは、Amazon Redshift「データ共有」を作成します。その後、ガバナンスアカウントのデータカタログにアクセスを許可します。

2.データガバナンスアカウントでDB作成及び権限設定(「2.ガバナンスアカウント編」)

ガバナンスアカウントの管理者ユーザーは、「データ共有」を受け入れます。「データ共有」に関連付けられたAmazon Redshiftデータベースを参照可能なAWS Glueデータベースを作成します。Lake Formationが管理できるようにAWS Glueデータベースおよびテーブル操作権限をコンシューマーアカウントに付与します。

3.データコンシューマーアカウントで権限設定(「3.コンシューマーアカウント編」※本記事)

コンシューマーアカウントの管理者ユーザーは、AWS RAMを経由してリソース共有の招待を受け入れ、Lake Formationでアカウント内のIAMユーザーにきめ細かい権限を付与します。コンシューマークラスター内にDB及びユーザーを作成し、ユーザーに権限を付与します。

4.データコンシューマーアカウントで動作確認(「3.コンシューマーアカウント編」※本記事)

IAMユーザーはコンシューマーアカウントにログインし、データセットにアクセスできることを確認します。

前提条件

コンシューマークラスターアカウントにおける前提条件
  • 管理者ユーザーには、データレイク管理者権限とクラスター管理者権限を付与しています。
  • テスト用のIAMユーザーには、Redshiftアクセス権限を付与しています。

設定手順

それでは、具体的な設定手順に入っていきます。

1. データコンシューマークラスターアカウント側の設定手順
  1. AWSマネジメントコンソールに管理者ユーザーでサインインします。
  2. Resource Access Managerでリソース共有を受け入れます。
    1. Resource Access Managerコンソール画面を開きます。
    2. ナビゲーションペイン「リソースの共有」をクリックし、「自分と共有:リソース共有」画面で、ステータスが「保留中」のリソース共有が2通あることを確認できます。
    3. それぞれの名前をクリックし、「リソース共有を承認」をクリックし、リソース共有を受け入れます。
    4. ステータスが「アクティブ」になっていることが確認できます。
  3. Lake FormationでIAMユーザー「consumer1」に権限を設定します。
    1. AWS Lake Formationコンソールを開きます。
    2. (オプション)Lake Formationコンソールに初めてログインする場合、設定画面が表示されます。「Add myself」を選択し、「Get started」をクリックします。
    3. ナビゲーションペイン「Data catalog」、「Databases」の順でクリックします。
    4. 「Databases」画面で、ガバナンスアカウントから共有されたDB「ticket_datashare」を選択し、「Actions」、「Grant」の順でクリックします。
    5. 「Grant data permissions」画面で、「Principals」に「IAM users and roles」を選択し、対象のIAMユーザー「consumer1」を選択します。
    6. 「LF-Tags or catalog resources」に「Named data catalog resources」を選択し、「Databases」にデータベース「ticket_datashare」を選択します。
    7. 「Database permissions」に「Describe」を選択し、「Grant」をクリックします。
    8. 再度ナビゲーションペイン「Data catalog」、「Databases」の順でクリックします。
    9. 「Databases」画面で、DB「ticket_datashare」を選択し、「アクション」、「Grant」の順でクリックします。
    10. 「Grant data permissions」画面で、「Principals」に「IAM users and roles」選択し、対象のIAMユーザー「consumer1」を選択します。
    11. 「LF-Tags or catalog resources」で「Named data catalog resources」を選択します。「Databases」にデータベース「ticket_datashare」を選択します。「Tables」にテーブル「public.category_test」選択します。
    12. 「Table permissions」に「Select」を選択します。
    13. 「Data permissions」に「All data access」を選択し、「Grant」をクリックします。
  4. Lake FormationでIAMユーザー「consumer2」に権限を設定します。
    1. ナビゲーションペイン「Data catalog」、「Databases」の順でクリックします。
    2. 「Databases」画面で、ガバナンスアカウントから共有されたDB「ticket_datashare」を選択し、「アクション」、「Grant」の順でクリックします。
    3. 「Grant data permissions」画面で、「Principals」に「IAM users and roles」を選択し、対象のIAMユーザー「consumer2」を選択します。
    4. 「LF-Tags or catalog resources」に「Named data catalog resources」を選択し、「Databases」にデータベース「ticket_datashare」を選択します。(※1.4~1.8までの手順は「consumer1」をご参照ください)
    5. 「Database permissions」に「Describe」を選択し、「Grant」をクリックします。
    6. 再度ナビゲーションペイン「Data catalog」、「Databases」の順でクリックします。
    7. 「Databases」画面で、DB「ticket_datashare」」を選択し、「アクション」、「Grant」の順でクリックします。
    8. 「Grant data permissions」画面で、「Principals」に「IAM users and roles」選択し、対象のIAMユーザー「consumer2」を選択します。
    9. 「LF-Tags or catalog resources」で「Named data catalog resources」を選択します。「Databases」にデータベース「ticket_datashare」を選択します。「Tables」にテーブル「public.sales_mv」選択します。
    10. 「Table permissions」に「Select」を選択します。
    11. 「Data permissions」に「Column-based access」、「Include columns」の順で選択します。「Select columns」に共有するカラム「eventname」、「starttime」、「caldate」、「saletime」を選択し、「Grant」をクリックします
  5. 「Permissions」画面で、それぞれ権限が付与されることを確認できます。
  6. RedshiftクラスターからDBを作成し対象ユーザーに権限を付与します。
    1. Amazon Redshiftコンソールを開き、ナビゲーションペイン「クエリエディタv2」をクリックします。
    2. 対象のコンシューマークラスター「lf-redshift-consumer」を右クリックし、「Create connection」または「Edit connection」を選択します。
    3. 「編集」ウインドウでは、「Authentication」に「Temporary credentials」を選択し、「Database」にデータベース「dev」、「User name」にユーザー名「awsuser」を入力し、「Create connection」をクリックします。
    4. 「クエリエディタ」ページでDB作成クエリを実行します。以下はサンプルクエリです。

      CREATE DATABASE ticket_datashare 
      FROM ARN 'arn:aws:glue:<ガバナンスクラスターリージョン>:<ガバナンスアカウントID>:database/ticket_datashare' 
      WITH DATA CATALOG SCHEMA 
      
    5. クエリエディタの内容をクリアして、次にユーザー作成のクエリとユーザー許可のクエリを実行します。以下はサンプルクエリです。

      CREATE USER IAM:consumer1 password disable;
      GRANT USAGE ON DATABASE ticket_datashare TO IAM:consumer1
      CREATE USER IAM:consumer2 password disable;
      GRANT USAGE ON DATABASE ticket_datashare TO IAM:consumer2
      
    6. 「クエリエディタv2」ページの左下にある設定アイコンをクリックして、「Account settings」ウインドウを開き、「Authenticate with IAM credentials」にチェックを入れて、「Save」をクリックします。

  7. IAMユーザー「consumer1」からデータを抽出します。

    1. AWSマネジメントコンソールにIAMユーザー「consumer1」でサインインします。
    2. Amazon Redshiftコンソールを開きます。
    3. ナビゲーションペインで[クエリエディター V2]を選択します。
    4. 対象のコンシューマークラスター名「lf-redshift-consumer」を右クリックし、「Create connection」または「Edit connection」を選択します。
    5. 「編集」ウインドウでは、「認証」で「Temporary credentials」を選択し、「Database」にデータベース名を入力し、「Save」をクリックします。
    6. 「クエリエディタ」ページでカレントユーザー確認クエリを実行し、結果に「IAM:consumer1」が表示されることを確認します。以下はサンプルクエリです。

      SELECT * FROM current_user
      
    7. IAMユーザーconsumer1に権限を付与したテーブル「category_test」に対して、データ抽出クエリを実行します。対象データが抽出されることを確認できます。以下はサンプルクエリです。

      SELECT * FROM ticket_datashare.public.category_test
      
    8. 権限を付与していないビュー「sales_mv」に対して、データ抽出クエリを実行します。クエリ実行エラーが発生することを確認できます。

      SELECT * FROM ticket_datashare.public.sales_mv
      
  8. IAMユーザー「consumer2」からデータを抽出します。

    1. AWSマネジメントコンソールにIAMユーザー「consumer2」でサインインします。
    2. Amazon Redshiftコンソールを開きます。
    3. ナビゲーションペインで[クエリエディター V2]を選択します。
    4. 対象のコンシューマークラスター名「lf-redshift-consumer」に接続します。
    5. 「クエリエディタ」ページにカレントユーザー確認クエリを実行し、結果に「IAM:consumer2」が表示されることを確認します。
    6. IAMユーザーconsumer2に権限を付与したビュー「sales_mv」に対して、データ抽出クエリを実行します。対象データが抽出されることを確認できます。以下はサンプルクエリです。
    7. 権限を付与していないテーブル「category_test」に対して、データ抽出クエリを実行します。クエリ実行エラーが発生することを確認できます。
2. 追加設定(オプション)

プロデューサークラスターの対象テーブルにデータを追加し、コンシューマークラスターから新規追加されたデータが抽出されることを確認します。

  1. プロデューサーアカウントの設定手順

    1. AWSマネジメントコンソールに管理者ユーザーでサインインします。
    2. Amazon Redshiftコンソールを開きます。
    3. ナビゲーションペイン「クエリエディター V2」をクリックします。
    4. 対象クラスター「lf- redshift-producer」に接続します。
    5. データ新規追加SQLクエリを実行し、新規データが増えたことを確認できます。以下はサンプルクエリです。

      INSERT INTO category_test values (4, 'ddd', 'DDD', 'ddd-DDD');
      SELECT * FROM category_test
      
  2. コンシューマーアカウントの確認手順

    1. AWSマネジメントコンソールからIAMユーザー「consumer1」でサインインします。
    2. Amazon Redshiftコンソールを開きます
    3. ナビゲーションペイン「クエリエディター V2」をクリックします。
    4. 対象クラスター「lf- redshift-consumer」に接続します。
    5. IAMユーザーconsumer1に権限を付与したテーブル「category_test」に対して、データ抽出クエリを実行します。追加された対象データが抽出されることを確認できます。

      SELECT * FROM ticket_datashare.public.category_test
      

番外編(オプション)

リソースのクリーンアップ
  1. コンシューマーアカウントのクリーンアップ
    1. Data lake permissionを削除(Revoke)します。
    2. 作成したユーザー「consumer1」と「consumer2」を削除します。
    3. Redshift「if-redshift-consumer」を削除します。
    4. Redshift用に作成されたIAMロールを削除します。
  2. ガバナンスアカウントのクリーンアップ
    1. Data lake permissionsを削除します。
    2. Databases→ticket_datashareを削除します。
  3. プロデューサーアカウントのクリーンアップ
    1. データ共有を削除します。
    2. Redshift「If-redshift-producer」を削除します。
    3. Redshift用のIAMロールを削除します。

最後に

最後までお読みいただきありがとうございます。

1.プロデューサーアカウント編」、「2.ガバナンスアカウント編」、「3.コンシューマーアカウント編」3つのシリーズにわたってご説明いたしましたが、AWS Lake Formationによる一元管理のRedshiftデータ共有機能について、何となくイメージがつきましたか。

組織内でのデータ共有が必要な企業や複数のAWSアカウントでデータ共有を行う必要のある企業にとって、運用や管理が簡素化されるため重要な機能となります。今後、AWS Lake Formationによる一元管理のRedshiftデータ共有機能の需要が益々高まっていくと予想されます。

以上、「Redshiftの「データ共有」とAWS Lake Formationを利用して一元的にアクセスを制御してみた」でした!