

# 分析ツールを使用した S3 ストレージレンズデータのクエリ
<a name="storage-lens-s3-tables-querying"></a>

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

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

## 前提条件
<a name="storage-lens-s3-tables-querying-prerequisites"></a>

開始する前に、以下があることを確認してください。
+ S3 Tables のエクスポートが有効になっている S3 ストレージレンズ設定。詳細については、「[S3 ストレージレンズメトリクスを S3 Tables にエクスポートする](storage-lens-s3-tables-export.md)」を参照してください。
+ Amazon Athena または他の分析サービスへのアクセス。
+ エクスポートを有効にしてから最初のデータが利用可能になるまで、24～48 時間待機しました。

## インテグレーションの概要
<a name="storage-lens-s3-tables-querying-integration-overview"></a>

前提条件、IAM ロール設定、ステップバイステップの手順など、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 ストレージレンズデータをクエリできるようになります。これにより、標準 SQL を使用して、カスタム分析を実行したり、ダッシュボードを作成したり、ストレージデータからインサイトを取得したりできます。

## Amazon Athena を使用したクエリ
<a name="storage-lens-s3-tables-querying-athena"></a>

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

**注記**  
すべてのクエリ例で、`lens_my-config_exp` を実際のストレージレンズ設定名前空間に置き換えます。名前空間の命名規則の詳細については、「[S3 ストレージレンズから 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 を使用して大量のデータを簡単に処理できるマネージド Hadoop フレームワークを提供します。Iceberg コネクタを使用して、S3 ストレージレンズテーブルを直接読み取ることができます。

### Spark で S3 テーブルを読み取る
<a name="storage-lens-s3-tables-querying-emr-spark"></a>

次の 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)
```

## クエリ最適化のベストプラクティス
<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
  ```
+  **空のレコードをフィルタリングする** – 条件を使用して、空のレコードまたは値がゼロのレコードを除外します。

  ```
  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 ストレージレンズテーブルで AI アシスタントを使用する](storage-lens-s3-tables-ai-tools.md) について説明します
+ メトリクス定義については、「[Amazon S3 Storage Lens のメトリクスに関する用語集](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) についての詳細