

# 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 暗号化を指定します。