将 CSE-KMS 表格数据转换为 SSE-KMS - Amazon Athena
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

将 CSE-KMS 表格数据转换为 SSE-KMS

如果您的工作流当前使用 CSE-KMS 进行表数据加密,请按照以下步骤过渡到 SSE-KMS。

先决条件

如果您仍在使用 CSE-KMS 工作组或客户端设置写入数据,请按照从 CSE-KMS 迁移到 SSE-KMS中的步骤将其更新为 SSE-KMS。这样可以防止在迁移过程中从任何其他可能写入表的工作流中添加新的 CSE-KMS 加密数据。

数据迁移

  1. 检查表的 has_encrypted_data 属性是否设置为 true。此属性指定该表可能包含 CSE-KMS 加密数据。但需要注意的是,即使表中没有任何实际的 CSE-KMS 加密数据,也可能存在此属性。

    Console
    1. https://console.aws.amazon.com/athena/ 打开 Athena 控制台。

    2. 选择启动查询编辑器

    3. 在编辑器左侧的数据库下,选择要查询的数据库。

    4. 在查询编辑器中,运行以下查询来查看为 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>
  2. 对于表中的每个 CSE-KMS 加密对象。

    1. 使用 S3 加密客户端从 S3 下载该对象并将其解密。以下是一个使用 Amazon 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);
    2. 使用相同的名称和 SSE-KMS 加密将该对象上传到 S3。以下是一个使用 Amazon 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()));

迁移后

成功重新加密表中的所有 CSE-KMS 文件后,请执行以下步骤。

  1. 移除表中的 has_encrypted_data 属性。

    Console
    1. https://console.aws.amazon.com/athena/ 打开 Athena 控制台。

    2. 选择启动查询编辑器

    3. 在编辑器左侧的数据库下,选择要查询的数据库。

    4. 在查询编辑器中,对表运行以下查询。

      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>"
  2. 更新工作流以使用基本 S3 客户端而不是 S3 加密客户端,然后为数据写入指定 SSE-KMS 加密。