スキップしてコンテンツを表示

Amazon Redshift で外部スキーマへのアクセス許可を付与する方法を教えてください。

所要時間2分
0

ユーザーが Amazon Redshift クラスターにおいて、外部にあるスキーマのオブジェクトにアクセスできません。

簡単な説明

Amazon Redshift で外部スキーマを使用する際、次のエラーメッセージが表示される場合があります。

  • 「Permission denied」
  • 「Operation is not supported (サポートされていない操作です)」
  • 「External tables are not supported in views (外部テーブルはビューではサポートされていません)」

AWS Lake Formation のアクセス許可に設定ミスがある場合も、Amazon Redshift Spectrum でエラーが発生する可能性があります。この問題を解決するには、テーブルレベルではなく、外部スキーマに対するアクセス許可を付与する必要があります。

解決策

外部スキーマのオブジェクトへのアクセス許可を付与する

Amazon Redshift ユーザーが外部スキーマのオブジェクトへのアクセス許可を持っていない場合、次のエラーが発生する場合があります。

「ERROR: permission denied for schema external_schema_name」

ユーザーにアクセス許可を付与するには、次の手順を実行します。

  1. Amazon Redshift コンソールを開きます。

  2. スーパーユーザーとしてログインします。

  3. 次のコマンドを実行して、ユーザーがアクセスする外部スキーマへのアクセス許可を確認します。

    SELECT *
    FROM SVV_SCHEMA_PRIVILEGES
    WHERE identity_name = 'name_of_the_user/role/group' AND namespace_name = 'external_schema_name';

    注: name_of_the_user/role/group をそれぞれ、アクセス許可を付与する対象のユーザーの名前、ロール、またはグループに置き換えます。external_schema_name を外部スキーマの名前に置き換えます。

    上記のコマンドで USAGE アクセス許可タイプが返されない場合、そのユーザー、ロール、またはグループは外部スキーマをクエリする許可がありません。

  4. 次のいずれかの GRANT コマンドを実行し、外部スキーマを使用する許可を付与します。

    GRANT USAGE ON SCHEMA external_schema_name TO user_name;
    GRANT USAGE ON SCHEMA external_schema_name TO role role_name;
    GRANT USAGE ON SCHEMA external_schema_name TO group group_name;

    注: external_schema_name を外部スキーマ名に置き換えます。user_namerole_name、または group_name を、アクセス許可を付与する対象ユーザー、ロール、またはグループに置き換えます。

データ共有のアクセス許可に関する問題を解決する

外部スキーマのオブジェクトにアクセス許可を付与しようとする際、次のエラーメッセージが表示されることがあります。

「ERROR: Operation is not supported through datashares (データ共有による操作はサポートされていません)」

このエラーは次の状況で発生します。

  • 外部スキーマは、データ共有から作成したデータベースからのものである。
  • 元のデータ共有に WITH PERMISSIONS 句が含まれていなかった。

この問題を解決するには、WITH PERMISSION 句を使用してデータ共有からデータベースを再作成します。

次の手順を実行します。

  1. 次のコマンドを実行して既存のデータ共有データベースを削除します。

    DROP database database_created_from_datashare_name;

    注: database_created_from_datashare_name を実際のデータベース名に置き換えます。

  2. 次のコマンドを実行してデータベースを再作成します。

    CREATE DATABASE database_created_from_datashare_name
    WITH PERMISSIONS
    FROM DATASHARE 'datashare_name'
    OF ACCOUNT 'account_number'
    NAMESPACE 'namespace_uuid';

    注: database_created_from_datashare_name を実際のデータベース名に、datashare_name を実際のデータ共有名に置き換えます。実際のものでそれぞれ、account number を AWS アカウント番号に、namespace_uuid を名前空間の汎用一意識別子 (UUID) に置き換えます。

  3. 次のコマンドを実行して外部スキーマを作成します。

    CREATE EXTERNAL SCHEMA external_schema_name
    FROM REDSHIFT DATABASE database_created_from_datashare_name
    SCHEMA schema_in_database_created_from_datashare;

    注: 実際のものでそれぞれ、external_schema_name を外部スキーマ名に、database_created_from_datashare_name をデータベース名に置き換えます。schema_in_database_created_from_datashare をデータ共有から作成したスキーマの名前に置き換えます。

  4. 次のコマンドを実行して使用を許可します。

    GRANT USAGE on SCHEMA external_schema_name to user_name;
    GRANT USAGE ON SCHEMA database_created_from_datashare_name.schema_in_datashare_name TO user_name;

    注: external_schema_name を外部スキーマ名に置き換えます。user_name を使用許可を付与する対象ユーザー名に置き換えます。実際のものでそれぞれ、database_created_from_datashare_name をデータ共有から作成したデータベースの名前に、schema_in_datashare_name をスキーマ名に置き換えます。

  5. 次の SELECT コマンドを実行して特定のテーブルへのアクセスを許可します。

    GRANT SELECT ON
    TABLE database_created_from_datashare_name.schema_in_datashare_name.table_name
    TO user_name;

    注: 実際のものでそれぞれ、database_created_from_datashare_name をデータ共有から作成したデータベースの名前に、schema_in_datashare_name をスキーマ名に置き換えます。table_name を実際のテーブル名に、user_name を実際のユーザー名に置き換えます。

    スキーマ内のすべてのテーブルへのアクセスを許可するには、次のコマンドを実行します。

    GRANT SELECT ON
    ALL TABLES IN SCHEMA database_created_from_datashare_name.schema_in_datashare_name
    TO user_name;

    注: 実際のものでそれぞれ、database_created_from_datashare_name をデータ共有から作成したデータベースの名前に、schema_in_datashare_name をスキーマ名に置き換えます。user_name を実際のユーザー名に置き換えます。

Lake Formation のアクセス許可に関する問題がある外部スキーマを解決する

AWS Glue データカタログで Lake Formation を有効であることおよび、Amazon Redshift クラスターの AWS Identity and Access Management (IAM) ロールには必要な AWS Glue データカタログへのアクセス許可があることを確認します。

詳細については、「Redshift Spectrum と AWS Lake Formation」および「Lake Formation のアクセス許可を管理する」を参照してください。

外部スキーマに詳細アクセス制御を付与する

Lake Formation またはロール連鎖を使用すると、Amazon Redshift Spectrum での詳細アクセス制御を付与できます。アクセス許可は、スキーマ、テーブル、または列レベルで付与できます。

詳細については、「ロール連鎖を使用して Amazon Redshift Spectrum の外部テーブルへのアクセスを、Amazon Redshift IAM ユーザーおよびグループに限定する」および「データカタログリソースに対するアクセス許可を付与する」を参照してください。

外部テーブルを含むビューを作成する際に、WITH NO SCHEMA BINDING 句を使用する

外部テーブルを参照するビューを作成する際に、次のエラーメッセージが表示される場合があります。

「ERROR: External tables are not supported in views (ビューでは外部テーブルはサポートされません)」

この問題を解決するには、次のコマンドを実行し、WITH NO SCHEMA BINDING 句を使用してビューを作成します。

CREATE OR REPLACE VIEW view_name AS
SELECT * FROM external_schema_name.external_table_name
WITH NO SCHEMA BINDING ;

注: 実際のものでそれぞれ、external_schema_name を外部スキーマ名に、external_table_name を外部テーブル名に置き換えます。

関連情報

SVV_EXTERNAL_SCHEMAS

データ共有で CREATE DATABASE を使用する際のパラメータ

パラメータ

AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ