

 Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 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>

當您將角色連接到叢集時，您的叢集可以擔任該角色來 AWS Lambda 代表您存取 Amazon S3 AWS Glue、Amazon Athena 和 。如果連接至叢集的角色無法存取必要資源，您可鏈結其他角色，該角色甚至可以來自其他帳戶。您的叢集接著會暫時擔任鏈結的角色，以存取資料。您也可以用鏈結角色的方式來授予跨帳戶存取。鏈結中的每個角色都會擔任鏈結中的下一個角色，直到叢集擔任鏈結尾端的角色為止。您可建立關聯的 IAM 角色數量上限需符合配額。如需詳細資訊，請參閱 中的配額「Amazon Redshift 存取其他服務的叢集 IAM 角色 AWS 」[Amazon Redshift 物件的配額](amazon-redshift-limits.md#amazon-redshift-limits-quota)。

**注意**  
您必須指定 IAM 角色，鏈結才能正常運作。

例如，假設 A 公司想要存取屬於 B 公司的 Amazon S3 儲存貯體中的資料。A 公司為名為 的 Amazon Redshift 建立 AWS 服務角色，`RoleA`並將其連接到其叢集。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 ` 元素中下一個角色的 Amazon Resource Name (ARN) 有 `Resource` 的效果。在我們的範例中，`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 FUNCTION 或 CREATE EXTERNAL SCHEMA 命令時，您應將逗號分隔的角色 ARN 清單加入到 `iam_role` 參數內，以鏈結角色。以下顯示 `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`，將資料 UNLOAD (卸載) 到 s3://companyb/redshift/ 儲存貯體。

```
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 FUNCTION 使用鏈結的角色來擔任 `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';
```