

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

# 從 CSE-KMS 移轉至 SSE-KMS
<a name="migrating-csekms-ssekms"></a>

您可以透過兩種方式來指定 CSE-KMS 加密：在工作群組查詢結果加密組態期間以及用戶端設定中。如需詳細資訊，請參閱[加密 Amazon S3 中存放的 Athena 查詢結果](encrypting-query-results-stored-in-s3.md)。在移轉程序期間，請務必稽核讀取和寫入 CSE-KMS 資料的現有工作流程、識別已設定 CSE-KMS 的工作群組，以及找到透過用戶端參數設定 CSE-KMS 的執行個體。

## 更新工作群組查詢結果加密設定
<a name="migrating-updating-workgroup-query-results-encryption"></a>

------
#### [ Console ]

**在 Athena 主控台中更新加密設定**

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

1. 在 Athena 主控台導覽窗格中，選擇 **Workgroups** (工作群組)。

1. 在 **Workgroups** (工作群組) 頁面上，選取您要編輯的工作群組的按鈕。

1. 選擇 **Actions** (動作)、**Edit** (編輯)。

1. 開啟**查詢結果組態**，然後選擇**加密查詢結果**。

1. 對於**加密類型**區段，選擇 **SSE\$1KMS** 加密選項。

1. 在**選擇不同的 AWS KMS 金鑰 (進階)** 下，輸入您的 KMS 金鑰。

1. 選擇**儲存變更**。更新的工作群組會出現在 **Workgroups** (工作群組) 頁面上的清單。

------
#### [ CLI ]

執行下列命令，將工作群組中的查詢結果加密組態更新為 SSE-KMS。

```
aws athena update-work-group \
    --work-group "my-workgroup" \
    --configuration-updates '{
        "ResultConfigurationUpdates": {
            "EncryptionConfiguration": {
                "EncryptionOption": "SSE_KMS",
                "KmsKey": "<my-kms-key>"
            }
        }
    }'
```

------

## 更新用戶端查詢結果加密設定
<a name="migrating-updating-clientside-query-results-encryption"></a>

------
#### [ Console ]

要將查詢結果加密的用戶端設定從 CSE-KMS 更新為 SSE-KMS，請參閱 [加密 Amazon S3 中存放的 Athena 查詢結果](encrypting-query-results-stored-in-s3.md)。

------
#### [ CLI ]

您只能使用 `start-query-execution` 命令在用戶端設定中指定查詢結果加密組態。如果您執行此 CLI 命令，並使用 CSE-KMS 覆寫您在工作群組中指定的查詢結果加密組態，請變更命令以使用 `SSE_KMS` 加密查詢結果，如下所示。

```
aws athena start-query-execution \
    --query-string "SELECT * FROM <my-table>;" \
    --query-execution-context "Database=<my-database>,Catalog=<my-catalog>" \
    --result-configuration '{
        "EncryptionConfiguration": {
            "EncryptionOption": "SSE_KMS",
            "KmsKey": "<my-kms-key>"
        }
    }' \
    --work-group "<my-workgroup>"
```

------

**注意**  
更新工作群組或用戶端設定後，您透過寫入查詢插入的任何新資料都會使用 SSE-KMS 加密而不是 CSE-KMS。這是因為查詢結果加密組態也適用於新插入的資料表資料。Athena 查詢結果、中繼資料和資訊清單檔案也會使用 SSE-KMS 進行加密。
即使混合使用了 CSE-KMS 加密物件和 SSE-S3/SSE-KMS 物件，Athena 仍然可以讀取具有 `has_encrypted_data` 資料表屬性的資料表。

# 將 CSE-KMS 資料表資料轉換為 SSE-KMS
<a name="convert-csekms-table-ssekms"></a>

如果您的工作流程目前使用 CSE-KMS 來進行資料表資料加密，則請依照下列步驟轉換至 SSE-KMS。

## 先決條件
<a name="convert-csekms-table-ssekms-preq"></a>

如果您仍然使用 CSE-KMS 工作群組或用戶端設定寫入資料，則請遵循 [從 CSE-KMS 移轉至 SSE-KMS](migrating-csekms-ssekms.md) 中的步驟，將其更新為 SSE-KMS。這可避免在移轉程序期間從可能寫入資料表的任何其他工作流程中新增新的 CSE-KMS 加密資料。

## 資料遷移
<a name="convert-csekms-table-ssekms-migrat"></a>

1. 檢查資料表是否已將 `has_encrypted_data` 屬性設定為 `true`。此屬性會指定該資料表可能包含 CSE-KMS 加密資料。不過，請務必注意，即使資料表上沒有任何實際 CSE-KMS 加密資料，也可能存在此屬性。

------
#### [ Console ]

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

   1. 選擇**啟動查詢編輯器**。

   1. 在編輯器左側的**資料庫**下，選擇您要查詢的資料庫。

   1. 在查詢編輯器中，執行下列查詢以查看 `has_encrypted_data table` 屬性所設定的值。

      ```
      SHOW TBLPROPERTIES <table_name>('has_encrypted_data');
      ```

------
#### [ CLI ]

   啟動 Athena 查詢，其中會顯示資料表上 `has_encrypted_data` 屬性的值，如下列範例所示。

   ```
   aws athena start-query-execution \
       --query-string "SHOW TBLPROPERTIES <table-name>('has_encrypted_data');" \
       --work-group "<my-workgroup>"
   ```

   擷取查詢結果，以檢查資料表的 `has_encrypted_data` 資料表屬性的值，如下列範例所示。

   ```
   aws athena get-query-results --query-execution-id <query-execution-id-from-previous-step>
   ```

------

1. 適用於資料表中的每個 CSE-KMS 加密物件。

   1. 使用 S3 加密用戶端從 S3 下載物件並將其解密。以下是 AWS Java SDK V2 的範例。

      **匯入**

      ```
      import software.amazon.awssdk.core.ResponseInputStream;
      import software.amazon.awssdk.services.s3.model.GetObjectRequest;
      import software.amazon.awssdk.services.s3.model.GetObjectResponse;
      import software.amazon.encryption.s3.S3EncryptionClient;
      import software.amazon.encryption.s3.materials.Keyring;
      import software.amazon.encryption.s3.materials.KmsDiscoveryKeyring;
      ```

      Code

      ```
      final Keyring kmsDiscoveryKeyRing = KmsDiscoveryKeyring.builder()
              .enableLegacyWrappingAlgorithms(true)
              .build();
      final S3EncryptionClient s3EncryptionClient = S3EncryptionClient.builder()
              .enableLegacyUnauthenticatedModes(true)
              .keyring(kmsDiscoveryKeyRing)
              .build();
      
      GetObjectRequest getObjectRequest = GetObjectRequest.builder()
              .bucket("amzn-s3-demo-bucket")
              .key("<my-key>")
              .build();
      
      ResponseInputStream<GetObjectResponse> s3Object = s3EncryptionClient.getObject(getObjectRequest);
      ```

   1. 以相同的名稱和 SSE-KMS 加密的方式，將物件上傳至 S3。以下是 AWS Java SDK V2 的範例。

      **匯入**

      ```
      import software.amazon.awssdk.core.ResponseInputStream;
      import software.amazon.awssdk.core.sync.RequestBody;
      import software.amazon.awssdk.services.s3.S3Client;
      import software.amazon.awssdk.services.s3.model.PutObjectRequest;
      import software.amazon.awssdk.services.s3.model.ServerSideEncryption;
      ```

      **Code**

      ```
      final S3Client s3Client = S3Client.builder()
              .build();
                  
      PutObjectRequest putObjectRequest = PutObjectRequest.builder()
              .bucket("amzn-s3-demo-bucket")
              .key("<my-key>")
              .serverSideEncryption(ServerSideEncryption.AWS_KMS)
              .ssekmsKeyId("<my-kms-key>")
              .build();
      
      s3Client.putObject(putObjectRequest, RequestBody.fromBytes(s3Object.readAllBytes()));
      ```

## 移轉後
<a name="convert-csekms-table-ssekms-post-migrat"></a>

成功重新加密資料表中的所有 CSE-KMS 檔案後，請執行下列步驟。

1. 從資料表中移除 `has_encrypted_data` 屬性。

------
#### [ Console ]

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

   1. 選擇**啟動查詢編輯器**。

   1. 在編輯器左側的**資料庫**下，選擇您要查詢的資料庫。

   1. 在查詢編輯器中，為您的資料表執行下列查詢。

      ```
      ALTER TABLE <database-name>.<table-name> UNSET TBLPROPERTIES ('has_encrypted_data')
      ```

------
#### [ CLI ]

   執行下列命令，從資料表移除 `has_encrypted_data` 屬性。

   ```
   aws athena start-query-execution \
       --query-string "ALTER TABLE <database-name>.<table-name> UNSET TBLPROPERTIES ('has_encrypted_data');" \
       --work-group "<my-workgroup>"
   ```

------

1. 更新工作流程以使用基本 S3 用戶端而非 S3 加密用戶端，然後為資料寫入指定 SSE-KMS 加密。