

# 将 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 ]

   启动将显示表中 `has_encrypted_data` 属性值的 Athena 查询，如以下示例所示。

   ```
   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;
      ```

      代码

      ```
      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;
      ```

      **代码**

      ```
      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 加密。