분석 도구로 S3 Storage Lens 데이터 쿼리하기

분석 도구로 S3 Storage Lens 데이터 쿼리하기

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

출처: Querying S3 Storage Lens data with analytics tools

중요: aws-s3 테이블 버킷에서 분석 통합을 활성화하는 것은 종종 놓치는 필수 단계예요. 이 구성을 하지 않으면 AWS 분석 서비스를 사용해 S3 Storage Lens 테이블을 쿼리할 수 없어요.

사전 요구 사항

시작하기 전에 다음이 준비되어 있는지 확인하세요.

  • S3 Tables 내보내기가 활성화된 S3 Storage Lens 구성. 자세한 내용은 "S3 Storage Lens 지표를 S3 Tables로 내보내기"를 참조해 주세요.
  • Amazon Athena 또는 다른 분석 서비스에 대한 액세스 권한
  • 내보내기 활성화 후 첫 데이터가 준비되기까지 24~48시간을 기다린 상태

통합 개요

S3 Tables를 AWS 분석 서비스와 통합하는 방법(사전 요구 사항, IAM 역할 구성, 단계별 절차 포함)에 대한 자세한 내용은 Amazon S3 Tables를 AWS 분석 서비스와 통합을 참조해 주세요.

S3 Tables 내보내기를 활성화하고 분석 통합을 설정하면 Amazon Athena, Amazon Redshift, Amazon EMR 같은 AWS 분석 서비스를 사용해 S3 Storage Lens 데이터를 쿼리할 수 있어요. 이를 통해 표준 SQL로 사용자 정의 분석을 수행하고, 대시보드를 만들고, 스토리지 데이터에서 인사이트를 얻을 수 있어요.

Amazon Athena로 쿼리하기

Amazon Athena는 표준 SQL을 사용해 데이터를 쉽게 분석할 수 있게 해주는 서버리스 대화형 쿼리 서비스예요. 다음 단계에 따라 Athena에서 S3 Storage Lens 데이터를 쿼리해 보세요.

참고: 모든 쿼리 예제에서 lens_my-config_exp를 실제 Storage Lens 구성 네임스페이스로 바꿔주세요. 네임스페이스 명명에 대한 자세한 내용은 "S3 Tables로의 S3 Storage Lens 내보내기 테이블 명명"을 참조해 주세요.

예시: 상위 스토리지 소비자 쿼리

다음 쿼리는 스토리지 소비량 기준 상위 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

예시: 시간 경과에 따른 스토리지 증가 분석

다음 쿼리는 지난 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;

예시: 불완전한 멀티파트 업로드 식별

다음 쿼리는 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;

예시: 콜드 데이터 후보 찾기

다음 쿼리는 지난 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;

예시: 요청 패턴 분석

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

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로 쿼리하기

Amazon EMR은 Apache Spark를 사용해 방대한 양의 데이터를 쉽게 처리할 수 있게 해주는 관리형 Hadoop 프레임워크를 제공해요. Iceberg 커넥터를 사용해 S3 Storage Lens 테이블을 직접 읽을 수 있어요.

Spark로 S3 테이블 읽기

다음 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)

쿼리 최적화 모범 사례

쿼리 성능을 최적화하고 비용을 줄이려면 다음 모범 사례를 따르세요.

  • 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)
    

최적화 쿼리 패턴 예시

다음 쿼리는 최적화를 위한 모범 사례를 보여줘요.

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

문제 해결

쿼리가 결과를 반환하지 않음

문제: 쿼리가 성공적으로 완료되지만 결과를 반환하지 않아요.

해결책:

  • 최신 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시간 기다리세요.

액세스 거부 오류

문제: 쿼리 실행 시 액세스 거부 오류가 발생해요.

해결책: AWS Lake Formation 권한이 올바르게 구성되었는지 확인하세요. 자세한 내용은 Amazon S3 Tables를 AWS 분석 서비스와 통합을 참조해 주세요.

더 알아보기

  • S3 Storage Lens 테이블로 AI 어시스턴트 사용하기
  • Amazon S3 Storage Lens 지표 용어집에서 지표 정의 확인하기
  • Amazon S3 Storage Lens 지표 사용 사례에서 더 많은 분석 아이디어 살펴보기
  • 서버리스 쿼리를 위한 Amazon Athena 알아보기