AWS CloudFormation によるデータ共有の管理 - Amazon Redshift

AWS CloudFormation によるデータ共有の管理

AWS CloudFormation スタックに AWS リソースのプロビジョニングを実行させることで、データ共有の設定を自動化できます。CloudFormation スタックは、同じ AWS アカウント内にある 2 つの Amazon Redshift クラスター間でのデータ共有を設定します。したがって、リソースをプロビジョニングする SQL ステートメントを実行することなく、データ共有を開始できます。

このスタックは、指定したクラスター上にデータ共有を作成します。作成されたデータ共有には、テーブルとサンプルの読み取り専用データが含まれています。このデータは、別の Amazon Redshift Redshift クラスターから読み取ることができます。

CloudFormation を使用せずに SQL ステートメントを実行してデータ共有を設定し、アクセス許可を付与しながら AWS アカウント内でデータ共有を開始する場合は、「AWS アカウント 内のデータへの読み取りアクセスの共有」を参照してください。

データ共有 CloudFormation スタックを実行する前に、IAM ロールと Lambda 関数を作成する許可を持つユーザーとしてログインしておく必要があります。また、同じアカウントに 2 つの Amazon Redshift クラスターが必要です。それらの内の 1 つ producer はサンプルデータの共有に使用し、もう一方の consumer はデータの読み取りに使用します。これらのクラスターに対する主な要件は、それぞれが RA3 ノードを使用していることです。追加の要件については、「Amazon Redshift でデータ共有を使用する際の考慮事項」を参照してください。

Amazon Redshift クラスターの設定の開始方法については、「Amazon Redshift のプロビジョニングされたデータウェアハウス」を参照してください。CloudFormation による設定の自動化の詳細については、「AWS CloudFormation とは」を参照してください。

重要

CloudFormation スタックを起動する前に、同じアカウント内に 2 つの Amazon Redshift クラスターが存在し、クラスターが RA3 ノードを使用することを確認します。各クラスターにデータベースとスーパーユーザーが存在することを確認します。詳細については、CREATE DATABASEおよびsuperuserを参照してください。

Amazon Redshift のデータ共有のために CloudFormation スタックを起動するには
  1. [Launch CFN stack] (CFN スタックを起動する) をクリックし、AWS Management Console内の CloudFormation サービスを開きます。

    プロンプトが表示されたら、サインインします。

    Amazon S3 に保存されている CloudFormation テンプレートファイルを参照しながら、スタック作成プロセスが開始されます。CloudFormation テンプレートは、JSON 形式で作成されたテキストファイルで、スタックを構成する AWS リソースに関する宣言が記述されています。CloudFormation テンプレートの詳細については、「テンプレートの基礎についての学習」を参照してださい。

  2. [Next] (次へ) をクリックして、スタックの詳細を入力します。

  3. [Parameters] (パラメータ) で、クラスターごとに次のように入力します。

    • Amazon Redshift のクラスター名 (例えば、ra3-consumer-cluster)

    • データベース名 (例えば、dev)

    • データベースのユーザー名 (例えば、consumeruser)

    スタックは複数のデータベースオブジェクトを作成するため、テスト用クラスターの使用が推奨されます。

    [Next] を選択します。

  4. スタックに関するオプションが表示されます。

    [Next] (次へ) をクリックして、デフォルト設定を受け入れます。

  5. [機能] で、[AWS CloudFormation によって IAM リソースが作成される場合があることを承認します] を選択します。

  6. [スタックの作成] を選択します。

CloudFormation は、テンプレートを使用しながら 10 分程度で Amazon Redshift スタックを構築し、myproducer_share というデータ共有を作成します。スタックは、スタックの詳細で指定されたデータベースにデータ共有を作成します。このデータベースにあるオブジェクトのみが共有できます。

スタックの作成中にエラーが発生した場合は、以下の手順を実行します。

  • 各 Redshift クラスターに、クラスター名、データベース名、およびデータベースのユーザー名を正しく入力していることを確認します。

  • クラスターに RA3 ノードがあることを確認します。

  • IAM ロールと Lambda 関数を作成するアクセス許可を持っているユーザーとしてログインしていることを確認します。IAM ロールの作成についての詳細は、「IAM ロールの作成」を参照してください。Λ関数作成のポリシーの詳細については、「関数の開発」を参照してください。

作成したデータ共有に対するクエリ

以下の手順を使用するには、説明で示されている各クラスターでクエリを実行するための、アクセス許可が必要です。

データ共有に対しクエリするには
  1. CloudFormation スタックの作成時に入力したデータベース上のプロデューサークラスターに、Amazon Redshift クエリエディタ v2 などのクライアントツールを使用して接続します。

  2. データ共有へのクエリを実行します。

    SHOW DATASHARES; +------------------+-------------+-----------------+-------------------+------------+------------+---------------------+-----------+------------------+--------------------------------------+ | share_name | share_owner | source_database | consumer_database | share_type | createdate | is_publicaccessible | share_acl | producer_account | producer_namespace | +------------------+-------------+-----------------+-------------------+------------+------------+---------------------+-----------+------------------+--------------------------------------+ | myproducer_share | 100 | sample_data_dev | myconsumer_db | INBOUND | NULL | true | NULL | producer-acct | your-producer-namespace | +------------------+-------------+-----------------+-------------------+------------+------------+---------------------+-----------+------------------+--------------------------------------+

    前述のコマンドでは、スタックによって作成されたデータ共有の名前 (myproducer_share) を返します。同時に、データ共有 myconsumer_db に関連付けられたデータベースの名前も返します。

    後述のステップで使用するために、プロデューサーの名前空間識別子をコピーします。

  3. データ共有内のオブジェクトの詳細を表示します。

    DESC DATASHARE myproducer_share; +------------------+--------------------------------------+------------+------------------+-------------+-------------------------------------+-------------+ | producer_account | producer_namespace | share_type | share_name | object_type | object_name | include_new | +------------------+--------------------------------------+------------+------------------+-------------+-------------------------------------+-------------+ | producer-acct | your-producer-namespace | OUTBOUND | myproducer_share | schema | myproducer_schema | true | | producer-acct | your-producer-namespace | OUTBOUND | myproducer_share | table | myproducer_schema.tickit_sales | NULL | | producer-acct | your-producer-namespace | OUTBOUND | myproducer_share | view | myproducer_schema.ticket_sales_view | NULL | +------------------+--------------------------------------+------------+------------------+-------------+-------------------------------------+-------------+

    データ共有の詳細を表示すると、テーブルとビューに関するプロパティが出力されます。スタックは、サンプルデータを含むテーブルとビュー (例えば tickit_salestickit_sales_view) を、プロデューサーデータベースに追加します。TICKIT サンプルデータの詳細については、「サンプルデータベース」を参照してください。

    クエリを実行するために、データ共有に対するアクセス許可を委任する必要はありません。スタックが必要な許可を付与します。

  4. クライアントツールを使用してコンシューマークラスターに接続します。プロデューサの名前空間を指定しながら、データ共有の詳細を表示します。

    DESC DATASHARE myproducer_share OF NAMESPACE '<namespace id>'; --specify the unique identifier for the producer namespace +------------------+--------------------------------------+------------+------------------+-------------+-------------------------------------+-------------+ | producer_account | producer_namespace | share_type | share_name | object_type | object_name | include_new | +------------------+--------------------------------------+------------+------------------+-------------+-------------------------------------+-------------+ | producer-acct | your-producer-namespace | INBOUND | myproducer_share | schema | myproducer_schema | NULL | | producer-acct | your-producer-namespace | INBOUND | myproducer_share | table | myproducer_schema.tickit_sales | NULL | | producer-acct | your-producer-namespace | INBOUND | myproducer_share | view | myproducer_schema.ticket_sales_view | NULL | +------------------+--------------------------------------+------------+------------------+-------------+-------------------------------------+-------------+
  5. データ共有のデータベースとスキーマを指定して、データ共有内のテーブルに対しクエリを実行できます。詳細については、「クロスデータベースクエリの例」を参照してください。次のクエリは、TICKIT サンプルデータベースの SALES テーブルから売上と販売者のデータを返します。詳細については、「サンプルデータベース」を参照してください。

    SELECT * FROM myconsumer_db.myproducer_schema.tickit_sales_view; +---------+--------+----------+---------+---------+--------+---------+-----------+------------+---------------------+ | salesid | listid | sellerid | buyerid | eventid | dateid | qtysold | pricepaid | commission | saletime | +---------+--------+----------+---------+---------+--------+---------+-----------+------------+---------------------+ | 1 | 1 | 36861 | 21191 | 7872 | 1875 | 4 | 728 | 109.2 | 2008-02-18 02:36:48 | | 2 | 4 | 8117 | 11498 | 4337 | 1983 | 2 | 76 | 11.4 | 2008-06-06 05:00:16 | | 3 | 5 | 1616 | 17433 | 8647 | 1983 | 2 | 350 | 52.5 | 2008-06-06 08:26:17 | | 4 | 5 | 1616 | 19715 | 8647 | 1986 | 1 | 175 | 26.25 | 2008-06-09 08:38:52 | | 5 | 6 | 47402 | 14115 | 8240 | 2069 | 2 | 154 | 23.1 | 2008-08-31 09:17:02 | +---------+--------+----------+---------+---------+--------+---------+-----------+------------+---------------------+
    注記

    クエリは、共有スキーマ内のビューに対して実行されます。データ共有から作成されたデータベースに直接接続することはできません。これらのデータベースは読み取り専用です。

  6. 集計を含むクエリを実行するには、次の例を使用します。

    SELECT * FROM myconsumer_db.myproducer_schema.tickit_sales ORDER BY 1,2 LIMIT 5; +---------+--------+----------+---------+---------+--------+---------+-----------+------------+---------------------+ | salesid | listid | sellerid | buyerid | eventid | dateid | qtysold | pricepaid | commission | saletime | +---------+--------+----------+---------+---------+--------+---------+-----------+------------+---------------------+ | 1 | 1 | 36861 | 21191 | 7872 | 1875 | 4 | 728 | 109.2 | 2008-02-18 02:36:48 | | 2 | 4 | 8117 | 11498 | 4337 | 1983 | 2 | 76 | 11.4 | 2008-06-06 05:00:16 | | 3 | 5 | 1616 | 17433 | 8647 | 1983 | 2 | 350 | 52.5 | 2008-06-06 08:26:17 | | 4 | 5 | 1616 | 19715 | 8647 | 1986 | 1 | 175 | 26.25 | 2008-06-09 08:38:52 | | 5 | 6 | 47402 | 14115 | 8240 | 2069 | 2 | 154 | 23.1 | 2008-08-31 09:17:02 | +---------+--------+----------+---------+---------+--------+---------+-----------+------------+---------------------+

    このクエリは、サンプルの TICKIT データから売上データと出品者のデータを返します。

    データ共有に対するクエリの他の例については、「AWS アカウント 内のデータへの読み取りアクセスの共有」を参照してください。