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 で取得する。
全体像を把握するには関連書籍も有用。