Athena

S3 上のデータを標準 SQL で直接クエリできる AWS のサーバーレス分析サービス

AWSデータ分析

Athena とは

Amazon Athena は、S3 に格納されたデータを標準 SQL で直接クエリできるサーバーレスの分析サービスである。インフラのプロビジョニングが不要で、スキャンしたデータ量に対してのみ課金される ($5/TB)。内部的には Presto (Trino) エンジンを使用している。

基本的な使い方

-- S3 上の CSV ファイルにテーブルを定義
CREATE EXTERNAL TABLE access_logs (
  timestamp string,
  method string,
  path string,
  status int,
  response_time_ms int
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION 's3://my-bucket/logs/';

-- SQL でクエリ
SELECT path, COUNT(*) as count, AVG(response_time_ms) as avg_ms
FROM access_logs
WHERE status >= 500
GROUP BY path
ORDER BY count DESC
LIMIT 10;

Glue Data Catalog との連携

Glue クローラーで S3 のデータを自動スキャンし、スキーマを Data Catalog に登録する。Athena は Data Catalog のテーブル定義を参照してクエリを実行する。

S3 (生データ) → Glue クローラー → Data Catalog → Athena (SQL クエリ)

コスト最適化: Parquet + パーティション

Athena はスキャンしたデータ量で課金されるため、スキャン量を減らすことがコスト最適化の鍵だ。

列指向フォーマット (Parquet)

CSV: 全列をスキャン → 1TB スキャン → $5
Parquet: 必要な列だけスキャン → 100GB スキャン → $0.50

Parquet は列指向フォーマットで、SELECT path, status のように特定の列だけを読み取れる。CSV と比較してスキャン量が 90% 以上削減される。

パーティション

s3://my-bucket/logs/year=2026/month=03/day=25/data.parquet

日付でパーティション分割すると、WHERE year = '2026' AND month = '03' で 1 ヶ月分のデータだけスキャンする。

Redshift との使い分け

観点 Athena Redshift
課金 スキャン量 ($5/TB) インスタンス時間
適するケース アドホッククエリ、低頻度 定常的な分析、ダッシュボード
パフォーマンス 中程度 高い (専用クラスター)
管理 サーバーレス クラスター管理

月に数回のアドホッククエリなら Athena、毎日のダッシュボード更新なら Redshift が適している。

Lambda からの Athena クエリ

const athena = new AthenaClient({});
const { QueryExecutionId } = await athena.send(new StartQueryExecutionCommand({
  QueryString: 'SELECT * FROM logs WHERE status >= 500 LIMIT 100',
  QueryExecutionContext: { Database: 'my_database' },
  ResultConfiguration: { OutputLocation: 's3://my-bucket/athena-results/' },
}));

Athena のクエリは非同期で実行される。結果は S3 に出力され、GetQueryResults で取得する。

全体像を把握するには関連書籍も有用。

関連用語