

# 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 暗号化データセットを読み取るために指定できるテーブルプロパティは 2 セットあります。
+ テーブルプロパティ `encryption_option` と `kms_key` の使用（推奨）
+ テーブルプロパティ `has_encrypted_data` の使用

**重要**  
暗号化された Parquet ファイルのアップロードに Amazon EMR と EMRFS 併用する場合は、`fs.s3n.multipart.uploads.enabled` を `false` に設定してマルチパートアップロードを無効にする必要があります。これを行わないと、Athena は Parquet ファイルの長さを判断できず、**HIVE\$1CANNOT\$1OPEN\$1SPLIT** エラーが発生します。詳細については、「[Amazon EMR 管理ガイド](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-upload-s3.html#Config_Multipart)」の「*Amazon S3 用のマルチパートアップロードを設定する*」を参照してください。

### テーブルプロパティ encryption\$1option と kms\$1key の使用
<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 は、Amazon S3 暗号化クライアント V1、V2または V3 によって作成された CSE-KMS 暗号化オブジェクトを読み取ることができます。
+ Athena は CSE-KMS データの復号に `kms_key` の AWS KMS キーを使用します。オブジェクトが別の AWS KMS キーで暗号化されている場合はクエリが失敗します。
+ Athena は引き続き SSE-S3 と SSE-KMS の暗号化オブジェクトを読み取ることができますが、サーバー側とクライアント側の暗号化オブジェクトを混在させることは推奨されません。

### テーブルプロパティ has\$1encrypted\$1data の使用
<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\$1encrypted\$1data を指定すると、次のようになります。
+ Athena は、Amazon S3 暗号化クライアント V1 によって作成された 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'` プロパティをテーブルに追加します。

![\[テーブルの追加フォームで暗号化されたデータセットを選択する\]](http://docs.aws.amazon.com/ja_jp/athena/latest/ug/images/add-table-form-encrypted-option.png)


Athena コンソールのテーブルのリストでは、`has_encrypted_data='true'` を含む CSE-KMS 暗号化テーブルにはキー型のアイコンが表示されます。

![\[暗号化テーブルのアイコン\]](http://docs.aws.amazon.com/ja_jp/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 暗号化オブジェクトが混在していないことを確認しておきましょう。