

 Amazon Redshift は、パッチ 198 以降、新しい Python UDF の作成をサポートしなくなります。既存の Python UDF は、2026 年 6 月 30 日まで引き続き機能します。詳細については、[ブログ記事](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)を参照してください。

# Amazon Redshift で IAM ロールを連鎖する
<a name="authorizing-redshift-service-chaining-roles"></a>

クラスターにロールをアタッチすると、クラスターはそのロールを引き受け、ユーザーに代わって Amazon S3、Amazon Athena、 AWS Glue、と AWS Lambda にアクセスできます。クラスターにアタッチされたロールに必要なリソースへのアクセスがない場合、他のアカウントに属している可能性がある別のロールを連鎖することができます。クラスターは、このデータにアクセスするための連鎖ロールを一時的に引き受けます。また、ロールを連鎖してクロスアカウントアクセスを付与することもできます。連鎖における各ロールは、クラスターが連鎖の末尾のロールを引き受けるまで、連鎖の次のロールを引き受けます。関連付けることができる IAM ロールの最大数は、クォータの対象となります。詳細については、「[Amazon Redshift オブジェクトのクォータ](amazon-redshift-limits.md#amazon-redshift-limits-quota)」のクォータの「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 ロールの使用](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html) を参照してください。

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

------
#### [ JSON ]

****  

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

------

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

------
#### [ JSON ]

****  

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

------

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

------
#### [ JSON ]

****  

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

------

**注記**  
ロールチェーン認可を特定のユーザーに制限するには、条件を定義します。詳細については、「[IAM ロールへのアクセスの制限](authorizing-redshift-service-database-users.md)」を参照してください。

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';
```