Redshiftの「データ共有」とAWS Lake Formationを利用して一元的にアクセスを制御してみた(1.プロデューサーアカウント編)

皆さん、突然ですが、Amazon Redshift「データ共有」機能というものをご存知でしょうか。

Amazon Redshiftの「データ共有」機能は、Redshiftのクラスター内のデータを複数のAWSアカウントの間で安全に共有できるようにする機能です。Redshiftの「データ共有」機能を使用すると、複数のアカウントで共通のデータを共有することができます。さらに、Amazon Redshift データ共有で設定したデータベース、テーブル、列、行レベルのアクセス許可の定義をAWS Lake Formationで一元管理が可能です。

本記事では、今回業務で検証する機会があり、AWS Lake Formationで管理するRedshift「データ共有」機能の設定手順を纏めました。これから設定される方のためにも本ブログで共有したいと思います。

手順が長いため、「1.プロデューサーアカウント編」2.ガバナンスアカウント編3.コンシューマーアカウント編3つのシリーズに分けて紹介します。

それでは、早速本題「1.プロデューサーアカウント編」に入っていきます!

ここでは、主に事前準備とプロデューサーアカウントでの設定手順を紹介します。

はじめに

用語の定義

はじめに、本記事全体に用いる用語について説明します。

  • データ共有Amazon Redshift でデータを共有する単位です。各データ共有は、Amazon Redshift クラスター内の特定のデータベースに関連付けられます。詳細について、Amazon Redshift のデータ共有概念を参照しください
  • Amazon Redshiftプロデューサークラスター(以下、「プロデューサークラスター」という):データを共有するクラスタ
  • Amazon Redshiftコンシューマークラスタ(以下、「コンシューマークラスター」という):データプロデューサークラスターからデータ共有を受けるクラスタ
  • データプロデューサーアカウント:データプロデューサークラスターが存在するAWSアカウント
  • データコンシューマーアカウント:データコンシューマクラスターが存在するAWSアカウント
  • データガバナンスアカウント:データプロデューサークラスターから共有されたデータのアクセス権限を一元管理するアカウント
参考にしたブログサイト

本記事は「Centrally manage access and permissions for Amazon Redshift data sharing with AWS Lake Formation」を参考にしました。詳細に関しては AWS Big Data Blog をご参照ください。

その他
  • 本記事は、Lake Formationを使用してAmazon Redshiftのデータ共有のアクセスや権限を一元管理する方法に焦点を当てています。そのため、インフラ関連、Amazon RedshiftクラスターやIAMユーザーなどの作成手順については対象外となります。

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

まず、3つの記事の全体感を示すために一連の設定手順の概要を記載します。

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

本記事における設定手順

1. 構築に関する設定の一覧

事前にRedShiftは構築しています。構築したの設定内容および手順内で利用する設定値をこちらに記載します。

カテゴリー 項目 本記事の設定値 備考
リージョン リージョン名 東京リージョン
プロデューサー
クラスター構成
クラスタ lf-redshift-producer ※1
クラスターノードタイプ ra3.xlplus ※5
ノード数 1
KMS AWSマネージド型キーaws/redshift
データセット AWSのサンプルデータ ※4
データベース dev ※1
データベース
管理者ユーザー
awsuser ※1
awsuser public ※1
共有対象テーブル名 category_test ※1
共有対象ビュー名 sales_mv ※1
データ共有名 ticket_datashares ※1
コンシューマー
クラスター構成
クラスタ lf-redshift-consumer ※1
クラスターノードタイプ ra3.xlplus ※5
ノード数 1
KMS AWSマネージド型キーaws/redshift
データベース dev ※1
データベース管理者ユーザー awsuser ※1
AWS Glueデータベース データベース名 ticket_datashare
ユーザー構成 管理者ユーザー - ※2
IAMユーザー1 consumer1 ※1 ※3
IAMユーザー2 consumer2 ※1 ※3
操作ツール Webコンソール 使用
クエリエディタv2 使用
  • ※1: 本記事に使用されている設定項目値となり、実際の設定環境に合わせて値を変更ください。
  • ※2: 管理者ユーザーには、AdministratorAccessを付与しています。
  • ※3: コンシューマーアカウント側で動作確認するためのIAMユーザーで、Redshift操作権限が必要です。
  • ※4: AWSサンプルデータは、こちらから入手可能です。
  • ※5: RedShiftのクラスターノードタイプは、ra3クラスター以上を選択してください。

なお、本記事において、Webコンソールの表示言語は基本「日本語」ですが、2023年6月の設定時に「英語」表記となっている部分もございます。そのため、手順の中では一部「英語」表記を使用させていただきます。

2.データプロデューサークラスターアカウント側の設定手順

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

  1. AWSマネジメントコンソールに管理者ユーザーでサインインします。
  2. Amazon Redshiftコンソールを開きます。
  3. (オプション)データ共有対象となるテーブルとマテリアライズドビューを作成します。本記事では、AWSサンプルデータを利用し、1つのテーブルと1つのマテリアライズドビューをデータ共有の対象と設定します。サンプルデータのテーブルは、データ共有として利用できないため、手動でテーブルとマテリアライズドビューを作成します。
    1. ナビゲーションペイン「クエリエディタv2」をクリックします。
    2. 「Redshift query editor v2」画面で、対象のプロデューサークラスター「lf-redshift-producer」を右クリックし、「Create connection」または「Edit connection」を選択します。
    3. 「Edit connection for lf-redshift-producer」ウインドウでは、「Authentication」に「Temporary credentials」を選択し、「Database」にデータベース「dev」、「User name」にユーザー名「awsuser」を入力し、「Save」をクリックします。
    4. クエリエディタページで次のクエリでテーブルを作成し、テーブルにデータをインサートします。以下はサンプルクエリです。

       CREATE TABLE category_test
       (catid smallint default 0, 
       catgroup varchar(10) default 'General', 
       catname varchar(10) default 'General', 
       catdesc varchar(50) default 'General');
      
       INSERT INTO category_test values (1, 'aaa', 'AAA', 'aaa-AAA');
       INSERT INTO category_test values (2, 'bbb', 'BBB', 'bbb-BBB');
       INSERT INTO category_test values (3, 'ccc', 'CCC', 'ccc-CCC');
      
    5. クエリエディタの内容をクリアし、次のクエリでテーブル「category_test」にデータが存在していることを確認します。

        SELECT * FROM category_test
      
    6. クエリエディタの内容をクリアし、次のクエリでマテリアライズドビューを作成します。以下はサンプルクエリです。

       CREATE MATERIALIZED VIEW sales_mv AS
       SELECT sales.salesid, event.eventname, event.starttime, date.caldate, sales.qtysold, sales.pricepaid, sales.saletime
       FROM 
           sales,
           event,
           date
       WHERE 
           sales.listid = event.eventid AND 
           sales.dateid = date.dateid
      
    7. クエリエディタの内容をクリアし、次のクエリでマテリアライズドビュー「sales_mv」にデータが存在していることを確認します。

        SELECT * FROM sales_mv
      
  4. データ共有を作成します。
    1. Amazon Redshift コンソールで、プロデューサークラスター「lf-redshift-producer」を選択します。
    2. クラスターの詳細ページで、「データ共有」タブをクリックします。
    3. 名前空間で作成したデータ共有」で、「データベースに接続」をクリックします。
    4. 「データベースに接続」画面で、「新しい接続を作成」、「一時的な認証情報」の順で選択し、「データベース名」に「dev」、「データベースユーザー」に「awsuser」を記入し、「接続」をクリックします。
    5. 「データ共有」タブ「名前空間で作成されたデータ共有」で「Create datashare」をクリックします。
    6. 「データ共有を作成」画面で、「Datashare type」で「Datashare」を選択し、「データ共有名」で「ticket_datashares」を入力し、「Database name」で「dev」、「パブリックにアクセス可能」で「Turn on」を選択します。
    7. 「データ共有オブジェクト」画面で「追加」をクリックし、「スキーマ」で「public」、「Object types」で「テーブルとビュー」を選択します。「オブジェクトを追加」で「Add specific objects from schema」を選択し、「Available tables and views」から「category_test」と「sales_mv」を選択し、「追加」をクリックします。
    8. 「データコンシューマー」画面で「Publish to AWS Data Catalog」を選択し、「Publish to the following AWS accounts」で「Other AWS accounts」を選択し、「AWS account ID」にデータガバナンスアカウントIDを記入します。「Create datashare」をクリックします。
  5. 「データ共有」を承認します。
    1. 再度「データ共有」タブに戻り、「名前空間で作成されたデータ共有」でデータ共有名「ticket_datashares」が表示され、「データ共有ステータス」が「shared」となっているを確認できます。
    2. ナビゲーションペイン「データ共有」をクリックし、「アカウント内」タブ画面でデータ共有名「ticket_datashares」のデータ共有ステータスが「必要なアクション」となっていることを確認できます。「ticket_datashares」をクリックします。
    3. 「データコンシューマーID」の下に「DataCatalog/コンシューマーアカウントID」コンシューマーのステータスが「Pending authorization」となっていることを確認できます。
    4. 「データコンシューマーID」を選択し、「承認」をクリックします。
    5. 承認されると、「データコンシューマーID」のコンシューマーステータスが「承認済み」となっていることを確認できます。


ここまでは「データプロデューサークラスターアカウント側の設定手順」でした。
次は「データガバナンスアカウント側の設定手順」になります。
詳細に関しては「Redshiftの「データ共有」とAWS Lake Formationを利用して一元的にアクセスを制御してみた(2.ガバナンスアカウント編)」でご説明します。

おたのしみに!!