CREATE EXTERNAL SCHEMA - Amazon Redshift

CREATE EXTERNAL SCHEMA

現在のデータベースに新しい外部スキーマを作成します。この外部スキーマを使用して、Amazon RDS for PostgreSQL または Amazon Aurora PostgreSQL 互換エディションデータベースに接続できます。また、AWS Glueや Athena などの外部データカタログ内のデータベース、あるいは Amazon EMR などの Apache Hive メタストアにあるデータベースを参照する、外部スキーマを作成することもできます。

このスキーマの所有者は CREATE EXTERNAL SCHEMA コマンドの発行者です。外部スキーマの所有者を移行するには、「ALTER SCHEMA」を使用して所有者を変更します。スキーマに他のユーザーやグループへのアクセス権を付与するには、GRANTコマンドを使用します。

外部テーブルのアクセス権限に対して、GRANT または REVOKE コマンドを使用することはできません。代わりに、外部スキーマに対するアクセス権限の付与または取り消しを実行します。

注記

現在、Amazon Athena データカタログに Redshift Spectrum の外部テーブルがある場合は、AWS Glue Data Catalogに Athena データカタログを移行することが可能です。Redshift Spectrum で AWS Glue データカタログを使用するには、AWS Identity and Access Management(IAM) ポリシーの変更が必要になる場合があります。詳細については、Athena ユーザーガイドの「AWS Glue データカタログへのアップグレード」を参照してください。

外部スキーマの詳細を表示するには、SVV_EXTERNAL_SCHEMASシステムビューにクエリを実行します。

構文

次の構文は、外部データカタログを使用してデータを参照するために使用する CREATE EXTERNAL SCHEMA コマンドを示しています。詳細については、「Amazon Redshift Spectrum を使用した外部データのクエリ」を参照してください。

CREATE EXTERNAL SCHEMA [IF NOT EXISTS] local_schema_name
FROM { [ DATA CATALOG ] | HIVE METASTORE | POSTGRES | MYSQL | KINESIS | MSK | REDSHIFT }
[ DATABASE 'database_name' ]
[ SCHEMA 'schema_name' ]
[ REGION 'aws-region' ]
[ URI 'hive_metastore_uri' [ PORT port_number ] ]
IAM_ROLE { default | 'SESSION' | 'arn:aws:iam::<AWS アカウント-id>:role/<role-name>' }
[ SECRET_ARN 'ssm-secret-arn' ]
[ AUTHENTICATION { none | iam } ]
[ CLUSTER_ARN 'arn:aws:kafka:<region>:<AWS アカウント-id>:cluster/msk/<cluster uuid>' ]
[ CATALOG_ROLE { 'SESSION' | 'catalog-role-arn-string' } ]
[ CREATE EXTERNAL DATABASE IF NOT EXISTS ]
[ CATALOG_ID 'Amazon Web Services account ID containing Glue or Lake Formation database' ]

次の構文は、RDS POSTGRES または Aurora PostgreSQL への横串検索を使用してデータを参照するために使用する CREATE EXTERNAL SCHEMA コマンドを示しています。作成した外部スキーマで、Kinesis Data Streams などのストリーミングソースを参照することもできます。詳細については、「Amazon Redshift での横串検索を使用したデータのクエリの実行」を参照してください。

CREATE EXTERNAL SCHEMA [IF NOT EXISTS] local_schema_name
FROM POSTGRES
DATABASE 'federated_database_name' [SCHEMA 'schema_name']
URI 'hostname' [ PORT port_number ]
IAM_ROLE { default | 'arn:aws:iam::<AWS アカウント-id>:role/<role-name>' }
SECRET_ARN 'ssm-secret-arn'

次の構文は、RDS MySQL または Aurora MySQL への横串検索を使用してデータを参照するために使用する CREATE EXTERNAL SCHEMA コマンドを示しています。詳細については、「Amazon Redshift での横串検索を使用したデータのクエリの実行」を参照してください。

CREATE EXTERNAL SCHEMA [IF NOT EXISTS] local_schema_name
FROM MYSQL
DATABASE 'federated_database_name'
URI 'hostname' [ PORT port_number ]
IAM_ROLE { default | 'arn:aws:iam::<AWS アカウント-id>:role/<role-name>' }
SECRET_ARN 'ssm-secret-arn'

次に、Kinesis のストリームデータの参照に使用する、CREATE EXTERNAL SCHEMA コマンドでの構文記述を示します。詳細については、「ストリーミング取り込み」を参照してください。

CREATE EXTERNAL SCHEMA [IF NOT EXISTS] schema_name
FROM KINESIS
IAM_ROLE { default | 'arn:aws:iam::<AWS アカウント-id>:role/<role-name>' }

次の構文は、Amazon Managed Streaming for Apache Kafka クラスターとそのトピックを参照して取り込むために使用する CREATE EXTERNAL SCHEMA コマンドについて説明します。CLUSTER_ARN は、データを読み込んでいる Amazon MSK クラスターを指定します。詳細については、「ストリーミング取り込み」を参照してください。

CREATE EXTERNAL SCHEMA [IF NOT EXISTS] schema_name
FROM MSK
IAM_ROLE { default | 'arn:aws:iam::<AWS アカウント-id>:role/<role-name>' }
AUTHENTICATION { none | iam }
CLUSTER_ARN 'msk-cluster-arn';

次の構文は、クロスデータベースクエリを使用してデータを参照するために使用する CREATE EXTERNAL SCHEMA コマンドを示しています。

CREATE EXTERNAL SCHEMA local_schema_name
FROM  REDSHIFT
DATABASE 'redshift_database_name' SCHEMA 'redshift_schema_name'

パラメータ

IF NOT EXISTS

指定されたスキーマが既に存在する場合、コマンドはエラーで終了するのではなく、何も変更しないで、スキーマが存在するというメッセージを返すことを示す句。この句は、CREATE EXTERNAL SCHEMA で既存のスキーマを作成しようとしてもスクリプトが失敗しないため、スクリプトを作成する際に便利です。

local_schema_name

新しい外部スキーマの名前。有効な名前の詳細については、「名前と識別子」を参照してください。

FROM [ DATA CATALOG ] | HIVE METASTORE | POSTGRES | MYSQL | KINESIS | MSK | REDSHIFT

外部データベースの場所を示すキーワード。

DATA CATALOG は、外部データベースが Athena データカタログまたは AWS Glue Data Catalog 内で定義されていることを示します。

外部データベースが別の AWS リージョンにある外部データカタログで定義されている場合は、REGION パラメータが必要です。DATA CATALOG はデフォルトです。

HIVE METASTORE は、外部データベースが Apache Hive メタストアで定義されていることを示します。HIVE METASTORE が指定されている場合は、URI が必要です。

POSTGRES は、外部データベースが RDS PostgreSQL または Aurora PostgreSQL で定義されていることを示します。

MYSQL は、外部データベースが RDS MySQL または Aurora MySQL で定義されていることを示します。

KINESIS は、データソースが Kinesis Data Streams からのストリームであることを示します。

MSK は、データソースが Amazon MSK のトピックであることを示します。

FROM REDSHIFT

データベースが Amazon Redshift にあることを示すキーワード。

DATABASE 'redshift_database_name' SCHEMA 'redshift_schema_name'

Amazon Redshift データベースの名前。

redshift_schema_name は、Amazon Redshift のスキーマを示します。デフォルトの redshift_schema_namepublic です。

DATABASE 'federated_database_name'

サポートされている PostgreSQL または MySQL データベースエンジンの外部データベースの名前を示すキーワード。

[SCHEMA 'schema_name']

schema_name は、サポートされている PostgreSQL データベースエンジンのスキーマを示します。デフォルトの schema_namepublic です。

サポートされている MySQL データベースエンジンへの横串検索を設定する場合、SCHEMA を指定することはできません。

REGION 'aws-region'

外部データベースが Athena データカタログまたは AWS Glue Data Catalog 内で定義されている場合の、データベースが存在する AWS リージョン。このパラメータは、データベースが外部データカタログで定義されている場合に必要です。

URI 'hive_metastore_uri' [ PORT port_number ]

サポートされている PostgreSQL または MySQL データベースエンジンのホスト名 URI と port_number。hostname は、レプリカセットのヘッドノードです。エンドポイントは、Amazon Redshift クラスターから到達可能 (ルーティング可能) である必要があります。PostgreSQL のデフォルトの port_number は 5432 です。MySQL のデフォルトの port_number は 3306 です。

データベースが Hive メタストアにある場合は、URI を指定し、オプションでメタストアのポート番号を指定します。デフォルトのポート番号は 9083 です。

URI にはプロトコル仕様 ("http://") が含まれていません。有効な URI の例: uri '172.10.10.10'

注記

サポートされている PostgreSQL または MySQL データベースエンジンは、Amazon Redshift クラスターと同じ VPC 内に存在する必要があります。Amazon Redshift と RDS PostgreSQL または Aurora PostgreSQL を関連付けるセキュリティグループを作成します。

IAM_ROLE { default | 'SESSION' | 'arn:aws:iam::<AWS アカウント-id>:role/<role-name>' }

デフォルトキーワードを使用して、CREATE EXTERNAL SCHEMA コマンドの実行時にデフォルトとして設定され、クラスターに関連付けられた IAM ロールの使用を、Amazon Redshift に指示します。

フェデレーション ID を使用して Amazon Redshift クラスターに接続し、このコマンドを使用して作成された外部スキーマからテーブルにアクセスする場合は、'SESSION' を使用します。詳細については、フェデレーション ID の設定方法を説明している「フェデレーション ID を使用してローカルリソースへの Amazon Redshift アクセスおよび Amazon Redshift Spectrum 外部テーブルを管理する」を参照してください。ARN の代わりに 'SESSION' を使用するこの設定は、DATA CATALOG を使用してスキーマを作成した場合にのみ使用できることに注意してください。

クラスターが認証と承認に使用する IAM ロールの Amazon リソースネーム (ARN) を使用します。少なくとも、IAM ロールには、Amazon S3 バケットで LIST オペレーションを実行してアクセスを受ける許可と、バケットに含まれる Amazon S3 オブジェクトで GET オペレーションを実行する許可が必要です。

以下に ARN が 1 つの場合の IAM_ROLE パラメータ文字列の構文を示します。

IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-name>'

ロールを連鎖することで、クラスターは別のアカウントに属している可能性がある別の IAM ロールを引き受けることができます。最大 10 個までのロールを連鎖できます。ロールの連鎖の例については、「Amazon Redshift Spectrum での IAM ロールの連鎖」を参照してください。

この IAM ロールに次のような IAM アクセス許可ポリシーをアタッチします。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AccessSecret", "Effect": "Allow", "Action": [ "secretsmanager:GetResourcePolicy", "secretsmanager:GetSecretValue", "secretsmanager:DescribeSecret", "secretsmanager:ListSecretVersionIds" ], "Resource": "arn:aws:secretsmanager:us-west-2:123456789012:secret:my-rds-secret-VNenFy" }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": [ "secretsmanager:GetRandomPassword", "secretsmanager:ListSecrets" ], "Resource": "*" } ] }

フェデレーションクエリで使用する IAM ロールを作成するステップについては、「フェデレーテッドクエリを使用するためのシークレットと IAM ロールの作成」を参照してください。

注記

連鎖したロールのリストには空白を含めないでください。

以下に連鎖された 3 つのロールの構文を示します。

IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-1-name>,arn:aws:iam::<aws-account-id>:role/<role-2-name>,arn:aws:iam::<aws-account-id>:role/<role-3-name>'
SECRET_ARN 'ssm-secret-arn'

AWS Secrets Manager を使用して作成された、(サポート対象の) PostgreSQL または MySQL データベースエンジンシークレットの、Amazon リソースネーム (ARN)。シークレットの ARN を作成および取得する方法については、AWS Secrets Managerユーザーガイドの「シークレットを作成する」および「Retrieving the Secret Value Secret」を参照してください。

CATALOG_ROLE { 'SESSION' | catalog-role-arn-string}

データカタログの認証と認可のためにフェデレーション ID を使用して Amazon Redshift クラスターに接続する場合は、'SESSION' を使用します。フェデレーション ID のステップを完了するための詳細については、「フェデレーション ID を使用してローカルリソースへの Amazon Redshift アクセスおよび Amazon Redshift Spectrum 外部テーブルを管理する」を参照してください。この 'SESSION' ロールは、DATA CATALOG でスキーマを作成した場合にのみ使用できることに注意してください。

クラスターによってデータカタログの認証と認可に使用される IAM ロールの Amazon リソースネーム (ARN) を使用します。

CATALOG_ROLE は Amazon Redshift を指定せず、指定された IAM_ROLE を使用します。カタログロールには、AWS Glueあるいは Athena のデータカタログへのアクセス許可が必要です。詳細については、「Amazon Redshift Spectrum 用の IAM ポリシー」を参照してください。

以下に ARN が 1 つの場合の CATALOG_ROLE パラメータ文字列の構文を示します。

CATALOG_ROLE 'arn:aws:iam::<aws-account-id>:role/<catalog-role>'

ロールを連鎖することで、クラスターは別のアカウントに属している可能性がある別の IAM ロールを引き受けることができます。最大10 個までのロールを連鎖できます。詳細については、「Amazon Redshift Spectrum での IAM ロールの連鎖」を参照してください。

注記

連鎖したロールのリストは、空白を含むことができません。

以下に連鎖された 3 つのロールの構文を示します。

CATALOG_ROLE 'arn:aws:iam::<aws-account-id>:role/<catalog-role-1-name>,arn:aws:iam::<aws-account-id>:role/<catalog-role-2-name>,arn:aws:iam::<aws-account-id>:role/<catalog-role-3-name>'

CREATE EXTERNAL DATABASE IF NOT EXISTS

指定の外部データベースが存在しない場合に、DATABASE 引数で指定された名前で外部データベースを作成する句。指定の外部データベースが存在する場合、コマンドは変更を加えません。この場合、コマンドは、エラーで終了せず、外部データが存在することを示すメッセージを返します。

注記

CREATE EXTERNAL DATABASE IF NOT EXISTS を HIVE METASTORE と併用することはできません。

AWS Lake Formation が有効になっているデータカタログで、CREATE EXTERNAL DATABASE IF NOT EXISTS を使用するには、データカタログに対し CREATE_DATABASE を実行する許可が必要です。

CATALOG_ID 'Glue または Lake Formation データベースに含まれるアマゾン ウェブ サービスのアカウント ID '

データカタログデータベースが保存されているアカウント ID。

CATALOG_ID は、次のいずれかを設定することで、データカタログの認証と承認にフェデレーション ID を使用して Amazon Redshift クラスターまたは Amazon Redshift サーバーレスに接続する予定の場合に限り指定できます。

  • CATALOG_ROLE'SESSION'

  • IAM_ROLE'SESSION''CATALOG_ROLE' をデフォルトに設定する

フェデレーション ID のステップを完了するための詳細については、「フェデレーション ID を使用して、ローカルリソースと Amazon Redshift Spectrum の外部テーブルへの Amazon Redshift アクセスを管理する」を参照してください。

AUTHENTICATION

ストリーミング取り込み用に定義された認証タイプ。認証タイプによるストリーミング取り込みは、Amazon Managed Streaming for Apache Kafka と連携します。AUTHENTICATION タイプには以下のものがあります。

CLUSTER_ARN

ストリーミング取り込みの場合、ストリーミング元の Amazon Managed Streaming for Apache Kafka クラスターのクラスター識別子。詳細については、「ストリーミングの取り込み」を参照してください。

使用に関する注意事項

Athena データカタログを使用する場合の制限については、「AWS 全般のリファレンス」の「Athena の制限」を参照してください。

AWS Glue Data Catalog を使用する場合の制限については、「AWS 全般のリファレンス」の「AWS Glue の制限」を参照してください。

これらの制限は、Hive メタストアには適用されません。

スキーマの数は 1 つのデータベースにつき最大 9,900 個です。詳細については、Amazon Redshift 管理ガイドの「クォータと制限」を参照してください。

スキーマの登録を解除するには、DROP SCHEMAコマンドを使用します。

外部スキーマの詳細を表示するには、システムビューにクエリを実行します。

次の例では、米国西部 (オレゴン) リージョンの sampledb という名前のデータカタログのデータベースを使用して外部スキーマを作成します。この例を Athena または AWS Glue データカタログで使用します。

create external schema spectrum_schema from data catalog database 'sampledb' region 'us-west-2' iam_role 'arn:aws:iam::123456789012:role/MySpectrumRole';

次の例は、外部スキーマを作成し、spectrum_dbという名前で新しい外部データベースを作成します。

create external schema spectrum_schema from data catalog database 'spectrum_db' iam_role 'arn:aws:iam::123456789012:role/MySpectrumRole' create external database if not exists;

次の例では、hive_dbという名前の Hive メタストアデータベースを使って外部スキーマを作成します。

create external schema hive_schema from hive metastore database 'hive_db' uri '172.10.10.10' port 99 iam_role 'arn:aws:iam::123456789012:role/MySpectrumRole';

次の連鎖ロールの例では、Amazon S3 へのアクセスにロール myS3Role を使用し、データカタログへのアクセスには myAthenaRole を使用します。詳細については、「Amazon Redshift Spectrum での IAM ロールの連鎖」を参照してください。

create external schema spectrum_schema from data catalog database 'spectrum_db' iam_role 'arn:aws:iam::123456789012:role/myRedshiftRole,arn:aws:iam::123456789012:role/myS3Role' catalog_role 'arn:aws:iam::123456789012:role/myAthenaRole' create external database if not exists;

次の例では、Aurora PostgreSQL データベースを参照する外部スキーマを作成します。

CREATE EXTERNAL SCHEMA [IF NOT EXISTS] myRedshiftSchema FROM POSTGRES DATABASE 'my_aurora_db' SCHEMA 'my_aurora_schema' URI 'endpoint to aurora hostname' PORT 5432 IAM_ROLE 'arn:aws:iam::123456789012:role/MyAuroraRole' SECRET_ARN 'arn:aws:secretsmanager:us-east-2:123456789012:secret:development/MyTestDatabase-AbCdEf'

次の例では、外部スキーマを作成し、コンシューマークラスターにインポートされた sales_db を参照しています。

CREATE EXTERNAL SCHEMA sales_schema FROM REDSHIFT DATABASE 'sales_db' SCHEMA 'public';

次の例では、Aurora MySQL データベースを参照する外部スキーマを作成します。

CREATE EXTERNAL SCHEMA [IF NOT EXISTS] myRedshiftSchema FROM MYSQL DATABASE 'my_aurora_db' URI 'endpoint to aurora hostname' IAM_ROLE 'arn:aws:iam::123456789012:role/MyAuroraRole' SECRET_ARN 'arn:aws:secretsmanager:us-east-2:123456789012:secret:development/MyTestDatabase-AbCdEf'