

# Athena에서 S3 테이블 버킷 카탈로그 등록 및 테이블 쿼리
<a name="gdc-register-s3-table-bucket-cat"></a>

S3 테이블 버킷은 Apache Iceberg 테이블에 테이블 형식 데이터를 저장하기 위해 특별히 구축된 Amazon S3의 버킷 유형입니다. 테이블 버킷은 압축, 스냅샷 관리, 폐영역 회수와 같은 테이블 관리 작업을 자동화하여 쿼리 성능을 지속적으로 최적화하고 비용을 최소화합니다. 이제 막 시작하는 단계이든 Iceberg 환경에 수천 개의 테이블이 있든, 테이블 버킷은 모든 규모에서 데이터 레이크를 단순화합니다. 자세한 내용은 [테이블 버킷](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-buckets.html)을 참조하세요.

## 고려 사항 및 제한 사항
<a name="gdc-register-s3-table-consideration"></a>
+ Iceberg 테이블에서 지원되는 모든 DDL 작업은 S3 테이블에서 지원되지만 다음과 같은 예외가 있습니다.
  + `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 암호화가 활성화된 작업 그룹에서는 S3 Tables에서 `INSERT`, `UPDATE`, `DELETE` 또는 `MERGE` 같은 쓰기 작업을 실행할 수 없습니다.
+ 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)과 [Glue Data Catalog와 S3 Tables 통합 활성화](https://docs.aws.amazon.com/glue/latest/dg/enable-s3-tables-catalog-integration.html)를 참조하세요.

1. Athena를 사용하여 쿼리를 실행하는 데 사용하는 위탁자에 대해 다음 방법 중 하나를 사용하여 S3 테이블 카탈로그에 대한 권한을 부여하세요.

   **옵션 1: IAM 권한 사용**

   IAM 액세스 제어를 사용하는 경우 위탁자는 AWS Glue Data Catalog 리소스와 Amazon S3 Tables 리소스 모두에 대한 권한이 필요합니다.

   다음 목록에는 Athena에서 S3 Tables에 대해 지원되는 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 테이블 카탈로그에 대한 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 Management Console ]

   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. **카탈로그**에서 테이블 버킷의 통합에서 생성한 글루 데이터 카탈로그를 선택합니다. 예: *<accoundID>*:s3tablescatalog/*amzn-s3-demo-bucket*

   1. **카탈로그 권한**에서 **슈퍼**를 선택합니다.

   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 Data Catalog이며, ` s3tablescatalog/amzn-s3-demo-bucket`는 각 S3 테이블 버킷에 대해 생성된 하위 Glue Data Catalog입니다. 쿼리하는 두 가지 방법이 있습니다.

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

   콘솔 또는 AWS CLI에서 직접 하위 Glue Data Catalog(`s3tablescatalog/amzn-s3-demo-bucket`)를 지정합니다.

   **AWS Management Console 사용**

   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 Data Catalog에서 Athena 데이터 카탈로그를 생성하고 쿼리에서 카탈로그로 지정합니다. 자세한 내용은 [S3 테이블 버킷 카탈로그를 Athena 데이터 소스로 등록](#gdc-register-s3-table-console-steps) 섹션을 참조하세요.

------

1. 이전 단계에서 생성한 데이터베이스로 `CREATE TABLE`를 사용하여 테이블을 생성합니다. 다음 예제는 `s3tablescatalog/amzn-s3-demo-bucket` Glue 카탈로그에서 이전에 생성한 *`test_namespace`* 데이터베이스에 테이블을 생성합니다.

------
#### [ AWS Management Console ]

   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 Management Console ]

   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 Management Console ]

   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는 `CREATE DATABASE` 문을 사용하여 Athena에서 생성된 기존 S3 테이블 네임스페이스 또는 네임스페이스에서 테이블 생성을 지원합니다. 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 Table을 생성할 수도 있습니다. 자세한 내용은 [S3 Table용 CTAS](#ctas-s3-tables) 섹션을 참조하세요.

## S3 테이블 버킷 카탈로그를 Athena 데이터 소스로 등록
<a name="gdc-register-s3-table-console-steps"></a>

Athena 콘솔에 S3 테이블 버킷 카탈로그를 등록하려면 다음 단계를 수행합니다.

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 Table용 CTAS
<a name="ctas-s3-tables"></a>

Amazon Athena는 이제 S3 Table에 대해 CREATE TABLE AS SELECT(CTAS) 작업을 지원합니다. 이 기능을 사용하면 SELECT 쿼리의 결과를 기반으로 새 S3 Table을 생성할 수 있습니다.

S3 Table용 CTAS 쿼리를 생성할 때는 표준 Athena 테이블과 비교하여 몇 가지 중요한 차이점이 있습니다.
+ S3 Table이 자체 스토리지 위치를 자동으로 관리하므로 위치 속성을 생략해야 합니다.
+ `table_type` 속성의 기본값은 `ICEBERG`이므로 쿼리에서 명시적으로 지정할 필요가 없습니다.
+ 형식을 지정하지 않으면 시스템이 자동으로 `PARQUET`을 데이터 기본 형식으로 사용합니다.
+ 다른 모든 속성은 일반 Iceberg 테이블과 동일한 구문을 따릅니다.

CTAS를 사용하여 S3 Table을 생성하기 전에 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;
```