

# Amazon S3의 암호화된 데이터세트에 기반한 테이블 생성
<a name="creating-tables-based-on-encrypted-datasets-in-s3"></a>

Athena는 기본 데이터세트가 SSE-S3, SSE-KMS 또는 CSE-KMS로 암호화된 테이블을 읽고 쓸 수 있습니다. 테이블 데이터에 사용되는 암호화 옵션 및 실행된 쿼리 유형에 따라 암호화된 데이터를 읽고 쓰려면 몇 가지 추가 테이블 속성을 지정해야 할 수 있습니다.

## SSE-S3/SSE-KMS로 암호화된 테이블 읽기
<a name="reading-sse-s3-sse-kms-encrypted-tables"></a>

SSE-S3/SSE-KMS로 암호화된 데이터세트를 읽기 위해 테이블 생성 시 추가 테이블 속성을 지정할 필요가 없습니다. Amazon S3는 SSE 객체 복호화를 자동으로 처리합니다.

## CSE-KMS로 암호화된 테이블 읽기
<a name="reading-cse-kms-encrypted-tables"></a>

Athena가 CSE-KMS로 암호화된 데이터세트를 읽기 위해 지정할 수 있는 두 가지 테이블 속성 세트가 있습니다.
+ `encryption_option` 및 `kms_key` 테이블 속성 사용(권장)
+ `has_encrypted_data` 테이블 속성 사용

**중요**  
Amazon EMR을 EMRFS와 함께 사용해 CSE-KMS로 암호화된 Parquet 파일을 업로드하는 경우 `fs.s3n.multipart.uploads.enabled`를 `false`로 설정해 멀티파트 업로드를 비활성화해야 합니다. 이 작업을 하지 않으면, Athena는 Parquet 파일 길이를 확인하지 못하며 **HIVE\_CANNOT\_OPEN\_SPLIT** 오류가 발생합니다. 자세한 내용은 *Amazon EMR 관리 안내서*의 [Amazon S3에 대한 멀티파트 업로드 구성](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-upload-s3.html#Config_Multipart)을 참조하세요.

### encryption\_option 및 kms\_key 테이블 속성 사용
<a name="using-encryption-option-and-kms-key-table-properties"></a>

다음 예제처럼 [CREATE TABLE](create-table.md) 문에서 `encryption_option='CSE_KMS'` 및 `kms_key='aws_kms_key_arn'`을 지정하는 `TBLPROPERTIES` 절을 사용합니다.

```
CREATE EXTERNAL TABLE 'my_encrypted_data' (
   `n_nationkey` int,
   `n_name` string,
   `n_regionkey` int,
   `n_comment` string)
ROW FORMAT SERDE
   'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
   'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
LOCATION
   's3://amzn-s3-demo-bucket/{{folder_with_my_encrypted_data}}/'
TBLPROPERTIES (
    'encryption_option' = 'CSE_KMS',
    'kms_key' = 'arn:aws:kms:us-east-1:012345678901:key/my_kms_key')
```

이러한 속성이 구성되는 경우
+ Athena는 V1, V2 또는 V3 Amazon S3 암호화 클라이언트에서 생성된 CSE-KMS로 암호화된 객체를 읽을 수 있습니다.
+ Athena는 `kms_key`의 AWS KMS 키를 사용하여 CSE-KMS 데이터를 복호화합니다. 객체가 다른 AWS KMS 키로 암호화된 경우 쿼리에 실패합니다.
+ 서버 측 객체와 클라이언트 측의 암호화된 객체를 혼합하는 방식은 권장되지 않지만 Athena는 여전히 SSE-S3 및 SSE-KMS로 암호화된 객체를 읽을 수 있습니다.

### has\_encrypted\_data 테이블 속성 사용
<a name="using-has-encrypted-data-table-property"></a>

다음 예제처럼 [CREATE TABLE](create-table.md) 문에서 `has_encrypted_data='true'`를 지정하는 `TBLPROPERTIES` 절을 사용합니다.

```
CREATE EXTERNAL TABLE 'my_encrypted_data' (
   `n_nationkey` int,
   `n_name` string,
   `n_regionkey` int,
   `n_comment` string)
ROW FORMAT SERDE
   'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
   'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
LOCATION
   's3://amzn-s3-demo-bucket/{{folder_with_my_encrypted_data}}/'
TBLPROPERTIES (
    'has_encrypted_data' = 'true')
```

has\_encrypted\_data 테이블 속성이 지정되는 경우
+ Athena는 V1 Amazon S3 암호화 클라이언트에서 생성된 CSE-KMS로 암호화된 객체만 읽을 수 있습니다.
+ Athena는 객체 메타데이터에서 CSE-KMS 객체를 암호화하는 데 사용되는 AWS KMS 키를 추론한 다음, 해당 키를 사용하여 객체를 복호화합니다.
+ 서버 측 객체와 클라이언트 측의 암호화된 객체를 혼합하는 방식은 권장되지 않지만 Athena는 여전히 SSE-S3 및 SSE-KMS로 암호화된 객체를 읽을 수 있습니다.

**참고**  
`encryption_option` 및 `kms_key`가 `has_encrypted_data`와 함께 지정되면 `encryption_option` 및 `kms_key` 테이블 속성이 우선하고 `has_encrypted_data`는 무시됩니다.

Athena 콘솔에서 [양식을 사용하여 테이블을 생성](data-sources-glue-manual-table.md)하고 테이블 위치를 지정할 때 **암호화된 데이터세트** 옵션을 선택하고 `has_encrypted_data='true'` 속성을 테이블에 추가합니다.

![테이블 추가 양식에서 암호화된 데이터 세트(Encrypted data set)을 선택합니다.](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/add-table-form-encrypted-option.png)


Athena 콘솔 테이블 목록에서 `has_encrypted_data='true'`를 사용하여 CSE-KMS로 암호화된 테이블은 열쇠 모양 아이콘을 표시합니다.

![암호화 테이블 아이콘](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/tables-list-encrypted-table-icon.png)


## SSE-S3/SSE-KMS/CSE-KMS 암호화 데이터 쓰기
<a name="writing-sse-s3-sse-kms-cse-kms-encrypted-data"></a>

기본적으로 새로 삽입된 데이터 파일은 Athena 작업 그룹에 지정된 쿼리 결과의 암호화 구성을 사용하여 암호화됩니다. 쿼리 결과의 암호화 구성과 다른 암호화 구성으로 테이블 데이터를 쓰려면 몇 가지 테이블 속성을 더 추가해야 합니다.

다음 예제처럼 [CREATE TABLE](create-table.md) 문에서 `encryption_option='SSE_S3 | SSE_KMS | CSE_KMS'` 및 `kms_key='aws_kms_key_arn'`을 지정하는 `TBLPROPERTIES` 절을 사용합니다.

```
CREATE EXTERNAL TABLE 'my_encrypted_data' (
   `n_nationkey` int,
   `n_name` string,
   `n_regionkey` int,
   `n_comment` string)
ROW FORMAT SERDE
   'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
   'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
LOCATION
   's3://amzn-s3-demo-bucket/{{folder_with_my_encrypted_data}}/'
TBLPROPERTIES (
    'encryption_option' = 'SSE_KMS',
    'kms_key' = 'arn:aws:kms:us-east-1:012345678901:key/my_kms_key')
```

새로 삽입된 모든 데이터는 작업 그룹에서 쿼리 결과의 암호화 구성을 사용하는 대신 테이블 속성에 지정된 암호화 구성을 사용하여 암호화됩니다.

## 고려 사항 및 제한
<a name="considerations-and-limitations"></a>

암호화된 데이터세트를 쓰고 읽을 때 다음 사항을 고려합니다.
+ `has_encrypted_data`, `encryption_option` 및 `kms_key` 테이블 속성은 Hive 테이블에서만 사용할 수 있습니다.
+ CSE-KMS로 암호화된 데이터가 포함된 테이블을 생성할 때는 모든 데이터가 동일한 AWS KMS 키로 암호화되도록 하는 것이 좋습니다.
+ CSE-KMS로 암호화된 데이터가 포함된 테이블을 생성할 때는 모든 데이터가 CSE-KMS로 암호화되고 CSE-KMS 및 CSE-KMS 이외 방식으로 암호화된 객체가 혼합되지 않도록 하는 것이 좋습니다.