View a markdown version of this page

分析ツールを使用した S3 ストレージレンズデータのクエリ - Amazon Simple Storage Service

分析ツールを使用した S3 ストレージレンズデータのクエリ

Amazon Athena や Amazon EMR などの AWS 分析サービスを使用して、S3 Tables にエクスポートされた S3 ストレージレンズデータをクエリする前に、AWS マネージド「aws-s3」テーブルバケットで分析統合を有効にし、AWS Lake Formation アクセス許可を設定する必要があります。

重要

「aws-s3」テーブルバケットで分析統合を有効にすることは、見逃されることが多い必須のステップです。この設定がないと、AWS 分析サービスを使用して S3 ストレージレンズテーブルをクエリすることはできません。

前提条件

開始する前に、以下があることを確認してください。

  • S3 Tables のエクスポートが有効になっている S3 ストレージレンズ設定。詳細については、「S3 ストレージレンズメトリクスを S3 Tables にエクスポートする」を参照してください。

  • Amazon Athena または他の分析サービスへのアクセス。

  • エクスポートを有効にしてから最初のデータが利用可能になるまで、24~48 時間待機しました。

インテグレーションの概要

前提条件、IAM ロール設定、ステップバイステップの手順など、S3 Tables と AWS 分析サービスとの統合の詳細については、「Amazon S3 Tables とAWS 分析サービスの統合」を参照してください。

S3 Tables のエクスポートを有効にして分析統合を設定すると、Amazon Athena、Amazon Redshift、Amazon EMR などの AWS 分析サービスを使用して S3 ストレージレンズデータをクエリできるようになります。これにより、標準 SQL を使用して、カスタム分析を実行したり、ダッシュボードを作成したり、ストレージデータからインサイトを取得したりできます。

Amazon Athena を使用したクエリ

Amazon Athena は、データを標準 SQL を使用して簡単に分析できる、サーバーレスのインタラクティブクエリサービスです。Athena で S3 ストレージレンズデータをクエリするには、次の手順に従います。

注記

すべてのクエリ例で、lens_my-config_exp を実際のストレージレンズ設定名前空間に置き換えます。名前空間の命名規則の詳細については、「S3 ストレージレンズから S3 Tables へのエクスポートのテーブルの命名」を参照してください。

例: 上位のストレージコンシューマーをクエリする

次のクエリは、ストレージ消費量上位 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 ストレージレンズテーブルを直接読み取ることができます。

Spark で S3 テーブルを読み取る

次の Python コードを使用して、Spark で S3 ストレージレンズデータを読み取ります。

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
  • 空のレコードをフィルタリングする – 条件を使用して、空のレコードまたは値がゼロのレコードを除外します。

    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 アクセス許可が正しく設定されていることを確認します。詳細については、「Integrating Amazon S3 Tables with AWS analytics services」を参照してください。

次のステップ