分析ツールを使用した 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」を参照してください。
次のステップ
-
S3 ストレージレンズテーブルで AI アシスタントを使用する について説明します
-
メトリクス定義については、「Amazon S3 Storage Lens のメトリクスに関する用語集」を参照してください
-
その他の分析のアイデアについては、「Amazon S3 ストレージレンズメトリクスのユースケース」を参照してください
-
サーバーレスクエリ用の Amazon Athena についての詳細