

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

# 根據 Amazon S3 中加密的資料集建立資料表
<a name="creating-tables-based-on-encrypted-datasets-in-s3"></a>

Athena 可以讀取和寫入基礎資料集為 SSE-S3、SSE-KMS 或 CSE-KMS 加密的資料表。根據用於資料表資料的加密選項和執行的查詢類型，您可能需要指定一些額外的資料表屬性，才能讀取和寫入加密的資料。

## 讀取 SSE-S3/SSE-KMS 加密資料表
<a name="reading-sse-s3-sse-kms-encrypted-tables"></a>

建立資料表時不需要指定其他資料表屬性，即可讀取 SSE-S3/SSE-KMS 加密資料集。Amazon S3 會自動處理 SSE 物件的解密。

## 讀取 CSE-KMS 加密資料表
<a name="reading-cse-kms-encrypted-tables"></a>

可以指定兩組不同的資料表屬性，以便 Athena 讀取 CSE-KMS 加密資料集。
+ 使用 `encryption_option`和 `kms_key` 資料表屬性 （建議）
+ 使用`has_encrypted_data`資料表屬性

**重要**  
如果您使用 Amazon EMR 搭配 EMRFS 上傳 CSE-KMS 加密 Parquet 檔案，您必須將 `fs.s3n.multipart.uploads.enabled`設定為 來停用分段上傳`false`。如果您不執行此操作，則 Athena 無法判斷 Parquet 檔案長度，並且會發生 **HIVE\$1CANNOT\$1OPEN\$1SPLIT** 錯誤。如需詳細資訊，請參閱《Amazon EMR 管理指南》**中的[設定適用於 Amazon S3 的分段上傳](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-upload-s3.html#Config_Multipart)。

### 使用 encryption\$1option 和 kms\$1key 資料表屬性
<a name="using-encryption-option-and-kms-key-table-properties"></a>

在 [CREATE TABLE](create-table.md) 陳述式中，使用指定 `encryption_option='CSE_KMS'`和 的`TBLPROPERTIES`子句`kms_key='aws_kms_key_arn'`，如下列範例所示。

```
CREATE EXTERNAL TABLE 'my_encrypted_data' (
   `n_nationkey` int,
   `n_name` string,
   `n_regionkey` int,
   `n_comment` string)
ROW FORMAT SERDE
   'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
   'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
LOCATION
   's3://amzn-s3-demo-bucket/folder_with_my_encrypted_data/'
TBLPROPERTIES (
    'encryption_option' = 'CSE_KMS',
    'kms_key' = 'arn:aws:kms:us-east-1:012345678901:key/my_kms_key')
```

設定這些屬性時，
+ Athena 可以讀取 V1, V2 或 V3 Amazon S3 加密用戶端建立的 CSE-KMS 加密物件。
+ Athena 將使用 中的 AWS KMS 金鑰`kms_key`來解密 CSE-KMS 資料。如果任何物件使用不同的 AWS KMS 金鑰加密，查詢將會失敗。
+ Athena 仍然可以讀取 SSE-S3 和 SSE-KMS 加密物件，但不建議混合伺服器端和用戶端加密物件。

### 使用 has\$1encrypted\$1data 資料表屬性
<a name="using-has-encrypted-data-table-property"></a>

在 [CREATE TABLE](create-table.md) 陳述式中，請使用指定 `has_encrypted_data='true'` 的 `TBLPROPERTIES` 子句，如以下範例所示。

```
CREATE EXTERNAL TABLE 'my_encrypted_data' (
   `n_nationkey` int,
   `n_name` string,
   `n_regionkey` int,
   `n_comment` string)
ROW FORMAT SERDE
   'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
   'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
LOCATION
   's3://amzn-s3-demo-bucket/folder_with_my_encrypted_data/'
TBLPROPERTIES (
    'has_encrypted_data' = 'true')
```

指定 has\$1encrypted\$1data 資料表屬性時，
+ Athena 只能讀取 V1 Amazon S3 加密用戶端建立的 CSE-KMS 加密物件。
+ Athena 會推斷用於從物件中繼資料加密 CSE-KMS 物件的 AWS KMS 金鑰，然後使用該金鑰解密物件。
+ Athena 仍然可以讀取 SSE-S3 和 SSE-KMS 加密物件，但不建議混合伺服器端和用戶端加密物件。

**注意**  
當 `kms_key` `encryption_option`和 與 一起指定時`has_encrypted_data`， `encryption_option`和 `kms_key`資料表屬性會優先，且`has_encrypted_data`會被忽略。

當您使用 Athena 主控台使用[表單建立資料表](data-sources-glue-manual-table.md)並指定資料表位置時，請選取**加密的資料集**選項，將 `has_encrypted_data='true'` 屬性新增至資料表。

![\[在新增資料表表格中選取 Encrypted data set (加密的資料集)\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/add-table-form-encrypted-option.png)


在 Athena 主控台的資料表清單中，具有 的 CSE-KMS 加密資料表`has_encrypted_data='true'`會顯示金鑰形狀圖示。

![\[已加密資料表圖示\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/tables-list-encrypted-table-icon.png)


## 寫入 SSE-S3/SSE-KMS/CSE-KMS 加密資料
<a name="writing-sse-s3-sse-kms-cse-kms-encrypted-data"></a>

根據預設，新插入的資料檔案將使用 Athena 工作群組中指定的查詢結果的加密組態進行加密。為了使用與查詢結果的加密組態不同的加密組態來寫入資料表資料，您必須新增一些額外的資料表屬性。

在 [CREATE TABLE](create-table.md) 陳述式中，使用指定 `encryption_option='SSE_S3 | SSE_KMS | CSE_KMS'`和 的`TBLPROPERTIES`子句`kms_key='aws_kms_key_arn'`，如下列範例所示。

```
CREATE EXTERNAL TABLE 'my_encrypted_data' (
   `n_nationkey` int,
   `n_name` string,
   `n_regionkey` int,
   `n_comment` string)
ROW FORMAT SERDE
   'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
   'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
LOCATION
   's3://amzn-s3-demo-bucket/folder_with_my_encrypted_data/'
TBLPROPERTIES (
    'encryption_option' = 'SSE_KMS',
    'kms_key' = 'arn:aws:kms:us-east-1:012345678901:key/my_kms_key')
```

所有新插入的資料都會使用資料表屬性指定的加密組態來加密，而不是使用工作群組中查詢的加密組態。

## 考量事項與限制
<a name="considerations-and-limitations"></a>

寫入和讀取加密的資料集時，請考慮下列事項。
+ `has_encrypted_data`、 `encryption_option`和 `kms_key`資料表屬性只能與 Hive 資料表搭配使用。
+ 使用 CSE-KMS 加密資料建立資料表時，建議您確保所有資料都使用相同的 AWS KMS 金鑰加密。
+ 使用 CSE-KMS 加密資料建立資料表時，建議您確保所有資料都經過 CSE-KMS 加密，而且不會混合non-CSE-KMS 和 CSE-KMS 加密物件。