設定 AWS Glue Data Catalog 的跨帳戶存取權 - Amazon Athena

設定 AWS Glue Data Catalog 的跨帳戶存取權

您可以從您帳戶以外的帳戶,使用 Athena 的跨帳戶 AWS Glue 目錄功能來註冊 AWS Glue 目錄。在您設定 AWS Glue 所需的 IAM 許可,並註冊目錄作為 Athena DataCatalog 資源後,您可以使用 Athena 來執行跨帳戶查詢。如需使用 Athena 主控台以從其他帳戶註冊目錄的相關資訊,請參閱從另一個帳戶註冊 Data Catalog

如需有關在 AWS Glue 中跨帳戶存取的詳細資訊,請參閱《AWS Glue 開發人員指南》中的授予跨帳戶存取權

開始之前

由於此功能會使用現有的 Athena DataCatalog 資源 API 和功能,以啟用跨帳戶存取,因此建議您先閱讀以下資源再開始使用:

考量與限制

目前,Athena 跨帳戶 AWS Glue 目錄存取的限制如下:

  • 僅支援 Athena 引擎版本 2 或更新版本的 AWS 區域 中提供此功能。如需有關 Athena 引擎版本的資訊,請參閱Athena 引擎版本控制。若要升級工作群組的引擎版本,請參閱變更 Athena 引擎版本

  • 在您於帳戶中註冊其他帳戶的 AWS Glue Data Catalog時,可以建立區域 DataCatalog 資源,且該資源僅連結至該特定區域中的其他帳戶資料。

  • 目前不支援包含跨帳戶 AWS Glue 目錄的 CREATE VIEW 陳述式。

  • 使用 AWS 受管金鑰加密的目錄無法跨帳戶查詢。對於要跨帳戶查詢的目錄,請改用客戶受管金鑰 (KMS_CMK)。如需客戶受管金鑰和 AWS 受管金鑰之間的差異的資訊,請參閱《AWS Key Management Service 開發人員指南》中的客戶金鑰和 AWS 金鑰

開始使用

以下情況為「借用者」帳戶 (666666666666) 要執行參照屬於「擁有者」帳戶 (999999999999) 之 AWS Glue 目錄的 SELECT 查詢,如以下範例所示:

SELECT * FROM ownerCatalog.tpch1000.customer

在下列程序中,步驟 1a 和 1b 會同時從借用者和擁有者的立場,說明如何授予借用者帳戶存取擁有者帳戶 AWS Glue 資源的權限。該範例授予對資料庫 tpch1000 和資料表 customer 的存取權。變更這些範例名稱以符合您的需求。

步驟 1a:建立具有擁有者 AWS Glue 資源存取權的借用者角色和政策

若要建立具有擁有者 AWS Glue 資源存取權的借用者帳戶角色和政策,您可以使用 AWS Identity and Access Management (IAM) 主控台或 IAM API。以下為使用 IAM 主控台的程序。

建立借用者角色和政策,以存取擁有者帳戶 AWS Glue 資源
  1. 從借用者帳戶登入位於 https://console.aws.amazon.com/iam/ 的 IAM 主控台。

  2. 在導覽窗格中,展開存取管理,然後選擇政策

  3. 選擇建立政策

  4. 對於政策編輯器,選擇 JSON

  5. 在政策編輯器中,輸入以下政策,然後根據您的需求進行修改:

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "glue:*", "Resource": [ "arn:aws:glue:us-east-1:999999999999:catalog", "arn:aws:glue:us-east-1:999999999999:database/tpch1000", "arn:aws:glue:us-east-1:999999999999:table/tpch1000/customer" ] } ] }
  6. 選擇下一步

  7. 檢閱和建立頁面上,針對政策名稱,輸入該政策的名稱 (例如 CrossGluePolicyForBorrowerRole)。

  8. 選擇建立政策

  9. 在導覽窗格中,選擇 Roles (角色)。

  10. 選擇 Create Role (建立角色)。

  11. 選取可信實體頁面中,選擇 AWS 帳戶,然後選擇下一步

  12. 新增許可頁面上的搜尋方塊中,輸入您建立的政策的名稱 (例如 CrossGluePolicyForBorrowerRole)。

  13. 選取政策名稱旁的核取方塊,然後選擇下一步

  14. Name, review, and create (名稱,檢閱和建立) 頁面上,針對 Role name (角色名稱) 輸入角色的名稱 (例如 CrossGlueBorrowerRole)。

  15. 選擇建立角色

步驟 1b:建立擁有者政策來授予借用者 AWS Glue 存取權

若要從擁有者帳戶 (999999999999) 授予借用者的角色 AWS Glue 存取權,您可以使用 AWS Glue 主控台或 AWS Glue PutResourcePolicy API 操作。以下為使用 AWS Glue 主控台的程序。

若要從擁有者授予借用者帳戶 AWS Glue 存取權
  1. 從擁有者帳戶登入位於 https://console.aws.amazon.com/glue/ 的 AWS Glue 主控台。

  2. 在導覽窗格中,展開資料目錄,然後選擇目錄設定

  3. Permissions (許可) 方塊中,輸入如下所示的政策。針對 rolename,輸入借用者在步驟 1a 中建立的角色 (例如 CrossGlueBorrowerRole)。如果您想要增加許可範圍,可以將萬用字元 * 用於資料庫和資料表資源類型。

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::666666666666:user/username", "arn:aws:iam::666666666666:role/rolename" ] }, "Action": "glue:*", "Resource": [ "arn:aws:glue:us-east-1:999999999999:catalog", "arn:aws:glue:us-east-1:999999999999:database/tpch1000", "arn:aws:glue:us-east-1:999999999999:table/tpch1000/customer" ] } ] }

完成後,我們建議您使用 AWS Glue API,進行一些跨帳戶呼叫測試,以確認已按您的預期設定許可。

步驟 2:借用者註冊屬於擁有者帳户的 AWS Glue Data Catalog

下列程序說明如何使用 Athena 主控台,在擁有者 Amazon Web Services 帳戶中設定 AWS Glue Data Catalog 作為資料來源。如需使用 API 操作 (而不是主控台) 註冊型錄的相關資訊,請參閱(選用) 使用 API 註冊屬於擁有者帳戶的 Athena 資料目錄

註冊屬於另一個帳户的 AWS Glue Data Catalog
  1. 前往 https://console.aws.amazon.com/athena/ 開啟 Athena 主控台。

  2. 如果未顯示主控台的導覽窗格,請選擇左側的展開選單。

    選擇展開選單。
  3. 展開管理,然後選擇資料來源

  4. 在右上角,選擇 Create data source (建立資料來源)。

  5. 選擇資料來源頁面上的資料來源,選取 S3 - AWS Glue Data Catalog,然後選擇下一步

  6. Enter data source details (輸入資料來源詳細資訊) 頁面上的 AWS Glue Data Catalog 區段,針對選擇 AWS Glue Data Catalog,在另一個帳户選擇 AWS Glue Data Catalog

  7. Data source details (資料來源詳細資訊) 輸入以下資訊:

    • Data source name (資料來源名稱) – 輸入您希望在 SQL 查詢中使用的名稱,以參考其他帳戶中的資料目錄。

    • Description (描述) – (選填) 輸入其他帳戶裡資料目錄的描述。

    • Catalog ID (目錄 ID) – 輸入資料目錄所屬帳戶的 12 位數 Amazon Web Services 帳戶 ID。Amazon Web Services 帳戶 ID 即為目錄 ID。

  8. (選用) 展開標籤,然後輸入您希望與資料來源建立關聯的鍵值對。如需標籤的詳細資訊,請參閱標記 Athena 資源

  9. 選擇下一步

  10. Review and create (檢閱並建立) 頁面上,檢閱您提供的資訊,然後選擇 Create data source (建立資料來源)。Data source details (資料來源詳細資訊) 頁面列出了註冊資料型錄的資料庫和標籤。

  11. 選擇資料來源和目錄。您註冊的資料型錄列於 Data Source Name (資料來源名稱) 資料欄。

  12. 若要檢視或編輯資料型錄的相關資訊,請選擇型錄,然後選擇 Actions (動作)、Edit (編輯)。

  13. 若要刪除新資料型錄,請選擇型錄,然後選擇 Actions (動作)、Delete (刪除)。

步驟 3:借用者提交查詢

借用者會提交使用 catalog.database.table 語法來參考目錄的查詢,如下列範例所示:

SELECT * FROM ownerCatalog.tpch1000.customer

除了使用完整語法之外,借用者也可以透過依上下文在 QueryExecutionContext 中傳遞以指定目錄。

(選用) 設定其他 Amazon S3 許可

  • 如果借用者帳戶使用 Athena 查詢,以將新資料寫入擁有者帳戶的資料表,則擁有者不會自動存取 Amazon S3 中的此資料,即使該資料表存在於擁有者帳戶中亦同。這是因為除非進行另外設定,否則借用者即為 Amazon S3 中資訊的物件擁有者。若要授予擁有者對資料的存取權,請將物件的許可設定為其他步驟。

  • 某些跨帳戶 DDL 操作,如 MSCK REPAIR TABLE 會需要 Amazon S3 許可。例如,如果借用者帳戶正在對擁有者帳戶中的資料表執行跨帳戶 MSCK REPAIR 操作,而借用者資料在擁有者帳戶 S3 儲存貯體中,則該儲存貯體必須授予借用者所擔任的角色許可,才能成功查詢。

如需有關授予儲存貯體許可的資訊,請參閱《Amazon Simple Storage Service 使用者指南》中的如何設定 ACL 儲存貯體許可?

(選用) 動態使用目錄

在某些情況下,您可能想要在不進行必要步驟註冊的情況下,對跨帳戶 AWS Glue 目錄快速執行測試。如果已如本文件前述,正確設定所需的 IAM 和 Amazon S3 許可,您便可以動態執行跨帳戶查詢,而無需建立 DataCatalog 資源物件。

若要在未註冊的情況下明確參考目錄,請使用以下範例中的語法:

SELECT * FROM "glue:arn:aws:glue:us-east-1:999999999999:catalog".tpch1000.customer

使用格式「glue:<arn>」,其中 <arn> 為您要使用的 AWS Glue Data Catalog ARN。在範例中,Athena 會使用此語法來動態指向帳戶 999999999999 的 AWS Glue 資料目錄,就好像您已為其單獨建立 DataCatalog 物件。

使用動態目錄的注意事項

使用動態目錄時,請記住以下幾點。

  • 使用動態目錄會需要您通常用於 Athena 資料目錄 API 操作的 IAM 許可。主要差異在於資料目錄資源名稱會遵循 glue:* 命名慣例。

  • 目錄 ARN 必須與正在執行的查詢屬於同一區域。

  • 在 DML 查詢或檢視中使用動態目錄時,請以逸出的雙引號 (\") 括住該目錄。在 DDL 查詢中使用動態目錄時,請使用反引號字元 (`) 括住該目錄。

(選用) 使用 API 註冊屬於擁有者帳戶的 Athena 資料目錄

可以使用 API 操作來註冊屬於擁有者帳户的資料型錄,而不是使用步驟 2 中所述的 Athena 主控台。

Athena DataCatalog 資源的建立者必須具有必要許可,才可執行 Athena CreateDataCatalog API 操作。依您的需求而定,可能會需要存取其他 API 操作。如需詳細資訊,請參閱資料目錄範例政策

以下 CreateDataCatalog 要求主體會註冊跨帳戶存取的 AWS Glue 目錄:

# Example CreateDataCatalog request to register a cross-account Glue catalog: { "Description": "Cross-account Glue catalog", "Name": "ownerCatalog", "Parameters": {"catalog-id" : "999999999999" # Owner's account ID }, "Type": "GLUE" }

以下範本程式碼會使用 Java 用戶端來建立 DataCatalog 物件。

# Sample code to create the DataCatalog through Java client CreateDataCatalogRequest request = new CreateDataCatalogRequest() .withName("ownerCatalog") .withType(DataCatalogType.GLUE) .withParameters(ImmutableMap.of("catalog-id", "999999999999")); athenaClient.createDataCatalog(request);

在這些步驟之後,借用者應會在呼叫 ListDataCatalogs API 操作時看到 ownerCatalog

其他資源