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' ] [ IAM_ROLE [ default | 'SESSION' | 'arn:aws:iam::<AWS アカウント-id>
:role/<role-name>
' ] ] [ AUTHENTICATION [ none | iam | mtls] ] [ AUTHENTICATION_ARN 'acm-certificate-arn' | SECRET_ARN 'ssm-secret- arn' ] [ URI ['hive_metastore_uri' [ PORT port_number ] | 'hostname' [ PORT port_number ] | 'msk bootstrap URL'] ] [ 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 コマンドについて説明します。接続するには、ブローカー URI を指定します。詳細については、「マテリアライズドビューへのストリーミング取り込み」を参照してください。
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] schema_name FROM MSK [ IAM_ROLE [ default | 'arn:aws:iam::<AWS アカウント-id>
:role/<role-name>
' ] ] URI 'msk bootstrap URL' AUTHENTICATION [ none | iam | mtls ] [ AUTHENTICATION_ARN 'acm-certificate-arn' | SECRET_ARN 'ssm-secret- 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_name は
public
です。 - DATABASE 'federated_database_name'
-
サポートされている PostgreSQL または MySQL データベースエンジンの外部データベースの名前を示すキーワード。
- [SCHEMA 'schema_name']
-
schema_name は、サポートされている PostgreSQL データベースエンジンのスキーマを示します。デフォルトの schema_name は
public
です。サポートされている MySQL データベースエンジンへの横串検索を設定する場合、SCHEMA を指定することはできません。
- REGION 'aws-region'
-
外部データベースが Athena データカタログまたは AWS Glue Data Catalog 内で定義されている場合の、データベースが存在する AWS リージョン。このパラメータは、データベースが外部データカタログで定義されている場合に必要です。
- URI [ 'hive_metastore_uri' [ PORT port_number ] | 'hostname' [ PORT port_number ] | 'msk bootstrap URL' ]
-
サポートされている PostgreSQL または MySQL データベースエンジンのホスト名 URI と port_number。hostname は、レプリカセットのヘッドノードです。エンドポイントは、Amazon Redshift クラスターから到達可能 (ルーティング可能) である必要があります。PostgreSQL のデフォルトの port_number は 5432 です。MySQL のデフォルトの port_number は 3306 です。
注記
サポートされている PostgreSQL または MySQL データベースエンジンは、Amazon Redshift クラスターと同じ VPC 内にあり、Amazon Redshift と RDS の url-rsPostgreSQL または Aurora PostgreSQL をリンクするセキュリティグループが必要です。さらに、拡張 VPC ルーティングを使用して、クロス VPC ユースケースを設定できます。詳細については、「RedShift マネージド VPC エンドポイント」を参照してください。
Hive メタストア URI の指定
データベースが Hive メタストアにある場合は、URI を指定し、オプションでメタストアのポート番号を指定します。デフォルトのポート番号は 9083 です。
URI にはプロトコル仕様 ("http://") が含まれていません。有効な URI の例:
uri '172.10.10.10'
。ストリーミング取り込み用のブローカー URI の指定
ブートストラップブローカー URI を含めると、Amazon MSK クラスターに接続してストリーミングデータを受信できます。詳細と例については、「Amazon Managed Streaming for Apache Kafka からのストリーミング取り込みを開始する」を参照してください。
- 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 Serverless に接続する予定の場合に限り指定できます。CATALOG_ROLE
~'SESSION'
IAM_ROLE
、'SESSION'
、'CATALOG_ROLE'
をデフォルトに設定する
フェデレーション ID のステップを完了するための詳細については、「フェデレーション ID を使用して、ローカルリソースと Amazon Redshift Spectrum の外部テーブルへの Amazon Redshift アクセスを管理する」を参照してください。
- AUTHENTICATION
-
ストリーミング取り込み用に定義された認証タイプ。認証タイプによるストリーミング取り込みは、Amazon Managed Streaming for Apache Kafka と連携します。
AUTHENTICATION
タイプには以下のものがあります。none — 必要な認証がないことを指定します。これは、MSK での認証されていないアクセスに対応します。
iam — IAM 認証を指定します。これを選択するときは、IAM ロールに IAM 認証のアクセス許可があることを確認します。外部スキーマの定義の詳細については、「Amazon Managed Streaming for Apache Kafka (Amazon MSK) からのストリーミング取り込みを開始する」を参照してください。
mtls – クライアントとサーバー間の認証を行うことで、相互 Transport Layer Security が安全な通信を提供することを指定します。この場合、クライアントは Redshift で、サーバーは Amazon MSK です。mTLS によるストリーミング取り込みの設定の詳細については、「Amazon MSK からの Redshift ストリーミング取り込みにおける mTLS による認証」を参照してください。
- AUTHENTICATION_ARN
-
Amazon Redshift が Amazon MSK による mtls 認証に使用する AWS Certificate Manager 証明書の ARN。ARN は、発行された証明書を選択する際に ACM コンソールで利用できます。
- CLUSTER_ARN
-
ストリーミング取り込みの場合、CLUSTER_ARN は、ストリーミング元の Amazon Managed Streaming for Apache Kafka クラスターのクラスター識別子です。CLUSTER_ARN を使用する場合は、
kafka:GetBootstrapBrokers
アクセス許可を含む IAM ロールポリシーが必要です。このオプションは、下位互換性のために用意されています。現在、ブートストラップブローカー URI オプションを使用して 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'