【AWS】Amazon Athenaとは?S3データをSQLで分析する方法を解説

【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でも数分程度で結果が返ってくることが多いです。

この記事を書いた人

TK

モリミー

Webエンジニア / テクニカルライター / マーケター

都内で働くWebエンジニア。テクニカルライターをしています。 映画やゲームが好きです。

こちらの記事もおすすめ

広告

記事内広告