フェデレーション ID を使用して、ローカルリソースと Amazon Redshift Spectrum の外部テーブルへの Amazon Redshift アクセスを管理する
GetDatabaseCredentials
から提供された認証情報を使用して AWS の ID フェデレーションを使用すると、ローカルデータや外部データへの認可とアクセスを簡素化できます。このチュートリアルでは、特定の IAM ロールを使用する代わりに、AWS ID フェデレーションを使用してリソースへのアクセスを提供する方法を説明します。
現在、Amazon S3 にある外部データへのアクセスをユーザーに許可するには、アクセス権限ポリシーで定義されたアクセス権限を持つ IAM ロールを作成します。これにより、ロールが割り当てられたユーザーは、外部データにアクセスできます。これは有効ですが、特定のユーザーに特定の列を使用できないようにするなど、きめ細かいルールを提供したい場合は、外部スキーマで追加の設定が必要な場合があります。
ID フェデレーションでは、GetDatabaseCredentials
から提供された認証情報を使用することで、指定や変更が簡単にできる詳細な IAM ルールを介して AWS Glue や Redshift Spectrum リソースにアクセスできます。これにより、ビジネスルールに適合したアクセスを簡単に適用できます。
フェデレーション認証情報を使用すると、次のような利点があります。
-
Redshift Spectrum では、クラスターにアタッチされた IAM ロールを管理する必要はありません。
-
クラスター管理者は、異なる IAM コンテキストを持ち、コンシューマーがアクセス可能な外部スキーマを作成できます。これは、例えば、異なるコンシューマーが同じ外部スキーマをクエリして、返されたレコードに複数のフィールドを取得する場合、テーブルで列のフィルタリングを実行する場合に便利です。
-
Amazon Redshift へのクエリは、ロールを使用するだけでなく、IAM アクセス許可を持つユーザーを使用して実行できます。
フェデレーション ID でログインする ID の準備
フェデレーション ID でログインする前に、準備のための手順をいくつか実行する必要があります。これらの手順は、Amazon S3 バケットに保存されたデータファイルを参照する既存の Redshift Spectrum 外部スキーマがあり、そのバケットが Amazon Redshift クラスターまたは Amazon Redshift サーバーレスデータウェアハウスと同じアカウントにあることを前提としています。
-
IAM ID を作成する。これはユーザーまたは IAM ロールのどちらでも構いません。IAM がサポートする任意の名前を使用してください。
-
ID に許可ポリシーをアタッチします。次のいずれかを指定します。
-
redshift:GetClusterCredentialsWithIAM
(Amazon Redshift でプロビジョニングされたクラスターの場合) -
redshift-serverless:GetCredentials
(Amazon Redshift サーバーレスの場合)
IAM コンソールを使用して、ポリシーエディタで権限を追加できます。
IAM ID には、外部データにアクセスするための権限も必要です。以下の AWS マネージドポリシーを直接追加して、Amazon S3 へのアクセスを許可します。
-
AmazonS3ReadOnlyAccess
-
AWSGlueConsoleFullAccess
AWS Glue を使用して外部データを準備する場合は、最後のマネージドポリシーが必要です。Amazon Redshift Spectrum へのアクセスを許可する手順の詳細については、Amazon Redshift と Redshift Spectrum の入門ガイドの一部である「Amazon Redshift 用の IAM ロールの作成」を参照してください。これは Redshift Spectrum にアクセスするための IAM ポリシーを追加する手順を示しています。
-
-
Amazon Redshift に接続する SQL クライアントの設定。Amazon Redshift JDBC ドライバーを使用して、ユーザーの認証情報をツールの認証情報プロパティに追加します。SQL Workbench/J のようなクライアントはこれに適しています。次のクライアント接続拡張プロパティを設定します。
-
AccessKeyID — アクセスキーの ID。
-
SecretAccessKey – シークレットアクセスキー (暗号化を使用しない場合は、シークレットキーを送信することによるセキュリティ上のリスクに注意が必要です)。
-
SessionToken – IAM ロールに必要な一連の認証情報。
-
groupFederation — プロビジョニングされたクラスターにフェデレーション ID を設定する場合は、
true
に設定します。Amazon Redshift サーバーレスを使用している場合は、このパラメータを設定しないでください。 -
LogLevel — 整数のログレベルの値。これはオプションです。
-
-
Amazon Redshift または Amazon Redshift サーバーレスコンソールにある JDBC エンドポイントの URL を設定します。URL スキーマを jdbc:redshift:iam: に置き換え、次の書式を使用してください。
-
Amazon Redshift でプロビジョニングされたクラスターの書式:
jdbc:redshift:iam://<cluster_id>.<unique_suffix>.<region>.redshift.amazonaws.com:<port>/<database_name>
例:
jdbc:redshift:iam://test1.12345abcdefg.us-east-1.redshift.amazonaws.com:5439/dev
-
Amazon Redshift サーバーレスの書式:
jdbc:redshift:iam://<workgroup-name>.<account-number>.<aws-region>.redshift-serverless.amazonaws.com:5439:<port>/<database_name>
例:
jdbc:redshift:iam://default.123456789012.us-east-1.redshift-serverless.amazonaws.com:5439/dev
IAM ID を使用して初めてデータベースに接続すると、Amazon Redshift は自動的に同じ名前の Amazon Redshift ID を作成し、プレフィックスとして IAM ユーザーの場合は
IAM:
、IAM ロールの場合はIAMR:
を付けます。このトピックの残りのステップでは、ユーザー向けの例を示します。Redshift ユーザーが自動的に作成されない場合は、管理者アカウントを使用して
CREATE USER
ステートメントを実行し、IAM:<user name>
の形式でユーザー名を指定することで作成できます。 -
-
Amazon Redshift クラスター管理者として、Redshift ユーザーに外部スキーマへのアクセスに必要なアクセス権限を付与します。
GRANT ALL ON SCHEMA my_schema to "IAM:my_user";
Redshift ユーザーに外部スキーマにテーブルを作成する権限を付与するには、そのユーザーがスキーマの所有者である必要があります。例:
ALTER SCHEMA my_schema owner to "IAM:my_user";
-
設定を検証するには、アクセス許可を付与した後で、SQL クライアントを使用してユーザーとしてクエリを実行します。このクエリサンプルは、外部テーブルからデータを取得します。
SELECT * FROM my_schema.my_table;
Redshift Spectrum への ID と権限の伝達を始める
フェデレーション ID を外部テーブルのクエリに渡すには、CREATE EXTERNAL SCHEMA
の IAM_ROLE
クエリパラメータの値として SESSION
を設定します。次のステップでは、外部スキーマにクエリを許可する SESSION
を設定し、活用する方法を説明します。
-
ローカルテーブルと外部テーブルを作成します。AWS Glue でカタログ化された外部テーブルがこれに該当します。
-
IAM ID を使用して Amazon Redshift に接続します。前のセクションで説明したように、Amazon Redshift に ID が接続されると、Redshift データベースユーザーが作成されます。ユーザーが以前には存在しなかった場合は作成されます。新規ユーザーの場合、管理者はユーザーにクエリやテーブルの作成など、Amazon Redshift でタスクを実行する権限を付与する必要があります。
-
管理者アカウントで Redshift に接続します。
SESSION
値を使用して、外部スキーマを作成するコマンドを実行します。create external schema spectrum_schema from data catalog database '<my_external_database>' region '<my_region>' iam_role 'SESSION' catalog_id '<my_catalog_id>';
この場合、
catalog_id
が設定されていることに注意してください。これは、SESSION
によって特定のロールを置き換えるため、この機能で追加された新しい設定になります。この例では、クエリ内の値は実際の値がどのように表示されているかを示しています。
create external schema spectrum_schema from data catalog database 'spectrum_db' region 'us-east-1' iam_role 'SESSION' catalog_id '123456789012'
この場合の
catalog_id
の値は、AWS アカウント ID です。 -
ステップ 2 で接続した IAM ID を使用して、クエリを実行して外部データにアクセスします。例:
select * from spectrum_schema.table1;
この場合、例えば
table1
は Amazon S3 バケット内のファイル内の JSON 形式のデータである可能性があります。 -
クラスターにアタッチされた IAM ロールを使用する外部スキーマが既に存在し、外部データベースまたはスキーマを参照している場合は、既存のスキーマを置き換えて、このステップで説明しているフェデレーション ID を使用するか、新しいスキーマを作成できます。
SESSION
はフェデレーション ID 認証情報が外部スキーマのクエリに使用されることを示します。SESSION
クエリパラメータを使用する場合は、必ず catalog_id
を設定してください。これは、スキーマに使用されるデータカタログを指しているため必須です。以前は、catalog_id
は iam_role
に割り当てられた値から取得していました。このように、ID と認可の伝達を設定すると、例えば Redshift Spectrum にフェデレーション認証情報を使用して外部スキーマをクエリする場合、IAM ロールによる認可は必要ありません。
使用に関する注意事項
よくある接続エラーは、「IAM error retrieving temp credentials: Unable to unmarshall exception response with the unmarshallers provided」です。このエラーは、レガシー JDBC ドライバーを使用していることが原因です。フェデレーテッド ID に必要な最小ドライバーバージョンは 2.1.0.9 です。[Amazon Redshift JDBC ドライバーのバージョン 2.1 をダウンロードする] から JDBC ドライバーを取得できます。
追加リソース
これらのリンクは、外部データへのアクセスを管理するための追加情報を提供します。
-
IAM ロールを使用して Redshift Spectrum データに引き続きアクセスできます。詳細については、「ユーザーに代わって Amazon Redshift が他の AWS のサービスにアクセスすることを許可する」を参照してください。
-
AWS Lake Formation で外部テーブルへのアクセスを管理する場合、フェデレーション IAM ID で Redshift Spectrum を使用して外部テーブルにクエリを実行できます。Redshift Spectrum が AWS Lake Formation に登録されたデータをクエリするために、クラスターにアタッチされた IAM ロールを管理する必要がなくなりました。詳細については、「Amazon Redshift Spectrum での AWS Lake Formation の使用」を参照してください。