Amazon Redshift は、2025 年 11 月 1 日以降、新しい Python UDF の作成をサポートしなくなります。Python UDF を使用する場合は、その日付より前に UDF を作成してください。既存の Python UDF は引き続き通常どおり機能します。詳細については、ブログ記事
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 ロール) を参照してください。
注記
チェーンが正しく動作するためには、IAM ロールを指定する必要があります。
たとえば、企業 A が企業 B に属する Amazon S3 バケットのデータにアクセスするとします。その場合、企業 A は RoleA という名前の Amazon Redshift 用の AWS サービスロールを作成し、クラスターにアタッチします。企業 B は RoleB という名前のロールを作成します。このロールは企業 B のバケットのデータへのアクセスを承認されています。企業 B のバケットのデータにアクセスするには、A が iam_role と RoleA を連鎖させる RoleB パラメータを使用して COPY コマンドを実行します。COPY オペレーションの継続期間中は、 RoleA は一時的に RoleB を引き受け Amazon S3 バケットにアクセスします。
ロールを連鎖するには、ロール間で信頼関係を確立します。別のロール (例: RoleA) を引き受けるロールには、次の連鎖したロール (例: RoleB) を引き受けることを許可するアクセス権限ポリシーがある必要があります。また、アクセス権限を渡すロール (RoleB) は、前に連鎖したロール (RoleA) にアクセス権限を渡すことができる信頼ポリシーを保持している必要があります。詳細については、IAM ユーザーガイドの IAM ロールの使用 を参照してください。
連鎖の最初のロールは、クラスターにアタッチアタッチされたロールである必要があります。最初のロールと、次のロールを引き受ける後続の各ロールには、特定のステートメントを含むポリシーがあることが必要です。このステートメントには、 Allow アクションに sts:AssumeRole 効果、そして Resource 要素に次のロールの Amazon リソースネーム (ARN) があります。この例では、 RoleA に AWS アカウント 210987654321 が所有する RoleB を引き受けることを許可する、次のアクセス許可ポリシーがあります。
別のロールに渡されるロールは、そのロールを引き受けるロール、またはそのロールを所有する AWS アカウントとの信頼関係を確立する必要があります。この例では、 RoleB に RoleA との信頼関係を確立する次の信頼ポリシーがあります。
次の信頼ポリシーにより、 RoleA の所有者である AWS アカウント 123456789012 との信頼関係が確立されます。
注記
ロールチェーン認可を特定のユーザーに制限するには、条件を定義します。詳細については、「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/というバケットにアクセスするアクセス許可を持っています。次の例では、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';
次の例では、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';