メニュー
Amazon Redshift
クラスター管理ガイド (API バージョン 2012年12月1日)

ユーザーに代わって Amazon Redshift が他の AWS のサービスにアクセスすることを許可する

一部の Amazon Redshift 機能では、ユーザーに代わって Amazon Redshift が他の AWS のサービスにアクセスする必要があります。例えば、COPY および UNLOAD コマンドでは、Amazon Simple Storage Service (Amazon S3) バケットを使用してデータを Amazon Redshift クラスターにロードまたはアンロードできます。Amazon Redshift Spectrum では、Amazon Athena または AWS Glue のデータカタログを使用できます。Amazon Redshift クラスターがユーザーに代わってタスクを実行するには、クラスターにセキュリティ認証情報を指定します。セキュリティ認証情報を指定する望ましい方法は、AWS Identity and Access Management (IAM) ロールを指定する方法です。COPY と UNLOAD には、AWS アクセスキーを指定することもできます。

他の AWS のサービスにアクセスするための適切なアクセス許可を持つ IAM ロールを作成する方法を以下で説明します。Amazon Redshift コマンドの実行時に、ロールをクラスターに関連付けてから、そのロールの Amazon リソースネーム (ARN) を指定する必要があります。詳細については、「IAM ロールを使用して COPY、UNLOAD、および CREATE EXTERNAL SCHEMA オペレーションを承認する」を参照してください。

Amazon Redshift クラスターが AWS のサービスにアクセスすることを許可する IAM ロールを作成する

ユーザーに代わって Amazon Redshift クラスターが他の AWS のサービスと通信することを許可する IAM ロールを作成するには、以下の手順を実行します。

Amazon Redshift が AWS のサービスにアクセスすることを許可する IAM ロールを作成するには

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

  2. ナビゲーションペインで [Roles (ロール) ] を選択します。

  3. [Create role] を選択します。

  4. [AWS service]、[Redshift] の順に選択します。

  5. [Select your use case] で、[Redshift - Customizable]、[Next: Permissions] の順に選択します。

  6. [Attach permissions policy] ページが表示されます。COPY および UNLOAD を使用して Amazon S3 にアクセスするには、AmazonS3ReadOnlyAccess を選択します。Redshift Spectrum の場合は、Amazon S3 アクセスに加えて、AWSGlueConsoleFullAccess または AmazonAthenaFullAccess を追加します。[Next: Review] を選択します。

  7. [Role name] で、ロールの名前 (RedshiftCopyUnload など) を入力します。[Create Role] を選択します。

  8. 新しいロールは、そのロールを使用するクラスターのすべてのユーザーが利用できます。特定のクラスターの特定のユーザーのみ、または特定のリージョンのクラスターのみにアクセスを制限するには、ロールの信頼関係を編集します。詳細については、「IAM ロールへのアクセスの制限」を参照してください。

  9. ロールとクラスターを関連付けます。クラスターの作成時に IAM ロールをクラスターに関連付けるか、既存クラスターにロールを追加できます。詳細については、「IAM ロールをクラスターに関連付ける」を参照してください。

IAM ロールへのアクセスの制限

デフォルトでは、Amazon Redshift クラスターに使用できる IAM ロールはそのクラスターですべてのユーザーが利用できます。特定のクラスターの特定の Amazon Redshift データベースユーザーまたは特定のリージョンに IAM ロールを制限することもできます。

IAM ロールの使用を特定のデータベースユーザーのみに許可するには、次の手順に従います。

IAM ロールへのアクセス権を持つ特定のデータベースユーザーを特定する

  1. Amazon Redshift クラスターでデータベースユーザーの Amazon リソースネーム (ARN) を特定します。データベースユーザーの ARN は次の形式になります。arn:aws:redshift:region:account-id:dbuser:cluster-name/user-name

  2. IAM コンソール (url="https://console.aws.amazon.com/) を開きます。

  3. ナビゲーションペインで [Roles (ロール) ] を選択します。

  4. 特定の Amazon Redshift データベースユーザーに制限する IAM ロールを選択します。

  5. [Trust Relationships] タブを選択し、[Edit Trust Relationship] を選択します。ユーザーに代わって Amazon Redshift が他の AWS のサービスにアクセスすることを許可する新しい IAM ロールは、次のような信頼関係を持ちます。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "redshift.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
  6. 指定した値に sts:ExternalId フィールドを制限する信頼関係のセクションの sts:AssumeRole アクションに条件を追加します。ロールへのアクセスを許可する各データベースユーザーの ARN を含めます。

    例えば、次の信頼関係では、us-west-2 リージョンの my-cluster クラスターで user1user2 データベースユーザーのみがこの IAM ロールを使用するアクセス許可を持つよう指定されます。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "redshift.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "sts:ExternalId": [ "arn:aws:redshift:us-west-2:123456789012:dbuser:my-cluster/user1", "arn:aws:redshift:us-west-2:123456789012:dbuser:my-cluster/user2" ] } } }] }
  7. [Update Trust Policy] を選択します。

AWS リージョンへの IAM ロールの制限

特定の AWS リージョンにのみアクセスできるように IAM ロールを制限できます。デフォルトでは、Amazon Redshift の IAM ロールは、1 つのリージョンに限定されません。

IAM ロールの使用をリージョンごとに制限するには、次の手順に従います。

IAM ロールの許可されたリージョンを特定する

  1. IAM コンソール (https://console.aws.amazon.com) を開きます。

  2. ナビゲーションペインで [Roles (ロール) ] を選択します。

  3. 特定のリージョンで変更するロールを選択します。

  4. [Trust Relationships] タブを選択し、[Edit Trust Relationship] を選択します。ユーザーに代わって Amazon Redshift が他の AWS のサービスにアクセスすることを許可する新しい IAM ロールは、次のような信頼関係を持ちます。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "redshift.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
  5. ロールの使用を許可する特定のリージョンのリストで、PrincipalService リストを変更します。Service リストの各リージョンは、次の形式である必要があります。redshift.region.amazonaws.com

    例えば、次の編集された信頼関係では、us-east-1us-west-2 リージョンでのみ IAM ロールの使用が許可されます。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "redshift.us-east-1.amazonaws.com", "redshift.us-west-2.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }
  6. [Update Trust Policy] を選択します

Amazon Redshift で IAM ロールを連鎖する

クラスターにロールをアタッチするとき、クラスターは Amazon S3、Athena および AWS Glue にアクセスできるロールを引き受けることができます。クラスターにアタッチされたロールに必要なリソースへのアクセスがない場合、他のアカウントに属している可能性がある別のロールを連鎖することができます。クラスターは、このデータにアクセスするための連鎖ロールを一時的に引き受けます。また、ロールを連鎖してクロスアカウントアクセスを付与することもできます。連鎖における各ロールは、クラスターが連鎖の末尾のロールを引き受けるまで、連鎖の次のロールを引き受けます。最大で 10 個のロールを連鎖できます。

たとえば、企業 A が企業 B に属する Amazon S3 バケットのデータにアクセスするとします。企業 A は RoleA という名前の Amazon Redshift 用 AWS サービスロールを作成し、クラスターにアタッチします。企業 B は RoleB という名前のロールを作成します。このロールは企業 B のバケットのデータへのアクセスを承認されています。企業 B のバケットのデータにアクセスするには、A が RoleARoleB を連鎖させる iam_role パラメータを使用して COPY コマンドを実行します。COPY オペレーションの継続期間中は、RoleA は一時的に RoleB を引き受け Amazon S3 バケットにアクセスします。

ロールを連鎖するには、ロール間で信頼関係を確立します。別のロール (例: RoleA) を引き受けるロールには、次の連鎖したロール (例: RoleB) を引き受けることを許可するアクセス権限ポリシーがある必要があります。また、アクセス権限を渡すロール (RoleB) は、前に連鎖したロール (RoleA) にアクセス権限を渡すことができる信頼ポリシーを保持している必要があります。詳細については、IAM ユーザーガイドの「IAM ロールの作成」を参照してください。

連鎖の最初のロールは、クラスターにアタッチされたロールである必要があります。最初のロールと、次のロールを引き受ける後続の各ロールには、特定のステートメントを含むポリシーがあることが必要です。このステートメントには、sts:AssumeRole アクションに Allow 効果、そして Resource 要素に次のロールの Amazon リソースネーム (ARN) があります。この例では、RoleA に AWS アカウント 210987654321 が所有する RoleB を引き受けることを許可する次のアクセス権限ポリシーがあります。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1487639602000", "Effect": "Allow", "Action": [ "sts:AssumeRole" ], "Resource": "arn:aws:iam::210987654321:role/RoleB" } ] }

別のロールに渡されるロールは、そのロールを引き受けるロールまたはそのロールを所有する AWS アカウントとの信頼関係を確立する必要があります。この例では、RoleBRoleA との信頼関係を確立する次の信頼ポリシーがあります。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::role/RoleA" } ] }

次の信頼ポリシーは、RoleA の所有者である AWS アカウント 123456789012 との信頼関係を確立します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:root" } ] }

UNLOAD、COPY、または CREATE EXTERNAL SCHEMA コマンドを実行すると、iam_role パラメータにロールの ARN のカンマ区切りのリストを含めることで、ロールを連鎖することができます。以下に iam_role パラメータ内の連鎖されたロールの構文を示します。

unload ('select * from venue limit 10') to 's3://acmedata/redshift/venue_pipe_' IAM_ROLE 'arn:aws:iam::<aws-account-id-1>:role/<role-name-1>[,arn:aws:iam::<aws-account-id-2>:role/<role-name-2>][,...]';

注記

ロールチェーン全体は一重引用符で囲まれ、スペースが含まれてはいけません。

次の例では、RoleA が AWS アカウント 123456789012 に属するクラスターにアタッチされます。RoleB は、アカウント 210987654321 に属しており、s3://companyb/redshift/ という名前のバケットにアクセスするアクセス権限を持っています。次の例では、RoleA および RoleB を連鎖させてデータを s3://companyb/redshift/ バケットに UNLOAD します。

unload ('select * from venue limit 10') to 's3://companyb/redshift/venue_pipe_' iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';

次の例では、COPY コマンドを使用して、前の例でアンロードしたデータをロードします。

copy venue from 's3://companyb/redshift/venue_pipe_' iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';

次の例では、CREATE EXTERNAL SCHEMA は連鎖されたロールを使用してロール RoleB を引き受けます。

create external schema spectrumexample from data catalog database 'exampledb' region 'us-west-2' iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';