Amazon Athena:S3上のサーバーレスSQL
Athenaで標準SQLを使ってS3のデータを直接クエリし、ParquetやORCなどの列指向フォーマットで最適化して、コスト管理のためにパーティション分割します。
「Amazon Athena:S3上のサーバーレスSQL」はCoddyKit上の無料Cloud & IT Cert Prepレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCloud & IT Cert Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cloud & IT Cert Prepコースには全4レッスンが含まれています。
Amazon Athena とは
Amazon Athena は、Amazon S3 に保存されたデータに対して標準 SQL を直接実行できる、サーバーレスのインタラクティブクエリサービスです。プロビジョニングするサーバーも、管理するクラスターも必要ありません。また、クエリでスキャンしたデータ量に対してのみ料金が発生します(スキャンした 1 TB あたり約 5 ドル)。Athena は内部で Presto を使用し、テーブルメタデータについて Glue Data Catalogue とネイティブに統合されます。
Athena のセットアップ:ワークグループと出力先
クエリを実行する前に、Athena ワークグループを設定し、クエリ結果を出力する S3 パスを指定します。ワークグループを使用すると、チームごとにクエリ履歴とコスト追跡を分離したり、結果の暗号化を強制したり、クエリごとのデータスキャン上限を設定して予想外のコストを防いだりできます。各クエリの結果は、設定した S3 出力バケットに CSV として書き込まれます。
# Create a workgroup with an encrypted output location
aws athena create-work-group \
--name analytics-team \
--configuration '{
"ResultConfiguration": {
"OutputLocation": "s3://athena-results-123/analytics-team/",
"EncryptionConfiguration": {"EncryptionOption": "SSE_S3"}
},
"EnforceWorkGroupConfiguration": true,
"PublishCloudWatchMetricsEnabled": true,
"BytesScannedCutoffPerQuery": 10737418240
}'最初のクエリを実行する
Athena を Glue Data Catalogue のデータベースに接続し、ANSI SQL を実行します。Athena は SELECT、JOIN、GROUP BY、ウィンドウ関数、CTE をサポートしています。また、CREATE TABLE AS SELECT (CTAS) を使用して、クエリ結果を Parquet 形式の新しいテーブルとして保存することもできます。これにより中間結果が実体化され、後続のクエリを高速化できます。
-- Query total sales by month from partitioned S3 data
SELECT
year,
month,
SUM(order_total) AS monthly_revenue
FROM my_db.curated_sales
WHERE year = '2024'
GROUP BY year, month
ORDER BY month;
-- CTAS: materialise result as Parquet for reuse
CREATE TABLE my_db.monthly_revenue
WITH (format = 'PARQUET', external_location = 's3://my-data-lake-123/curated/monthly_revenue/')
AS
SELECT year, month, SUM(order_total) AS revenue
FROM my_db.curated_sales
GROUP BY year, month;コスト最適化:パーティションプルーニング
Athena では、スキャンしたデータ 1 TB ごとに料金が発生します。最も効果の大きいコスト削減策はパーティションプルーニングです。必ず WHERE 句にパーティション列を含めてください。データが year/month/day でパーティション分割されている場合、これらの列で絞り込むことで、Athena が他のパーティションをスキャンしないようにできます。ペタバイト規模のテーブルでパーティションフィルターを指定しないと、単純なクエリでも数百ドルかかる場合があります。
-- EXPENSIVE: No partition filter -> scans all data
SELECT * FROM my_db.curated_sales WHERE customer_id = '12345';
-- CHEAP: Partition filter applied -> scans only Jan 2024
SELECT * FROM my_db.curated_sales
WHERE year = '2024' AND month = '01' AND customer_id = '12345';コスト最適化:列指向形式
CSV や JSON ではなく、Apache Parquet または ORC にデータを保存すると、Athena がクエリごとにスキャンするデータ量を大幅に削減できます。列指向クエリで 50 列中 3 列だけを参照する場合、ディスク上ではその 3 列のデータだけがスキャンされます。組み込みの圧縮(Snappy、Zstd)と組み合わせると、Parquet ファイルは同等の CSV より通常 5~10 倍小さくなり、コストをさらに削減できます。
-- After converting raw CSV to Parquet:
-- CSV version: 500 GB table, query scans 500 GB -> $2.50
-- Parquet version: same data compressed to 50 GB,
-- query reads only 2 columns -> scans ~2 GB -> $0.01
-- Verify table format in Glue Catalogue
SHOW CREATE TABLE my_db.curated_sales;データソースコネクタによるフェデレーテッドクエリ
Athena Federated Query を使用すると、Lambda ベースのデータソースコネクタによって、Athena のクエリ対象を S3 以外にも拡張できます。RDS、DynamoDB、Redshift、Elasticsearch、カスタムソースのデータをクエリできます。Serverless Application Repository からコネクタの Lambda 関数をデプロイし、Athena のデータソースとして登録すると、データをあらかじめ移動することなく、S3 のテーブルと稼働中のデータベースを 1 つの SQL JOIN で横断的にクエリできます。
-- Federated query: join S3 Parquet with live RDS table
SELECT s.order_id, s.total, c.email
FROM my_db.curated_sales s
JOIN rds_lambda.prod_db.customers c
ON s.customer_id = c.id
WHERE s.year = '2024' AND s.month = '01';Athena と QuickSight の統合
Amazon QuickSight はデータソースとして Athena に直接接続できるため、中間データベースなしで、S3 データからインタラクティブなダッシュボードを作成できます。QuickSight は SPICE(Super-fast, Parallel, In-memory Calculation Engine)を使用して Athena のクエリ結果をキャッシュし、ダッシュボードを高速に表示します。このサーバーレス BI スタック(S3 + Glue + Athena + QuickSight)は、コスト効率の高い分析でよく使われる試験パターンです。
Athena クエリのパフォーマンスチューニング
パーティション分割と列指向形式に加えて、次の方法で Athena クエリをさらに最適化できます。大きなファイルを分割する(並列処理のため、1 ファイルあたり 128 MB~1 GB を目安にします)、頻繁に JOIN する列にバケット分割を使用する、SELECT *を避ける、そして正確な値が不要な場合は approx_distinct() や approx_percentile() などの近似集計関数を使用する、といった方法です。これらの手法により、コストとレイテンシーの両方を削減できます。
-- Use approx_distinct for fast cardinality estimate
SELECT
year,
approx_distinct(customer_id) AS approx_unique_customers
FROM my_db.curated_sales
WHERE year = '2024'
GROUP BY year;Athena へのアクセスを制御する
Athena はアクセス制御のために IAM と統合されます。ユーザーには、Athena クエリを実行する権限(athena:StartQueryExecution)、S3 出力バケットへのアクセス権限、基盤となる S3 データの読み取り権限が必要です。列や行単位のきめ細かなアクセス制御には、Athena と Lake Formation を組み合わせます。また、ワークグループ ARN に対する IAM 条件キーを使用して、ワークグループを特定のデータベースに制限することもできます。
# Minimum IAM policy for an Athena analyst
{
"Effect": "Allow",
"Action": [
"athena:StartQueryExecution",
"athena:GetQueryExecution",
"athena:GetQueryResults",
"athena:StopQueryExecution",
"glue:GetDatabase",
"glue:GetTable",
"glue:GetPartitions",
"s3:GetObject",
"s3:PutObject"
],
"Resource": "*"
}クエリ結果の保存とスケジュール済みクエリ
Athena のクエリ結果は S3 に CSV ファイルとして保存され、7 日間キャッシュされます。そのため、その期間内に同一のクエリを再実行しても、データは再スキャンされません。定期的なレポート作成には、Athena Scheduled Queries を使用して cron スケジュールでクエリを実行し、結果を新しい S3 の場所またはテーブルに直接保存します。または、Step Functions のステートマシンや EventBridge ルールから Athena クエリを起動することもできます。
# Start an Athena query via CLI and retrieve results
QUERY_ID=$(aws athena start-query-execution \
--query-string 'SELECT COUNT(*) FROM my_db.curated_sales WHERE year=2024' \
--work-group analytics-team \
--query 'QueryExecutionId' --output text)
# Wait and fetch results
aws athena get-query-results --query-execution-id $QUERY_IDAthena と Redshift:適切なツールの選択
SAA-C03 試験では、Athena と Redshift のどちらを推奨すべきか判断できるようにしておきましょう。管理するインフラストラクチャがなく、S3 に対してアドホックで頻度の低いクエリを実行する場合は Athena を選択します。複雑な JOIN でサブ秒の応答時間が必要な場合、専任の分析チームが数百件の同時クエリを実行する場合、または Redshift Spectrum を使用して S3 データでデータウェアハウスを拡張したい場合は Redshift を選択します。重要な判断材料は、クエリの頻度と複雑さです。
クイックチェック
このレッスンで学んだ AWS Solutions Architect(SAA-C03)の概念について理解度を確認します。
レッスンのまとめ
このレッスンでは、Athena はスキャンしたデータ量に応じて課金されるため、パーティションプルーニングと Parquet 形式が重要なコスト管理手段であること、Athena Federated Query は Lambda コネクタを介して SQL の対象を S3 以外のデータソースに拡張すること、そしてアドホッククエリには Athena が適しており、高同時実行の分析には Redshift が適していることを学びました。次は、リアルタイムのデータストリーミングと分析に使用する Kinesis について学びます。
よくある質問
「Amazon Athena:S3上のサーバーレスSQL」レッスンは無料ですか?
はい。「Amazon Athena:S3上のサーバーレスSQL」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cloud & IT Cert Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cloud & IT Cert Prepコースには全4レッスンが含まれています。
「Amazon Athena:S3上のサーバーレスSQL」で何を学びますか?
Athenaで標準SQLを使ってS3のデータを直接クエリし、ParquetやORCなどの列指向フォーマットで最適化して、コスト管理のためにパーティション分割します。 ブラウザで直接実行するハンズオンコードでCloud & IT Cert Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Cloud & IT Cert Prepを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCloud & IT Cert Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「Amazon Athena:S3上のサーバーレスSQL」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCloud & IT Cert Prepレッスンでコードを書いて実行できますか?
はい。すべてのCloud & IT Cert Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- S3でデータレイクを構築する
- AWS Glue:ETLとデータカタログ
- Amazon Athena:S3上のサーバーレスSQL
- Kinesis Streams、Firehose、リアルタイム分析