【AWS】Amazon Athenaとは?S3データをSQLで分析する方法を解説
Amazon S3に保存された大量のデータを分析したいけれど、わざわざデータベースに移行するのは面倒...そんな悩みを解決するのがAmazon Athenaです。
本記事では、S3上のデータを直接SQLで分析できるAmazon Athenaの基本的な使い方と活用方法を解説します。
Athenaの最大の特徴
サーバーレスでS3データを標準SQLで直接クエリできる分析サービスです。インフラ管理不要で、使った分だけの従量課金制。
Amazon Athenaとは?
概要
Amazon Athenaは、S3に保存されたデータを標準SQLで分析できるインタラクティブなクエリサービスです。
主な特徴:
- サーバーレス - インフラ管理不要
- 標準SQL対応 - Presto準拠のSQL
- 即座に利用可能 - セットアップ不要
- 従量課金 - スキャンしたデータ量のみ課金
従来のデータ分析との違い
項目 | 従来の方法 | Amazon Athena |
---|---|---|
データ移行 | S3→DBへ移行必要 | S3のまま分析可能 |
インフラ管理 | サーバー管理必要 | サーバーレス |
初期コスト | 高(サーバー費用) | なし(従量課金) |
スケーラビリティ | 事前設計必要 | 自動スケール |
Athenaが適している用途
1. ログ分析
活用例
- ✅ アプリケーションログの分析
- ✅ CloudTrailログの監査
- ✅ ALB/CLBアクセスログの集計
- ✅ VPCフローログの調査
2. アドホック分析
- 定期的でない一時的なデータ分析
- 探索的データ分析(EDA)
- データの品質チェック
3. ETL処理の一部として
- データレイクからの抽出処理
- 簡易的な変換処理
- 集計結果の出力
基本的な使い方
Step 1: S3にデータを配置
s3://my-bucket/
└── logs/
└── year=2025/
└── month=01/
└── day=08/
├── log1.json
├── log2.json
└── log3.json
💡 パーティション化のメリット
年/月/日でフォルダを分けることで、特定期間のデータのみをスキャンでき、クエリ速度向上とコスト削減が可能です。
Step 2: データベースとテーブルを作成
-- データベース作成
CREATE DATABASE IF NOT EXISTS mydb;
-- テーブル作成(JSONの例)
CREATE EXTERNAL TABLE IF NOT EXISTS mydb.access_logs (
timestamp string,
user_id string,
action string,
resource string,
status int
)
PARTITIONED BY (
year int,
month int,
day int
)
STORED AS JSON
LOCATION 's3://my-bucket/logs/';
Step 3: パーティションの追加
-- パーティションを自動で検出
MSCK REPAIR TABLE mydb.access_logs;
-- または手動で追加
ALTER TABLE mydb.access_logs
ADD PARTITION (year=2025, month=1, day=8)
LOCATION 's3://my-bucket/logs/year=2025/month=01/day=08/';
Step 4: クエリの実行
-- 特定日のアクセス数を集計
SELECT
action,
COUNT(*) as count
FROM mydb.access_logs
WHERE year = 2025
AND month = 1
AND day = 8
GROUP BY action
ORDER BY count DESC;
パフォーマンス最適化のテクニック
1. データフォーマットの選択
フォーマット | 圧縮率 | クエリ速度 | 推奨度 |
---|---|---|---|
Parquet | ◎ 高 | ◎ 速い | ★★★ |
ORC | ◎ 高 | ◎ 速い | ★★★ |
JSON | △ 低 | △ 遅い | ★ |
CSV | △ 低 | △ 遅い | ★ |
2. パーティション設計
-- 良い例:年月日でパーティション
PARTITIONED BY (year int, month int, day int)
-- さらに良い例:必要に応じて時間も追加
PARTITIONED BY (dt string, hour int) -- dt='2025-01-08'
3. データ圧縮
圧縮の効果
- 📉 スキャン量削減 → コスト削減
- ⚡ 転送量削減 → クエリ高速化
- 💾 S3ストレージ削減 → 保管コスト削減
コスト最適化
料金体系
- クエリ料金: スキャンしたデータ1TBあたり$5(東京リージョン)
- S3料金: 通常のS3ストレージ料金
- その他: データ転送料金(リージョン間転送時)
コスト削減のベストプラクティス
コスト削減チェックリスト
- ✅ データを圧縮する(Gzip、Snappy等)
- ✅ 列指向フォーマットを使用(Parquet、ORC)
- ✅ 適切なパーティション設計
- ✅ 必要な列のみSELECTする(SELECT * を避ける)
- ✅ LIMIT句で結果を制限
- ✅ クエリ結果をキャッシュ活用
コスト計算例
【ケース1】非圧縮CSV 1TB
→ コスト: $5
【ケース2】Parquet形式に変換(圧縮率80%)
→ スキャン量: 200GB
→ コスト: $1
節約額: $4(80%削減)
他のAWSサービスとの連携
AWS Glueとの連携
- Glue Crawler: S3データを自動でカタログ化
- Glue ETL: Athenaの結果を変換・加工
QuickSightとの連携
-- QuickSight用のビューを作成
CREATE VIEW mydb.dashboard_data AS
SELECT
DATE(timestamp) as date,
COUNT(*) as total_requests,
COUNT(DISTINCT user_id) as unique_users
FROM mydb.access_logs
GROUP BY DATE(timestamp);
Lambda関数からの実行
import boto3
athena = boto3.client('athena')
response = athena.start_query_execution(
QueryString='SELECT * FROM mydb.access_logs LIMIT 10',
QueryExecutionContext={'Database': 'mydb'},
ResultConfiguration={'OutputLocation': 's3://my-results-bucket/'}
)
よくあるトラブルシューティング
1. クエリが遅い
対処法
- 📍 パーティションを活用しているか確認
- 📍 データフォーマットをParquetに変換
- 📍 不要な列をSELECTしていないか確認
2. コストが高い
- データ圧縮を検討
- パーティション設計の見直し
- 頻繁にアクセスするデータは集計済みテーブルを作成
3. パーティションが認識されない
-- パーティションを修復
MSCK REPAIR TABLE mydb.table_name;
-- または手動で追加
ALTER TABLE mydb.table_name ADD PARTITION ...
まとめ
Amazon Athenaは、S3のデータをそのまま分析できる強力なツールです。
Athenaを使うべき場面
- 🎯 S3に大量のログやデータがある
- 🎯 定期的でないアドホックな分析が必要
- 🎯 インフラ管理の手間を省きたい
- 🎯 使った分だけ支払いたい
適切なデータフォーマットとパーティション設計により、高速かつ低コストなデータ分析環境を構築できます。まずは小さなデータセットから始めて、Athenaの便利さを体験してみてください。
よくある質問
QAmazon Athenaの料金はどのように計算されますか?
A
スキャンしたデータ量に対して課金されます。東京リージョンでは1TBあたり5ドルです。データを圧縮・パーティション化することで、コストを大幅に削減できます。
QAthenaはどのようなファイル形式に対応していますか?
A
CSV、JSON、ORC、Parquet、Avroなど多くの形式に対応しています。特にParquetやORCなどの列指向フォーマットは、クエリ性能とコスト削減の観点で推奨されます。
QAthenaのクエリ実行時間はどのくらいですか?
A
データ量とクエリの複雑さによりますが、数GBのデータなら数秒から数十秒、数TBでも数分程度で結果が返ってくることが多いです。
こちらの記事もおすすめ
広告
記事内広告