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

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

一部の Amazon Redshift 機能では、ユーザーに代わって Amazon Redshift が他の AWS のサービスにアクセスする必要があります。たとえば、COPYUNLOAD コマンドでは、Amazon S3 バケットを使用してデータを Amazon Redshift クラスターにロードまたはアンロードできます。CREATE EXTERNAL FUNCTION コマンドは、スカラーの Lambda ユーザー定義関数 (UDF) を使用して AWS Lambda 関数を呼び出すことができます。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 FUNCTION、CREATE EXTERNAL SCHEMA オペレーションを承認する」を参照してください。

さらに、スーパーユーザーは、COPY および UNLOAD 操作のロールへのアクセスを提供するために、特定のユーザーおよびグループに AssumEROLE 権限を付与できます。詳細については、 Amazon Redshift データベースデベロッパーガイドから GRANT を参照してください。

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

ユーザーに代わって Amazon Redshift クラスターが他の AWS サービスと通信することを許可する IAM ロールを作成するには、次の手順を実行します。このセクションで使用する値は例であり、必要に応じて値を選択できます。

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

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

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

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

  4. AWS サービスRedshiftの順にクリックします。

  5. ユースケースの選択で、Redshift - カスタマイズ可能次へ : 許可の順に選択します。アクセス権限ポリシーをアタッチする ページが表示されます。

  6. COPY を使用して Amazon S3 にアクセスするには、例として、 AmazonS3ReadOnlyAccess と入力して追加します。COPY または UNLOAD を使用して Amazon S3 にアクセスする場合は、適切なバケットとプレフィックスへのアクセスを制限する管理ポリシーを作成することをお勧めします。読み取り操作と書き込み操作の両方で、最小限の権限を適用し、Amazon Redshift に必要な Amazon S3 バケットとキープレフィックスのみに制限することをお勧めします。

    CREATE EXTERNAL FUNCTION コマンドの Lambda 関数を呼び出すためのアクセスには、 AWSLambdaRoleを追加します。

    Redshift Spectrum の場合は、Amazon S3 アクセスに加えて、 AWSGlueConsoleFullAccess または AmazonAthenaFullAccessを追加します。

    次へ: タグを選択します。

  7. タグの追加 ページが表示されます。必要に応じてタグを追加できます。次へ: レビューを選択します。

  8. ロール名で、 RedshiftCopyUnloadなどのロール名を入力します。[ロールの作成] を選択します。

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

  10. ロールとクラスターを関連付けます。クラスターの作成時に IAM ロールをクラスターに関連付けるか、既存クラスターにロールを追加できます。詳細については、「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. 信頼関係 タブを選択し、 信頼関係の編集を選択します。ユーザーに代わって Amazon Redshift が他の AWS サービスにアクセスすることを許可する新しい IAM ロールには、次のような信頼関係があります。

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

    たとえば、次の信頼関係では、 user1 リージョンの user2 クラスターで my-clusterus-west-2 データベースユーザーのみがこの 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. 信頼ポリシーの更新を選択します。

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

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

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

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

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

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

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

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

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "redshift.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
  5. ロールの使用を許可する特定のリージョンのリストで、 ServicePrincipal リストを変更します。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. 信頼ポリシーの更新を選択

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

クラスターにロールをアタッチすると、クラスターはそのロールを引き受け、ユーザーに代わって Amazon S3、Amazon Athena、 AWS Glue、と AWS Lambda にアクセスできます。クラスターにアタッチされたロールに必要なリソースへのアクセスがない場合、他のアカウントに属している可能性がある別のロールを連鎖することができます。クラスターは、このデータにアクセスするための連鎖ロールを一時的に引き受けます。また、ロールを連鎖してクロスアカウントアクセスを付与することもできます。連鎖における各ロールは、クラスターが連鎖の末尾のロールを引き受けるまで、連鎖の次のロールを引き受けます。関連付けることができる IAM ロールの最大数は、クォータの対象となります。詳細については、「Amazon Redshift オブジェクトのクォータ」のクォータの「Cluster IAM roles for Amazon Redshift to access other AWS services」 (他の サービスにアクセスするための Amazon Redshift のクラスター IAM ロール) を参照してください。

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

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

連鎖の最初のロールは、クラスターにアタッチアタッチされたロールである必要があります。最初のロールと、次のロールを引き受ける後続の各ロールには、特定のステートメントを含むポリシーがあることが必要です。このステートメントには、 Allow アクションに sts:AssumeRole 効果、そして 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", "Action": "sts:AssumeRole", "Principal": { "AWS": "arn:aws:iam::role/RoleA" } } ] }

次の信頼ポリシーにより、 RoleA の所有者である AWS アカウント 123456789012 との信頼関係が確立されます。

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

ロールチェーン認証を特定のユーザーに制限するには、条件を定義します。詳細については、「IAM ロールへのアクセスの制限」を参照してください。

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/というバケットにアクセスするアクセス許可を持っています。次の例では、RoleARoleB を連鎖させてデータを 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';

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

create external function lambda_example(varchar) returns varchar volatile lambda 'exampleLambdaFunction' iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';

詳細については、「IAM ロールを使用して COPY、UNLOAD、CREATE EXTERNAL FUNCTION、CREATE EXTERNAL SCHEMA オペレーションを承認する」も参照してください。