View a markdown version of this page

CSE-KMS 테이블 데이터를 SSE-KMS로 변환 - Amazon Athena

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에서 객체를 다운로드하고 복호화합니다. 다음은 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);
    2. 동일한 이름과 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()));

마이그레이션 후

테이블의 모든 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 암호화를 지정합니다.