

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 設定 AWS Glue 資料目錄的跨帳戶存取
<a name="security-iam-cross-account-glue-catalog-access"></a>

您可以使用 Athena 的跨帳戶 AWS Glue 目錄功能，從非您自己的帳戶註冊 AWS Glue 目錄。在您設定 AWS Glue 所需的 IAM 許可，並註冊目錄作為 Athena [DataCatalog](https://docs.aws.amazon.com/athena/latest/APIReference/API_DataCatalog.html) 資源後，您可以使用 Athena 來執行跨帳戶查詢。如需使用 Athena 主控台以從其他帳戶註冊目錄的相關資訊，請參閱[從另一個帳戶註冊 Data Catalog](data-sources-glue-cross-account.md)。

如需 中跨帳戶存取的詳細資訊 AWS Glue，請參閱《 *AWS Glue 開發人員指南*》中的[授予跨帳戶存取](https://docs.aws.amazon.com/glue/latest/dg/cross-account-access.html)。

## 開始之前
<a name="security-iam-cross-account-glue-catalog-access-before-you-start"></a>

由於此功能會使用現有的 Athena `DataCatalog` 資源 API 和功能，以啟用跨帳戶存取，因此建議您先閱讀以下資源再開始使用：
+ [連線至資料來源](work-with-data-stores.md) - 包含搭配、 AWS Glue Hive 或 Lambda 資料目錄來源使用 Athena 的主題。
+ [資料目錄範例政策](datacatalogs-example-policies.md) - 說明如何撰寫控制資料目錄存取的政策。
+ [AWS CLI 搭配 Hive 中繼存放區使用](datastores-hive-cli.md) - 示範如何 AWS CLI 搭配 Hive 中繼存放區使用 ，但包含適用於其他資料來源的使用案例。

## 考量和限制
<a name="security-iam-cross-account-glue-catalog-access-considerations-and-limitations"></a>

目前，Athena 跨帳戶 AWS Glue 目錄存取有下列限制：
+ 此功能僅適用於支援 Athena 引擎版本 2 或更新版本 AWS 區域 的 。如需有關 Athena 引擎版本的資訊，請參閱[Athena 引擎版本控制](engine-versions.md)。若要升級工作群組的引擎版本，請參閱[變更 Athena 引擎版本](engine-versions-changing.md)。
+ 當您 AWS Glue Data Catalog 在帳戶中註冊另一個帳戶的 時，您建立的區域`DataCatalog`資源只會連結到該特定區域中另一個帳戶的資料。
+ 目前不支援包含跨帳戶 AWS Glue 目錄的 `CREATE VIEW` 陳述式。
+ 使用 AWS 受管金鑰加密的目錄無法跨帳戶查詢。對於要跨帳戶查詢的目錄，請改用客戶自管金鑰 (`KMS_CMK`)。如需客戶受管金鑰與 AWS 受管金鑰之間的差異資訊，請參閱《 *AWS Key Management Service 開發人員指南*》中的[客戶金鑰和 AWS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-mgmt                     )。

## 開始使用
<a name="security-iam-cross-account-glue-catalog-getting-started"></a>

在下列案例中，「借用者」帳戶 (666666666666) 想要執行`SELECT`查詢，其參照屬於「擁有者」帳戶 (999999999999) 的 AWS Glue 目錄，如下列範例所示：

```
SELECT * FROM ownerCatalog.tpch1000.customer
```

在下列程序中，步驟 1a 和 1b 顯示如何讓借用者帳戶從借用者和擁有者端存取擁有者帳戶 AWS Glue 的資源。該範例授予對資料庫 `tpch1000` 和資料表 `customer` 的存取權。變更這些範例名稱以符合您的需求。

### 步驟 1a：建立具有政策的借用者角色，以存取擁有者 AWS Glue 的資源
<a name="security-iam-cross-account-glue-catalog-access-step-1a"></a>

若要使用存取擁有者帳戶 AWS Glue 資源的政策建立借用者帳戶角色，您可以使用 AWS Identity and Access Management (IAM) 主控台或 [IAM API](https://docs.aws.amazon.com/IAM/latest/APIReference/API_Operations.html)。以下為使用 IAM 主控台的程序。

**建立借用者角色和政策以存取擁有者帳戶 AWS Glue 的資源**

1. 從借用者帳戶登入位於 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 在導覽窗格中，展開**存取管理**，然後選擇**政策**。

1. 選擇**建立政策**。

1. 對於**政策編輯器**，選擇 **JSON**。

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

------
#### [ 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}}"
               ]
           }
       ]
   }
   ```

------

1. 選擇**下一步**。

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

1. 選擇**建立政策**。

1. 在導覽窗格中，選擇 **Roles** (角色)。

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

1. 在**選取可信實體**頁面中，選擇 **AWS 帳戶**，然後選擇**下一步**。

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

1. 選取政策名稱旁的核取方塊，然後選擇**下一步**。

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

1. 選擇建**立角色**。

### 步驟 1b：建立擁有者政策，將 AWS Glue 存取權授予借用者
<a name="security-iam-cross-account-glue-catalog-access-step-1b"></a>

若要將來自擁有者帳戶 (999999999999) 的 AWS Glue 存取權授予借款人的角色，您可以使用 AWS Glue 主控台或 AWS Glue [PutResourcePolicy](https://docs.aws.amazon.com/glue/latest/webapi/API_PutResourcePolicy.html) API 操作。下列程序使用 AWS Glue 主控台。

**從擁有者授予對借用者帳戶的 AWS Glue 存取權**

1. 從擁有者帳戶登入 AWS Glue 主控台，網址為 https：//[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)。

1. 在導覽窗格中，展開**資料目錄**，然後選擇**目錄設定**。

1. 在 **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](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api.html)，進行一些跨帳戶呼叫測試，以確認已按您的預期設定許可。

### 步驟 2：借用者註冊 AWS Glue Data Catalog 屬於擁有者帳戶的
<a name="security-iam-cross-account-glue-catalog-access-step-2"></a>

下列程序說明如何使用 Athena 主控台，在擁有者 Amazon Web Services 帳戶中設定 AWS Glue Data Catalog 作為資料來源。如需使用 API 操作 (而不是主控台) 註冊型錄的相關資訊，請參閱[(選用) 使用 API 註冊屬於擁有者帳戶的 Athena 資料目錄](#security-iam-cross-account-glue-catalog-access-step-2-api)。

**註冊 AWS Glue Data Catalog 屬於另一個帳戶的**

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Athena 主控台。

1. 如果未顯示主控台的導覽窗格，請選擇左側的展開選單。  
![選擇展開選單。](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/nav-pane-expansion.png)

1. 展開**管理**，然後選擇**資料來源**。

1. 在右上角，選擇 **Create data source** (建立資料來源)。

1. 在**選擇資料來源**頁面上，針對**資料來源**，選取 **S3 - AWS Glue Data Catalog**，然後選擇**下一步**。

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

1. 在 **Data source details** (資料來源詳細資訊) 輸入以下資訊：
   + **Data source name** (資料來源名稱) – 輸入您希望在 SQL 查詢中使用的名稱，以參考其他帳戶中的資料目錄。
   + **Description** (描述) – (選填) 輸入其他帳戶裡資料目錄的描述。
   + **Catalog ID** (目錄 ID) – 輸入資料目錄所屬帳戶的 12 位數 Amazon Web Services 帳戶 ID。Amazon Web Services 帳戶 ID 即為目錄 ID。

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

1. 選擇**下一步**。

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

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

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

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

### 步驟 3：借用者提交查詢
<a name="security-iam-cross-account-glue-catalog-access-step-4"></a>

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

```
SELECT * FROM ownerCatalog.tpch1000.customer
```

除了使用完整語法之外，借用者也可以透過依上下文在 [QueryExecutionContext](https://docs.aws.amazon.com/athena/latest/APIReference/API_QueryExecutionContext.html) 中傳遞以指定目錄。

## (選用) 設定其他 Amazon S3 許可
<a name="security-iam-cross-account-glue-catalog-access-additional-s3-permissions"></a>
+ 如果借用者帳戶使用 Athena 查詢，以將新資料寫入擁有者帳戶的資料表，則擁有者不會自動存取 Amazon S3 中的此資料，即使該資料表存在於擁有者帳戶中亦同。這是因為除非進行另外設定，否則借用者即為 Amazon S3 中資訊的物件擁有者。若要授予擁有者對資料的存取權，請將物件的許可設定為其他步驟。
+ 某些跨帳戶 DDL 操作，如 [MSCK REPAIR TABLE](msck-repair-table.md) 會需要 Amazon S3 許可。例如，如果借用者帳戶正在對擁有者帳戶中的資料表執行跨帳戶 `MSCK REPAIR` 操作，而借用者資料在擁有者帳戶 S3 儲存貯體中，則該儲存貯體必須授予借用者所擔任的角色許可，才能成功查詢。

如需有關授予儲存貯體許可的資訊，請參閱*《Amazon Simple Storage Service 使用者指南》*中的[如何設定 ACL 儲存貯體許可？](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/set-bucket-permissions.html)。

## (選用) 動態使用目錄
<a name="security-iam-cross-account-glue-catalog-access-dynamic-catalogs"></a>

在某些情況下，您可能想要在不進行必要步驟註冊的情況下，對跨帳戶 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](https://docs.aws.amazon.com/glue/latest/dg/glue-specifying-resource-arns.html#data-catalog-resource-arns)。在此範例中，Athena 使用此語法動態指向帳戶 999999999999 AWS Glue 的資料目錄，就好像您已另外為其建立`DataCatalog`物件一樣。

### 使用動態目錄的注意事項
<a name="security-iam-cross-account-glue-catalog-access-notes-dynamic-catalogs"></a>

使用動態目錄時，請記住以下幾點。
+ 使用動態目錄會需要您通常用於 Athena 資料目錄 API 操作的 IAM 許可。主要差異在於資料目錄資源名稱會遵循 `glue:*` 命名慣例。
+ 目錄 ARN 必須與正在執行的查詢屬於同一區域。
+ 在 DML 查詢或檢視中使用動態目錄時，請以逸出的雙引號 (`\"`) 括住該目錄。在 DDL 查詢中使用動態目錄時，請使用反引號字元 (```) 括住該目錄。

## (選用) 使用 API 註冊屬於擁有者帳戶的 Athena 資料目錄
<a name="security-iam-cross-account-glue-catalog-access-step-2-api"></a>

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

Athena [DataCatalog](https://docs.aws.amazon.com/athena/latest/APIReference/API_DataCatalog.html) 資源的建立者必須具有必要許可，才可執行 Athena [CreateDataCatalog](https://docs.aws.amazon.com/athena/latest/APIReference/API_CreateDataCatalog.html) API 操作。依您的需求而定，可能會需要存取其他 API 操作。如需詳細資訊，請參閱[資料目錄範例政策](datacatalogs-example-policies.md)。

下列`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](https://docs.aws.amazon.com/athena/latest/APIReference/API_ListDataCatalogs.html) API 操作時看到 `ownerCatalog`。

## 其他資源
<a name="security-iam-cross-account-glue-catalog-access-additional-resources"></a>
+ [從另一個帳戶註冊 Data Catalog](data-sources-glue-cross-account.md)
+ 《 *AWS 規範指引模式*指南》中的[AWS Glue Data Catalog 使用 Amazon Athena 設定共用 的跨帳戶存取權](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/configure-cross-account-access-to-a-shared-aws-glue-data-catalog-using-amazon-athena.html)。
+ *AWS 大數據部落格*中的[使用 Amazon Athena AWS Glue Data Catalog查詢跨帳戶](https://aws.amazon.com/blogs/big-data/query-cross-account-aws-glue-data-catalogs-using-amazon-athena/) 
+ 《*AWS Glue 開發人員指南*》中的[授予跨帳戶存取權](https://docs.aws.amazon.com/glue/latest/dg/cross-account-access.html) 