

# Athena から S3 テーブルのバケットカタログを登録し、テーブルをクエリする
<a name="gdc-register-s3-table-bucket-cat"></a>

Amazon S3 テーブルバケットは、Amazon S3 のバケットの一種で、Apache Iceberg テーブルに表形式データを保存するために専用に構築されています。テーブルバケットは、圧縮、スナップショット管理、ガベージコレクションなどのテーブル管理タスクを自動化して、クエリのパフォーマンスを継続的に最適化し、コストを最小限に抑えます。Iceberg 環境を始めたばかりの場合でも、Iceberg 環境に何千ものテーブルがある場合でも、テーブルバケットはあらゆる規模でデータレイクを簡素化します。詳細については、「[Table buckets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-buckets.html)」を参照してください。

## 考慮事項と制限事項
<a name="gdc-register-s3-table-consideration"></a>
+ Iceberg テーブルでサポートされているすべての DDL オペレーションは、S3 Tables でもサポートされていますが、以下の例外があります。
  + `ALTER TABLE RENAME`、`CREATE VIEW`、`ALTER DATABASE` はサポートされていません。
  + `OPTIMIZE` および `VACUUM` – S3 で圧縮とスナップショットの管理を行うことができます。詳細については、「[S3 Tables のメンテナンスドキュメント](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-maintenance.html)」を参照してください。
+ Athena データソースとして登録された S3 Tables での DDL クエリはサポートされていません。
+ クエリ結果の再利用はサポートされていません。
+ SSE-KMS、CSE-KMS 暗号化が有効になっているワークグループでは、`INSERT`、`UPDATE`、`DELETE`、または `MERGE` などの書き込みオペレーションを S3 Tables で実行することはできません。
+ S3 リクエスタ支払いオプションが有効になっているワークグループでは、S3 Tables で DML オペレーションを実行できません。

## Athena から S3 Tables をクエリする
<a name="gdc-register-s3-table-prereq-setup"></a>

**Athena で S3 Tables をクエリする前に、以下の前提条件となる手順を実行する**

1. S3 テーブルバケットを作成します。詳細については、「Amazon Simple Storage Service ユーザーガイド」の「[テーブルバケットの作成](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-buckets-create.html)」を参照してください。

1. テーブルバケットと AWS Glue Data Catalog の統合が成功していることを確認します。必要なアクセス許可とセットアップ手順については、「AWS Glue デベロッパーガイド」の「[S3 Tables 統合の前提条件](https://docs.aws.amazon.com/glue/latest/dg/s3tables-catalog-prerequisites.html)」および「[S3 Tables と Glue Data Catalog の統合の有効化](https://docs.aws.amazon.com/glue/latest/dg/enable-s3-tables-catalog-integration.html)」を参照してください。

1. Athena でクエリを実行するために使用されるプリンシパルには、次のいずれかのアプローチを使用して S3 Table カタログに対するアクセス許可を付与します。

   **オプション 1: IAM アクセス許可を使用する**

   IAM アクセスコントロールを使用する場合、プリンシパルには AWS Glue Data Catalog リソースと Amazon S3 Tables リソースの両方に対するアクセス許可が必要です。

   次のリストには、Athena の S3 テーブルに対してサポートされている DDL または DML オペレーションを実行する上で必要なすべての `s3tables` アクセス許可が含まれています。
   + `s3tables:GetTableBucket`
   + `s3tables:GetNamespace`
   + `s3tables:GetTable`
   + `s3tables:GetTableData`
   + `s3tables:PutTableData`
   + `s3tables:ListNamespaces`
   + `s3tables:ListTables`
   + `s3tables:DeleteNamespace`
   + `s3tables:DeleteTable`
   + `s3tables:CreateNamespace`
   + `s3tables:CreateTable`
   + `s3tables:UpdateTableMetadataLocation`

   これらのアクセス許可を特定の S3 テーブルバケットと S3 テーブルリソースに適用するか、`*` をリソースとして使用して、アカウント内のすべてのテーブルバケットとテーブルへのアクセスを許可します。これらのアクセス許可を [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonAthenaFullAccess.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonAthenaFullAccess.html) 管理ポリシーと組み合わせて、完全な機能を有効にできます。

   **オプション 2: Lake Formation アクセス許可を使用する**

   または、きめ細かなアクセスコントロールを有効にするには、Lake Formation コンソールまたは AWS CLI を使用して、S3 Table カタログに対する Lake Formation アクセス許可を付与できます。これには、S3 テーブルバケットを Lake Formation データロケーションとして登録する必要があります。詳細については、「Lake Formation デベロッパーガイド」の「[AWS Glue Data Catalog での Amazon S3 Tables カタログの作成](https://docs.aws.amazon.com/lake-formation/latest/dg/create-s3-tables-catalog.html)」を参照してください。

------
#### [ AWS マネジメントコンソール ]

   1. [https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/) で AWS Lake Formation コンソールを開き、データレイク管理者としてサインインします。データレイク管理者の作成方法の詳細については、「[データレイク管理者を作成する](https://docs.aws.amazon.com/lake-formation/latest/dg/initial-lf-config.html#create-data-lake-admin)」を参照してください。

   1. ナビゲーションペインで、**[データアクセス許可]**、**[付与]** の順に選択します。

   1. **[アクセス許可の付与]** ページの **[プリンシパル]** で、Athena からクエリを送信するために使用するプリンシパルを選択します。

   1. **[LF タグまたはカタログリソース]** で、**[名前付きのデータカタログリソース]** を選択します。

   1. **[カタログ]** では、テーブルバケットの統合から作成したグルーデータカタログを選択します。例えば、*<accountID>*:s3tablescatalog/*amzn-s3-demo-bucket* です。

   1. **[Catalog のアクセス許可]** で、**[Super]** を選択します。

   1. **[付与]** を選択します。

------
#### [ AWS CLI ]

   Lake Formation データレイク管理者ロールで次のコマンドを実行して、Athena からクエリを送信するために使用するプリンシパルへのアクセスを許可します。

   ```
   aws lakeformation grant-permissions \
   --region <region (Example,us-east-1)> \
   --cli-input-json \
   '{
       "Principal": {
           "DataLakePrincipalIdentifier": "<user or role ARN (Example, arn:aws:iam::<Account ID>:role/ExampleRole>"
       },
       "Resource": {
           "Catalog": {
               "Id":"<Account ID>:s3tablescatalog/amzn-s3-demo-bucket"
           }
       },
       "Permissions": ["ALL"]
   }'
   ```

------

**S3 Tables のクエリを送信する**

1. 上記で付与されたユーザー/ロールを使用して、Athena から `CREATE DATABASE` クエリを送信します。この例では、`s3tablescatalog` は統合から作成された親 Glue データカタログで、` s3tablescatalog/amzn-s3-demo-bucket` は各 S3 テーブルバケット用に作成された子 Glue データカタログです。クエリを実行する方法は 2 つあります。

------
#### [ Option 1 ]

   コンソールまたは AWS CLI から直接、子 Glue データカタログ (`s3tablescatalog/amzn-s3-demo-bucket`) を指定します。

   **AWS マネジメントコンソール の使用**

   1. [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/) で Athena コンソールを開きます。

   1. 左側のナビゲーションで、**[データソース名]** に **[AwsDataCatalog]** を選択します。

   1. **[カタログ]** に、**[s3tablescatalog/*amzn-s3-demo-bucket*]** を選択します。

   1. クエリエディタで、`CREATE DATABASE test_namespace` のようなクエリを入力します。

   **AWS CLI の使用**

   以下のコマンドを実行してください。

   ```
   aws athena start-query-execution \ 
   --query-string 'CREATE DATABASE `test_namespace`' \ 
   --query-execution-context '{"Catalog": "s3tablescatalog/amzn-s3-demo-bucket"}' \
   --work-group "primary"
   ```

------
#### [ Option 2 ]

   Athena コンソールで子 Glue データカタログから Athena データカタログを作成し、クエリでカタログとして指定します。詳細については、「[Athena データソースとして S3 テーブルバケットカタログを登録する](#gdc-register-s3-table-console-steps)」を参照してください。

------

1. 前のステップで作成したデータベースで、`CREATE TABLE` を使用してテーブルを作成します。次の例では、`s3tablescatalog/amzn-s3-demo-bucket` Glue カタログで以前に作成した *`test_namespace`* データベースにテーブルを作成します。

------
#### [ AWS マネジメントコンソール ]

   1. 左側のナビゲーションで、**[データソース名]** に **[AwsDataCatalog]** を選択します。

   1. **[カタログ]** に、**[s3tablescatalog/*amzn-s3-demo-bucket*]** を選択します。

   1. **[データベース]** で **[test\$1namespace]** を選択します。

   1. クエリエディタで、次のクエリを実行します。

      ```
      CREATE TABLE daily_sales (
              sale_date date,
              product_category
              string, sales_amount double)
      PARTITIONED BY (month(sale_date))
      TBLPROPERTIES ('table_type' = 'iceberg')
      ```

------
#### [ AWS CLI ]

   以下のコマンドを実行してください。

   ```
   aws athena start-query-execution \
   --query-string "CREATE TABLE daily_sales (
           sale_date date,
           product_category
           string, sales_amount double)
   PARTITIONED BY (month(sale_date))
   TBLPROPERTIES ('table_type' = 'iceberg')" \
   --query-execution-context '{"Catalog": "s3tablescatalog/amzn-s3-demo-bucket", "Database":"test_namespace"}' \
   --work-group "primary"
   ```

------

1. 前のステップで作成したテーブルにデータを挿入します。

------
#### [ AWS マネジメントコンソール ]

   1. 左側のナビゲーションで、**[データソース名]** に **[AwsDataCatalog]** を選択します。

   1. **[カタログ]** に、**[s3tablescatalog/*amzn-s3-demo-bucket*]** を選択します。

   1. **[データベース]** で **[test\$1namespace]** を選択します。

   1. クエリエディタで、次のクエリを実行します。

      ```
      INSERT INTO daily_sales
      VALUES 
          (DATE '2024-01-15', 'Laptop', 900.00),
          (DATE '2024-01-15', 'Monitor', 250.00),
          (DATE '2024-01-16', 'Laptop', 1350.00),
          (DATE '2024-02-01', 'Monitor', 300.00);
      ```

------
#### [ AWS CLI ]

   以下のコマンドを実行してください。

   ```
   aws athena start-query-execution \
   --query-string "INSERT INTO \"s3tablescatalog/amzn-s3-demo-bucket\".test_namespace.daily_sales
   VALUES 
   (DATE '2024-01-15', 'Laptop', 900.00),
   (DATE '2024-01-15', 'Monitor', 250.00),
   (DATE '2024-01-16', 'Laptop', 1350.00),
   (DATE '2024-02-01', 'Monitor', 300.00)"\ 
   --work-group "primary"
   ```

------

1. テーブルにデータを挿入したら、クエリを実行できます。

------
#### [ AWS マネジメントコンソール ]

   1. 左側のナビゲーションで、**[データソース名]** に **[AwsDataCatalog]** を選択します。

   1. **[カタログ]** に、**[s3tablescatalog/*amzn-s3-demo-bucket*]** を選択します。

   1. **[データベース]** で **[test\$1namespace]** を選択します。

   1. クエリエディタで、次のクエリを実行します。

      ```
      SELECT
          product_category,
          COUNT(*) AS units_sold,
          SUM(sales_amount) AS total_revenue,
          AVG(sales_amount) AS average_price
      FROM
          daily_sales
      WHERE
          sale_date BETWEEN DATE '2024-02-01' 
                       AND DATE '2024-02-29'
      GROUP BY
          product_category
      ORDER BY
          total_revenue DESC
      ```

------
#### [ AWS CLI ]

   以下のコマンドを実行してください。

   ```
   aws athena start-query-execution \
   --query-string "SELECT product_category,
       COUNT(*) AS units_sold,
       SUM(sales_amount) AS total_revenue,
       AVG(sales_amount) AS average_price
   FROM \"s3tablescatalog/amzn-s3-demo-bucket\".test_namespace.daily_sales
   WHERE sale_date BETWEEN DATE '2024-02-01' AND DATE '2024-02-29'
   GROUP BY product_category
   ORDER BY total_revenue DESC"\
   --work-group "primary"
   ```

------

## Athena で S3 Tables を作成する
<a name="gdc-create-s3-tables-athena"></a>

Athena では、既存の S3 テーブル名前空間でのテーブルの作成、または Athena で `CREATE DATABASE` ステートメントを使用して作成された名前空間の作成がサポートされています。Athena から S3 テーブルを作成するには、次の例に示すように、`LOCATION` を指定しない点を除いて、[通常の Iceberg テーブルを作成する](querying-iceberg-creating-tables.md)場合と同じ構文を使用します。

```
CREATE TABLE
[db_name.]table_name (col_name data_type [COMMENT col_comment] [, ...] )
[PARTITIONED BY (col_name | transform, ... )]
[TBLPROPERTIES ([, property_name=property_value] )]
```

CREATE TABLE AS SELECT (CTAS) ステートメントを使用して S3 テーブルを作成することもできます。詳細については、「[S3 テーブル向けの CTAS](#ctas-s3-tables)」を参照してください。

## Athena データソースとして S3 テーブルバケットカタログを登録する
<a name="gdc-register-s3-table-console-steps"></a>

S3 テーブルバケットカタログを Athena コンソールに登録するには、次の手順を実行します。

1. [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/) で Athena コンソールを開きます。

1. ナビゲーションペインで、**[データソースとカタログ]** を選択します。

1. **[データソースとカタログ]** ページで **[データソースを作成]** を選択します。

1. **[データソースを選択]** で、**[Amazon S3 - AWS Glue Data Catalog]** を選択します。

1. **[AWS Glue Data Catalog]** セクションの **[データソースアカウント]** で、**[このアカウントの AWS Glue Data Catalog]** を選択します。

1. **[テーブルの作成またはカタログの登録]** で、**[新しい AWS Glue カタログを登録]** を選択します。

1. **[データソースの詳細]** セクションの **[データソース名]** に、SQL クエリでデータソースを指定するために使用する名前を入力するか、生成されたデフォルト名を使用します。

1. **[カタログ]** で、**[参照]** を選択して、同じアカウントの AWS Glue カタログのリストを検索します。既存のカタログが表示されない場合は、[AWS Glue コンソール](https://console.aws.amazon.com/glue/)で作成します。

1. **[AWS Glue カタログを参照]** ダイアログボックスで、使用するカタログを選択し、**[選択]** を選択します。

1. (オプション) **[タグ]** では、データソースと関連付けるキーと値のペアがあれば入力します。

1. [**次へ**] を選択します。

1. **[確認と作成]** ページで、入力した情報が正しいことを確認し、**[データソースを作成]** を選択します。

## S3 テーブル向けの CTAS
<a name="ctas-s3-tables"></a>

Amazon Athena で S3 テーブル向けの CREATE TABLE AS SELECT (CTAS) オペレーションが現在サポートされています。この機能を使用すると、SELECT クエリの結果に基づいて新しい S3 テーブルを作成できます。

S3 テーブルの CTAS クエリを作成する際には、標準の Athena テーブルと比べていくつかの重要な違いがあります。
+ S3 Tables は独自のストレージロケーションを自動的に管理するため、ロケーションプロパティを省略する必要があります。
+ `table_type` プロパティはデフォルトで `ICEBERG` になるため、クエリで明示的に指定する必要はありません。
+ 形式を指定しない場合、システムは自動的にデータのデフォルト形式として `PARQUET` を使用します。
+ 他のすべてのプロパティは、通常の Iceberg テーブルと同じ構文に従います。

CTAS を使用して S3 Tables を作成する前に、IAM または AWS Lake Formation で必要なアクセス許可が設定されていることを確認してください。具体的には、S3 Tables カタログにテーブルを作成するためのアクセス許可が必要です。これらのアクセス許可がないと、CTAS オペレーションは失敗します。

**注記**  
CTAS クエリが失敗した場合、クエリを再実行する前に [S3 Tables API](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-delete.html) を使用してテーブルの削除が必要な場合があります。Athena `DROP TABLE` ステートメントを使用して、クエリによって部分的に作成されたテーブルを削除することはできません。

**例**

```
CREATE TABLE "s3tablescatalog/amzn-s3-demo-bucket"."namespace"."s3-table-name"
WITH (
    format = 'PARQUET'
)
AS SELECT *
FROM source_table;
```