

# 분석 도구를 사용하여 S3 Storage Lens 데이터 쿼리
<a name="storage-lens-s3-tables-querying"></a>

Amazon Athena 또는 Amazon EMR과 같은 AWS 분석 서비스를 사용하여 S3 Tables로 내보낸 S3 Storage Lens 데이터를 쿼리하려면 먼저 AWS 관리형 `aws-s3` 테이블 버킷에서 분석 통합을 활성화하고 AWS Lake Formation 권한을 구성해야 합니다.

**중요**  
‘aws-s3’ 테이블 버킷에서 분석 통합을 활성화하는 것은 종종 놓치는 필수 단계입니다. 이 구성이 없으면 AWS 분석 서비스를 사용하여 S3 Storage Lens 테이블을 쿼리할 수 없습니다.

## 사전 조건
<a name="storage-lens-s3-tables-querying-prerequisites"></a>

시작하기 전에 다음이 있는지 확인하세요.
+ S3 Tables 내보내기가 활성화된 S3 Storage Lens 구성입니다. 자세한 내용은 섹션을 참조하세요[S3 Storage Lens 지표를 S3 테이블로 내보내기](storage-lens-s3-tables-export.md)
+ Amazon Athena 또는 다른 분석 서비스에 대한 액세스입니다.
+ 첫 번째 데이터를 사용할 수 있도록 내보내기를 활성화한 후 24\~48시간이 지났습니다.

## 통합 개요
<a name="storage-lens-s3-tables-querying-integration-overview"></a>

사전 조건, IAM 역할 구성 및 step-by-step 절차를 포함하여 S3 Tables를 AWS 분석 서비스와 통합하는 방법에 대한 자세한 내용은 [Amazon S3 Tables를 AWS 분석 서비스와 통합](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-aws.html)을 참조하세요.

S3 Tables 내보내기를 활성화하고 분석 통합을 설정한 후 Amazon Athena, Amazon Redshift, Amazon EMR과 같은 AWS 분석 서비스를 사용하여 S3 Storage Lens 데이터를 쿼리할 수 있습니다. 이를 통해 사용자 지정 분석을 수행하고, 대시보드를 생성하고, 표준 SQL을 사용하여 스토리지 데이터에서 인사이트를 도출할 수 있습니다.

## Amazon Athena를 사용하여 쿼리
<a name="storage-lens-s3-tables-querying-athena"></a>

Amazon Athena는 표준 SQL을 사용하여 데이터를 쉽게 분석할 수 있도록 해주는 서버리스 대화형 쿼리 서비스입니다. 다음 단계에 따라 Athena에서 S3 Storage Lens 데이터를 쿼리합니다.

**참고**  
모든 쿼리 예제에서 `lens_my-config_exp`를 실제 Storage Lens 구성 네임스페이스로 바꿉니다. 네임스페이스에 대한 자세한 내용은 [S3 Storage Lens를 S3 Tables로 내보내기 위한 테이블 이름 지정](storage-lens-s3-tables-naming.md) 섹션을 참조하세요.

### 예: 상위 스토리지 소비자 쿼리
<a name="storage-lens-s3-tables-querying-athena-top-consumers"></a>

다음 쿼리는 스토리지 사용량별로 상위 10개 버킷을 식별합니다.

```
SELECT 
    bucket_name,
    storage_class,
    SUM(storage_bytes) / POWER(1024, 3) AS storage_gb,
    SUM(object_count) AS objects
FROM "s3tablescatalog/aws-s3"."lens_my-config_exp"."default_storage_metrics"
WHERE report_time = (
    SELECT MAX(report_time) 
    FROM "s3tablescatalog/aws-s3"."lens_my-config_exp"."default_storage_metrics"
)
    AND record_type = 'BUCKET'
    AND bucket_name != ''
GROUP BY bucket_name, storage_class
ORDER BY storage_gb DESC
LIMIT 10
```

### 예: 시간 경과에 따른 스토리지 증가 분석
<a name="storage-lens-s3-tables-querying-athena-growth"></a>

다음 쿼리는 지난 30일 동안의 스토리지 증가를 분석합니다.

```
SELECT 
    CAST(report_time AS date) AS report_date,
    SUM(storage_bytes) / POWER(1024, 3) AS total_storage_gb
FROM "s3tablescatalog/aws-s3"."lens_my-config_exp"."default_storage_metrics"
WHERE report_time >= current_date - interval '30' day
    AND record_type = 'ACCOUNT'
GROUP BY CAST(report_time AS date)
ORDER BY report_date DESC;
```

### 예: 미완료 멀티파트 업로드 식별
<a name="storage-lens-s3-tables-querying-athena-mpu"></a>

다음 쿼리는 7일 이상 된 불완전한 멀티파트 업로드가 있는 버킷을 찾습니다.

```
SELECT 
    bucket_name,
    SUM(incomplete_mpu_storage_older_than_7_days_bytes) / POWER(1024, 3) AS wasted_storage_gb,
    SUM(incomplete_mpu_object_older_than_7_days_count) AS wasted_objects
FROM "s3tablescatalog/aws-s3"."lens_my-config_exp"."default_storage_metrics"
WHERE report_time = (
    SELECT MAX(report_time) 
    FROM "s3tablescatalog/aws-s3"."lens_my-config_exp"."default_storage_metrics"
)
    AND record_type = 'BUCKET'
    AND incomplete_mpu_storage_older_than_7_days_bytes > 0
GROUP BY bucket_name
ORDER BY wasted_storage_gb DESC;
```

### 예: 콜드 데이터 후보 찾기
<a name="storage-lens-s3-tables-querying-athena-cold-data"></a>

다음 쿼리는 핫 스토리지 계층에 저장된 지난 100일 동안 활동이 없는 접두사를 식별합니다.

```
WITH recent_activity AS (
    SELECT DISTINCT 
        bucket_name,
        record_value AS prefix_path
    FROM "s3tablescatalog/aws-s3"."lens_my-config_exp"."expanded_prefixes_activity_metrics"
    WHERE report_time >= current_date - interval '100' day
        AND record_type = 'PREFIX'
        AND all_request_count > 0
)
SELECT 
    s.bucket_name,
    s.record_value AS prefix_path,
    s.storage_class,
    SUM(s.storage_bytes) / POWER(1024, 3) AS storage_gb
FROM "s3tablescatalog/aws-s3"."lens_my-config_exp"."expanded_prefixes_storage_metrics" s
LEFT JOIN recent_activity r 
    ON s.bucket_name = r.bucket_name 
    AND s.record_value = r.prefix_path
WHERE s.report_time = (
    SELECT MAX(report_time) 
    FROM "s3tablescatalog/aws-s3"."lens_my-config_exp"."expanded_prefixes_storage_metrics"
)
    AND s.record_type = 'PREFIX'
    AND s.storage_class IN ('STANDARD', 'REDUCED_REDUNDANCY')
    AND s.storage_bytes > 1073741824  -- > 1GB
    AND r.prefix_path IS NULL  -- No recent activity
GROUP BY s.bucket_name, s.record_value, s.storage_class
ORDER BY storage_gb DESC
LIMIT 20;
```

### 예: 요청 패턴 분석
<a name="storage-lens-s3-tables-querying-athena-requests"></a>

다음 쿼리는 요청 패턴을 분석하여 액세스 빈도를 이해합니다.

```
SELECT 
    bucket_name,
    SUM(all_request_count) AS total_requests,
    SUM(get_request_count) AS get_requests,
    SUM(put_request_count) AS put_requests,
    ROUND(100.0 * SUM(get_request_count) / NULLIF(SUM(all_request_count), 0), 2) AS get_percentage,
    SUM(downloaded_bytes) / POWER(1024, 3) AS downloaded_gb
FROM "s3tablescatalog/aws-s3"."lens_my-config_exp"."default_activity_metrics"
WHERE report_time >= current_date - interval '7' day
    AND record_type = 'BUCKET'
    AND bucket_name != ''
GROUP BY bucket_name
HAVING SUM(all_request_count) > 0
ORDER BY total_requests DESC
LIMIT 10;
```

## Amazon EMR에서 Apache Spark로 쿼리
<a name="storage-lens-s3-tables-querying-emr"></a>

Amazon EMR은 Apache Spark를 사용하여 방대한 양의 데이터를 쉽게 처리할 수 있는 관리형 하둡 프레임워크를 제공합니다. Iceberg 커넥터를 사용하여 S3 Storage Lens 테이블을 직접 읽을 수 있습니다.

### Spark를 사용하여 S3 테이블 읽기
<a name="storage-lens-s3-tables-querying-emr-spark"></a>

다음 Python 코드를 사용하여 Spark에서 S3 Storage Lens 데이터를 읽습니다.

```
from pyspark.sql import SparkSession

spark = SparkSession.builder \
    .appName("S3StorageLensAnalysis") \
    .config("spark.sql.catalog.s3tablescatalog", "org.apache.iceberg.spark.SparkCatalog") \
    .config("spark.sql.catalog.s3tablescatalog.catalog-impl", "org.apache.iceberg.aws.glue.GlueCatalog") \
    .getOrCreate()

# Read S3 Storage Lens data
df = spark.read \
    .format("iceberg") \
    .load("s3tablescatalog/aws-s3.lens_my-config_exp.default_storage_metrics")

# Analyze data
df.filter("record_type = 'BUCKET'") \
    .groupBy("bucket_name", "storage_class") \
    .sum("storage_bytes") \
    .orderBy("sum(storage_bytes)", ascending=False) \
    .show(10)
```

## 쿼리 최적화 모범 사례
<a name="storage-lens-s3-tables-querying-optimization"></a>

쿼리 성능을 최적화하고 비용을 줄이려면 다음 모범 사례를 따르세요.
+  **report\_time을 기준으로 필터링** - 스캔되는 데이터의 양을 줄이기 위해 항상 날짜 필터를 포함합니다. 이는 보존 기간이 긴 테이블에서 특히 중요합니다.

  ```
  WHERE report_time >= current_date - interval '7' day
  ```
+  **record\_type 필터 사용** - 필요한 데이터만 쿼리하려면 적절한 집계 수준(ACCOUNT, BUCKET, PREFIX)을 지정합니다.

  ```
  WHERE record_type = 'BUCKET'
  ```
+  **LIMIT 절 포함 **- 탐색 쿼리에 LIMIT을 사용하여 결과 크기를 제어하고 쿼리 비용을 줄입니다.

  ```
  LIMIT 100
  ```
+  **빈 레코드 필터링** - 조건을 사용하여 빈 레코드 또는 0 값 레코드를 제외합니다.

  ```
  WHERE storage_bytes > 0
  ```
+  **최신 데이터 사용** - 현재 상태를 분석할 때 기록 데이터를 스캔하지 않도록 최신 report\_time을 필터링합니다.

  ```
  WHERE report_time = (SELECT MAX(report_time) FROM table_name)
  ```

### 최적화된 쿼리 패턴의 예
<a name="storage-lens-s3-tables-querying-optimization-example"></a>

다음 쿼리는 최적화 모범 사례를 보여 줍니다.

```
SELECT 
    bucket_name,
    SUM(storage_bytes) / POWER(1024, 3) AS storage_gb
FROM "s3tablescatalog/aws-s3"."lens_my-config_exp"."default_storage_metrics"
WHERE report_time >= current_date - interval '7' day  -- Date filter
    AND record_type = 'BUCKET'                         -- Record type filter
    AND storage_bytes > 0                              -- Non-empty filter
    AND bucket_name != ''                              -- Non-empty filter
GROUP BY bucket_name
ORDER BY storage_gb DESC
LIMIT 100;                                             -- Result limit
```

## 문제 해결
<a name="storage-lens-s3-tables-querying-troubleshooting"></a>

### 쿼리가 결과를 반환하지 않음
<a name="storage-lens-s3-tables-querying-troubleshooting-no-results"></a>

 **문제:** 쿼리가 성공적으로 완료되었지만 결과를 반환하지 않습니다.

 **해결 방법:** 
+ 최신 report\_time을 확인하여 데이터를 사용할 수 있는지 확인합니다.

  ```
  SELECT MAX(report_time) AS latest_data
  FROM "s3tablescatalog/aws-s3"."lens_my-config_exp"."default_storage_metrics";
  ```
+ 올바른 네임스페이스 이름을 사용하고 있는지 확인합니다. `SHOW TABLES IN `lens_my-config_exp`;`를 사용하여 사용 가능한 테이블을 나열합니다.
+ 첫 번째 데이터를 사용할 수 있도록 S3 Tables 내보내기를 활성화한 후 24\~48시간을 기다립니다.

### 액세스 거부 오류
<a name="storage-lens-s3-tables-querying-troubleshooting-access"></a>

 **문제:** 쿼리를 실행할 때 액세스 거부 오류가 발생합니다.

 **해결 방법:** AWS Lake Formation 권한이 올바르게 구성되었는지 확인합니다. 자세한 내용은 [Integrating Amazon S3 Tables with AWS analytics services](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-aws.html)를 참조하세요.

## 다음 단계
<a name="storage-lens-s3-tables-querying-next-steps"></a>
+ [S3 Storage Lens 테이블에서 AI 어시스턴트 사용](storage-lens-s3-tables-ai-tools.md)에 대해 알아봅니다.
+ 지표 정의는 [Amazon S3 스토리지 렌즈 지표 용어집](storage_lens_metrics_glossary.md) 섹션을 검토하세요.
+ 더 많은 분석 아이디는 [Amazon S3 스토리지 렌즈 지표 사용 사례](storage-lens-use-cases.md) 섹션을 살펴보세요.
+ 서버리스 쿼리를 위한 [Amazon Athena](https://docs.aws.amazon.com/athena/latest/ug/what-is.html)에 대해 알아보기