

 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 對本機資源和 Amazon Redshift Spectrum 外部資料表的存取。
<a name="authorization-fas-spectrum"></a>

在 中使用聯合身分 AWS 搭配 提供的登入資料，`GetDatabaseCredentials`可以簡化對本機資料和外部資料的授權和存取。在本教學課程中，我們會示範如何透過 AWS 聯合身分提供對 資源的存取權，而不是使用特定的 IAM 角色。

目前，為了讓使用者能夠存取 Amazon S3 中的外部資料，您可以使用許可政策中定義的許可來建立 IAM 角色。然後，具有連接角色的使用者可以存取外部資料。這是可行的，但如果您想提供精細的規則，例如讓特定使用者無法使用特定的欄，您可能必須對外部結構描述進行其他設定。

使用 提供的登入資料，聯合身分`GetDatabaseCredentials`可以使用更易於指定 AWS Glue 和變更的精細 IAM 規則來提供對 和 Redshift Spectrum 資源的存取。這可讓您更輕鬆地應用符合業務規則的存取權限。

使用聯合憑證的好處如下：
+ 您無需為 Redshift Spectrum 管理叢集連接的 IAM 角色。
+ 叢集管理員可以建立具有不同 IAM 內容的消費者可存取的外部結構描述。舉例來說，這對於在資料表上執行欄篩選非常有用，其中不同的消費者查詢相同的外部結構描述，並在傳回的記錄中取得不同的欄位。
+ 您可以使用具有 IAM 許可的使用者來查詢 Amazon Redshift，而不是僅使用某個角色。

## 準備身分以使用聯合身分登入
<a name="authorization-fas-spectrum-getting-started-iam"></a>

使用聯合身分登入之前，您必須先執行幾個初步步驟。這些說明假設您有一個現有的 Redshift Spectrum 外部結構描述，該結構描述參考儲存在 Amazon S3 儲存貯體中的資料檔案，且該儲存貯體與您的 Amazon Redshift 叢集或 Amazon Redshift Serverless 資料倉儲位於同一帳戶中。

1. 建立 IAM 身分。這可以是使用者或 IAM 角色。使用 IAM 支援的任何名稱。

1. 將許可政策連接至身分。指定下列任一項：
   + `redshift:GetClusterCredentialsWithIAM` (適用於 Amazon Redshift 佈建的叢集)
   + `redshift-serverless:GetCredentials` (適用於 Amazon Redshift Serverless)

   您可以使用 IAM 主控台透過政策編輯器新增許可。

   IAM 身分還需要許可才能存取外部資料。直接新增下列 AWS 受管政策，以授予 Amazon S3 的存取權：
   + `AmazonS3ReadOnlyAccess`
   + `AWSGlueConsoleFullAccess`

    如果您使用 AWS Glue 準備外部資料，則需要最後一個受管政策。如需授予 Amazon Redshift Spectrum 存取權的步驟相關資訊，請參閱[為 Amazon Redshift 建立 IAM 角色](https://docs.aws.amazon.com/redshift/latest/dg/c-getting-started-using-spectrum-create-role.html)，這是 Amazon Redshift 和 Redshift Spectrum 入門指南的一部分。它顯示了新增 IAM 政策以存取 Redshift Spectrum 的步驟。

1. 設定您的 SQL 用戶端以連接到 Amazon Redshift。使用 Amazon Redshift JDBC 驅動器，並將使用者的憑證新增至工具的憑證屬性。像 SQL Workbench/J 這樣的用戶端非常適合此目的。設定下列用戶端連線延伸屬性：
   + *AccessKeyID* – 您的存取金鑰識別碼。
   + *SecretAccessKey* – 您的私密存取金鑰。(如果不使用加密，請注意傳輸金鑰的安全風險。) 
   + *SessionToken* – IAM 角色的一組暫時憑證。
   + *groupFederation* - 如果您要為已佈建的叢集設定聯合身分，則設定為 `true`。如果您使用的是 Amazon Redshift Serverless，請勿設定此參數。
   + *LogLevel* - 整數日誌層級值。這是選用的。

1. 將 URL 設定為在 Amazon Redshift 或 Amazon Redshift Serverless 主控台中找到的 JDBC 端點。將您的 URL 結構描述替換為 *jdbc:redshift:iam:* 並使用以下格式：
   + Amazon Redshift 佈建叢集的格式：`jdbc:redshift:iam://<cluster_id>.<unique_suffix>.<region>.redshift.amazonaws.com:<port>/<database_name>`

     範例：`jdbc:redshift:iam://test1.12345abcdefg.us-east-1.redshift.amazonaws.com:5439/dev`
   + Amazon Redshift Serverless 的格式：`jdbc:redshift:iam://<workgroup-name>.<account-number>.<aws-region>.redshift-serverless.amazonaws.com:5439:<port>/<database_name>`

     範例：`jdbc:redshift:iam://default.123456789012.us-east-1.redshift-serverless.amazonaws.com:5439/dev`

   在您第一次使用 IAM 身分連線到資料庫之後，Amazon Redshift 會自動建立具有相同名稱的 Amazon Redshift 身分，並為使用者加上 `IAM:` 字首或為 IAM 角色加上 `IAMR:` 字首。本主題中的其餘步驟顯示使用者的範例。

   如果未自動建立 Redshift 使用者，您可以使用管理員帳戶執行 `CREATE USER` 陳述式，並以格式 `IAM:<user name>` 指定使用者名稱來建立一個使用者。

1.  身為 Amazon Redshift 叢集管理員，請授予 Redshift 使用者存取外部結構描述所需的許可。

   ```
   GRANT ALL ON SCHEMA my_schema to "IAM:my_user";
   ```

   若要授予 Redshift 使用者在外部結構描述中建立資料表的能力，他們必須是結構描述擁有者。例如：

   ```
   ALTER SCHEMA my_schema owner to "IAM:my_user";
   ```

1. 若要驗證組態，請在授予許可之後，使用 SQL 用戶端以使用者身分執行查詢。此查詢範例會從外部資料表擷取資料。

   ```
   SELECT * FROM my_schema.my_table;
   ```

## 開始將身分和授權傳播到 Redshift Spectrum
<a name="authorization-fas-spectrum-getting-started"></a>

若要傳遞聯合身分來查詢外部資料表，請將 `SESSION` 設定為 `CREATE EXTERNAL SCHEMA` 的 `IAM_ROLE` 查詢參數值。下列步驟說明如何設定及運用 `SESSION` 來授權對外部結構描述進行查詢。

1. 建立本機資料表和外部資料表。使用 AWS Glue 編目的外部資料表可以用於此目的。

1. 使用您的 IAM 身分連接到 Amazon Redshift。如上一節所述，當身分連接到 Amazon Redshift 時，便會建立一個 Redshift 資料庫使用者。如果先前不存在，則會建立使用者。如果使用者是新使用者，管理員必須授予他們在 Amazon Redshift 中執行任務 (例如查詢和建立資料表) 的許可。

1. 使用您的管理員帳戶連接到 Redshift。執行命令以使用 `SESSION` 值建立外部結構描述。

   ```
   create external schema spectrum_schema from data catalog
   database '<my_external_database>' 
   region '<my_region>'
   iam_role 'SESSION'
   catalog_id '<my_catalog_id>';
   ```

   請注意，在這種情況下會設定 `catalog_id`。這是與功能一起新增的設定，因為 `SESSION` 會取代特定角色。

   在此範例中，查詢中的值模擬真實值的顯示方式。

   ```
   create external schema spectrum_schema from data catalog
   database 'spectrum_db' 
   region 'us-east-1'
   iam_role 'SESSION'
   catalog_id '123456789012'
   ```

   在此情況下`catalog_id`的值是 AWS 您的帳戶 ID。

1. 使用您在步驟 2 中連接的 IAM 身分，執行查詢以存取外部資料。例如：

   ```
   select * from spectrum_schema.table1;
   ```

   在這種情況下，`table1` 可以是 Amazon S3 儲存貯體中檔案中的 JSON 格式資料。

1. 如果您已經擁有使用叢集連接 IAM 角色的外部結構描述 (指向外部資料庫或結構描述)，則可以取代現有結構描述並使用這些步驟中詳述的聯合身分，或建立新的結構描述。

`SESSION` 表示聯合身分憑證用於查詢外部結構描述。當您使用 `SESSION` 查詢參數時，請務必設定 `catalog_id`。這是必要的，因為它指向用於結構描述的資料目錄。先前，`catalog_id` 是從指派給 `iam_role` 的值中擷取。當您以這種方式設定身分識別和授權傳播時，例如，透過使用聯合憑證查詢外部結構描述，就不需要透過 IAM 角色進行授權。

### 使用須知
<a name="authorization-fas-access-usage-notes"></a>

一個常見的連線錯誤如下：*IAM 擷取臨時憑證時發生錯誤：無法使用提供的解組器取消封送異常回應*。此錯誤是具有舊版 JDBC 驅動器的結果。聯合身分所需的最低驅動程式版本為 2.1.0.9。您可以從[下載 Amazon Redshift JDBC 驅動器 2.x 版](https://docs.aws.amazon.com/redshift/latest/mgmt/jdbc20-download-driver.html)取得 JDBC 驅動器。

### 其他資源
<a name="authorization-fas-spectrum-resources"></a>

這些連結提供管理外部資料存取權的其他資訊。
+ 您仍然可以使用 IAM 角色存取 Redshift Spectrum 資料。如需詳細資訊，請參閱[授權 Amazon Redshift 代表您存取 AWS 服務](authorizing-redshift-service.md)。
+ 當您使用 AWS Lake Formation管理對外部資料表的存取權時，您可以使用 Redshift Spectrum 搭配聯合 IAM 身分來查詢。您不再需要為 Redshift Spectrum 管理叢集連接的 IAM 角色，就能查詢向 AWS Lake Formation註冊的資料。如需詳細資訊，請參閱[將 AWS Lake Formation 與 Amazon Redshift Spectrum 搭配使用](https://docs.aws.amazon.com/lake-formation/latest/dg/RSPC-lf.html)。