

# 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>"
```

------

**참고**  
작업 그룹 또는 클라이언트 측 설정을 업데이트한 후 쓰기 쿼리로 삽입하는 모든 신규 데이터는 CSE-KMS 대신 SSE-KMS 암호화를 사용합니다. 쿼리 결과 암호화 구성이 새로 삽입된 테이블 데이터에도 적용되기 때문입니다. Athena 쿼리 결과, 메타데이터 및 매니페스트 파일도 SSE-KMS로 암호화됩니다.
Athena는 CSE-KMS 암호화 객체와 SSE-S3/SSE-KMS 객체가 혼합된 경우에도 `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 ]

   다음 예제와 같이 테이블에 `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 암호화를 지정합니다.