AWS Builder Center: Learn, Build and Connect with builders in the AWS community
AWS Builder Center is the official home for builders on AWS. Share and read what others are working on, follow people who inspire you, explore training and workshops, and find tools to support what you're building.
Amazon Redshift で外部スキーマへのアクセス許可を付与する方法を教えてください。
ユーザーが 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」
ユーザーにアクセス許可を付与するには、次の手順を実行します。
-
Amazon Redshift コンソールを開きます。
-
スーパーユーザーとしてログインします。
-
次のコマンドを実行して、ユーザーがアクセスする外部スキーマへのアクセス許可を確認します。
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 アクセス許可タイプが返されない場合、そのユーザー、ロール、またはグループは外部スキーマをクエリする許可がありません。
-
次のいずれかの 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_name、role_name、または group_name を、アクセス許可を付与する対象ユーザー、ロール、またはグループに置き換えます。
データ共有のアクセス許可に関する問題を解決する
外部スキーマのオブジェクトにアクセス許可を付与しようとする際、次のエラーメッセージが表示されることがあります。
「ERROR: Operation is not supported through datashares (データ共有による操作はサポートされていません)」
このエラーは次の状況で発生します。
- 外部スキーマは、データ共有から作成したデータベースからのものである。
- 元のデータ共有に WITH PERMISSIONS 句が含まれていなかった。
この問題を解決するには、WITH PERMISSION 句を使用してデータ共有からデータベースを再作成します。
次の手順を実行します。
-
次のコマンドを実行して既存のデータ共有データベースを削除します。
DROP database database_created_from_datashare_name;注: database_created_from_datashare_name を実際のデータベース名に置き換えます。
-
次のコマンドを実行してデータベースを再作成します。
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) に置き換えます。
-
次のコマンドを実行して外部スキーマを作成します。
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 をデータ共有から作成したスキーマの名前に置き換えます。
-
次のコマンドを実行して使用を許可します。
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 をスキーマ名に置き換えます。
-
次の 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 を外部テーブル名に置き換えます。
関連情報
関連するコンテンツ
質問済み 2年前
