【AWSサービス 基礎編】Amazon Athena で S3 上のデータをSQLクエリで分析する

目次

概要

Amazon Athena は、Amazon S3 に保存されたデータを標準的な SQL を使って直接分析できるサーバーレスのクエリサービスです。データベースサーバーの構築やデータのロードといった準備作業が不要で、S3 上のデータに対してすぐにクエリを実行できます。

ログ分析、データ探索、レポート作成など、さまざまなユースケースで活用されています。特に CloudTrail ログや ALB アクセスログなど、S3 に蓄積される AWS サービスのログを分析する場面で頻繁に使用されます。

本記事では、S3 にサンプルデータを配置し、Athena でテーブルを定義してクエリを実行するまでの一連の流れを体験します。

この記事のメリット

  • Amazon Athena の基本的な仕組みとユースケースを理解できる
  • S3 上のデータに対してテーブルを定義し、SQL クエリで分析する手順を習得できる
  • Athena のデータベース・テーブル・クエリ結果の保存先といった基本概念を把握できる
  • サーバーレスでのデータ分析の利便性を体験できる

キャラクター紹介

クラウド資格実践ラボの基礎学習記事では、ルクシーちゃんと代表の土肥が対話形式で AWS 認定試験で必要な知識をハンズオンとともに解説していくブログです。これからこのブログを案内する2人を紹介します。

ルクシーちゃん

クラウド資格に挑戦中の好奇心旺盛なナビゲーター。初学者目線で「これってなんだろう?」と素朴な疑問を投げかけ、知識を引き出していく役どころ。難しい内容も、ルクシーちゃんと一緒なら一歩ずつ理解できると思います!

土肥(とひ)

株式会社Luxyの代表であり同社の元エンジニア。これまでオンプレとAWS環境のインフラを担当。AWS認定資格の学習で得た知識をハンズオンとともに解説するのが得意。直近では新人の教育なども行っており、これから技術を学ぼうという方が納得できるように解説できることに喜びを感じているとのこと。

技術解説

Amazon Athena とは

Luxyちゃん

とひさん、Amazon Athena ってどんなサービスなんですか?

土肥

Athena は、S3 に保存されたデータに対して SQL クエリを実行できるサービスだよ。中身は Apache Presto がベースになっていて、標準 SQL(ANSI SQL)が使えるんだ。

Luxyちゃん

SQL が使えるんですね!でもデータベースサーバーとか用意しなくていいんですか?

土肥

そこが Athena のいいところで、サーバーレスなんだ。インフラの管理は一切不要。S3 にデータを置いておけば、すぐに SQL で分析できるよ。

Luxyちゃん

お金はどのくらいかかるんですか?

土肥

クエリがスキャンしたデータ量に対してだけ課金される仕組みだよ。使わなければお金はかからないし、1TB あたり 5 USD っていうシンプルな料金体系なんだ。

主な特徴

Luxyちゃん

Athena の特徴をもう少し教えてください!

土肥

まとめるとこんな感じだよ。

  • サーバーレス: サーバーのプロビジョニングや管理が不要
  • 標準 SQL 対応: 使い慣れた SQL 構文でクエリを記述可能
  • 多様なデータ形式に対応: CSV、JSON、Parquet、ORC、Avro など
  • S3 との統合: S3 上のデータをそのまま分析でき、データの移動やロードが不要
  • スキャン量課金: クエリがスキャンしたデータ量に対して課金(1TB あたり 5 USD)
Luxyちゃん

CSV とか JSON とかいろんな形式に対応してるんですね。データを別の場所にコピーしなくていいのは楽ですね!

土肥

そうそう。たとえば CloudTrail のログとか ALB のアクセスログって、もともと S3 に保存されるでしょ?それをそのまま Athena で分析できるから、ログ調査にすごく便利なんだ。

基本的な構成要素

Luxyちゃん

Athena を使うときに知っておくべき要素ってありますか?

土肥

いい質問だね!Athena にはいくつかの構成要素があるから、整理しておこう。

要素説明
データソースクエリ対象のデータが格納されている場所(S3 バケット)
データベーステーブルをグループ化する論理的な名前空間
テーブルデータのスキーマ(カラム名、データ型)を定義したメタデータ
クエリ結果の保存先クエリ結果が CSV 形式で出力される S3 バケット
ワークグループクエリの実行環境を管理する単位(アクセス制御やコスト管理に使用)
Luxyちゃん

テーブルは「メタデータ」なんですね。データそのものじゃなくて?

土肥

そう、いいところに気づいたね!Athena のテーブルはデータの「定義」だけを持っていて、実際のデータは S3 に置いたままなんだ。だから「外部テーブル(EXTERNAL TABLE)」って呼ばれるよ。

Athena の構成要素(データソース、データベース、テーブル、クエリ結果保存先)の関係図

データカタログと AWS Glue

Luxyちゃん

テーブルの定義ってどこに保存されるんですか?

土肥

Athena はデフォルトで AWS Glue データカタログをメタデータストアとして使うんだ。作成したデータベースやテーブルの定義は全部 Glue データカタログに保存されるよ。

Luxyちゃん

Glue って名前は聞いたことあります。テーブルを自動で作ってくれる機能もあるんですか?

土肥

Glue クローラーっていう機能を使うと、S3 上のデータを自動スキャンしてスキーマを検出し、テーブルを自動作成できるよ。ただ今回のハンズオンでは、Athena のクエリエディタから CREATE TABLE 文を直接書いてテーブルを定義する方法でやっていくね。まずは基本を押さえよう!

実践

前提条件

  • リージョン: ap-northeast-1(東京)
  • S3 バケットを作成できる IAM 権限があること
  • Athena を操作できる IAM 権限があること

作成するリソース一覧

リソース種別リソース名用途
S3 バケットathena-handson-data-<アカウントID>-ap-norheast-1-an
サンプルデータの格納先
S3 バケットathena-handson-results-<アカウントID>-ap-northeast-1--anクエリ結果の保存先
Athena データベースhandson_dbテーブルを格納するデータベース
Athena テーブルsales_dataサンプルデータのスキーマ定義

S3 バケット名はグローバルで一意にする必要があるため、<アカウントID> の部分をご自身の AWS アカウント ID に置き換えてください。

ステップ1: サンプルデータの準備と S3 へのアップロード

まず、分析対象のサンプルデータを作成し、S3 にアップロードします。

ローカルマシンで以下の内容のファイルを sales_data.csv として保存します。

$ cat sales_data.csv
order_id,product_name,category,quantity,unit_price,order_date
1001,ノートPC,Electronics,2,89000,2024-01-15
1002,マウス,Electronics,5,3500,2024-01-16
1003,デスク,Furniture,1,45000,2024-01-17
1004,チェア,Furniture,3,28000,2024-01-18
1005,モニター,Electronics,2,52000,2024-01-20
1006,キーボード,Electronics,10,8000,2024-01-22
1007,本棚,Furniture,1,35000,2024-01-25
1008,ヘッドセット,Electronics,4,12000,2024-02-01
1009,デスクライト,Furniture,2,6500,2024-02-03
1010,USBハブ,Electronics,8,2500,2024-02-05

ステップ2: データ格納用 S3 バケットの作成とアップロード

  • AWS マネジメントコンソールにログインし、リージョンが ap-northeast-1(東京)であることを確認します
  • 上部の検索バーに S3 と入力し、表示された「S3」を選択します
  • 「バケットを作成」をクリックします
  • 「アカウントリージョナル名前空間(推奨)」にチェックを入れます
  • バケット名に athena-handson-data と入力します
  • リージョンが「アジアパシフィック(東京)ap-northeast-1」であることを確認します
  • その他の項目はデフォルトのままにします
  • 「バケットを作成」をクリックします
データ格納用 S3 バケットの作成画面(バケット名とリージョンが入力された状態)
  • 作成されたバケットをクリックして開きます
  • 「フォルダの作成」をクリックし、フォルダ名に sales と入力して「フォルダの作成」をクリックします
  • sales フォルダを開き、「アップロード」をクリックします
  • 「ファイルを追加」をクリックし、先ほど作成した sales_data.csv を選択します
  • 「アップロード」をクリックします
sales フォルダに sales_data.csv がアップロードされた状態

ステップ3: クエリ結果保存用 S3 バケットの作成

  • S3 コンソールのトップに戻り、「バケットを作成」をクリックします
  • 「アカウントリージョナル名前空間(推奨)」にチェックを入れます
  • バケット名に athena-handson-results と入力します
  • リージョンが「アジアパシフィック(東京)ap-northeast-1」であることを確認します
  • その他の項目はデフォルトのままにします
  • 「バケットを作成」をクリックします

ステップ4: Athena のクエリ結果保存先を設定する

  • 上部の検索バーに Athena と入力し、表示された「Athena」を選択します
  • 「クエリエディタ」をクリックします
  • 上部に「クエリを実行する前に、クエリ結果の場所を Amazon S3 に設定する必要があります」というメッセージが表示されている場合は、「設定を編集」をクリックします。表示されていない場合は、上部タブの「設定」を選択し、「管理」をクリックします
  • 「クエリ結果の場所」に 先程作成した結果保存用のバケットを指定します
  • 「保存」をクリックします
Athena のクエリ結果保存先の設定画面(S3 パスが入力された状態)

ステップ5: データベースの作成

  • 「エディタ」タブを選択します
  • クエリエディタに以下の SQL を入力します
CREATE DATABASE handson_db;
  • 「実行」をクリックします
  • 「クエリは成功しました」と表示されることを確認します
  • 左側パネルの「データベース」ドロップダウンから handson_db を選択します
データベース作成クエリの実行結果と左側パネルでの handson_db の選択

ステップ6: テーブルの作成

  • クエリエディタに以下の SQL を入力します
CREATE EXTERNAL TABLE sales_data (
  order_id INT,
  product_name STRING,
  category STRING,
  quantity INT,
  unit_price INT,
  order_date DATE
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
LOCATION 's3://athena-handson-data-<アカウントID>-ap-northeast-1-an/sales/'
TBLPROPERTIES ('skip.header.line.count'='1');

<アカウントID> をご自身のアカウント ID に置き換えてください。skip.header.line.count プロパティにより、CSV のヘッダー行がスキップされます。

  • 「実行」をクリックします
  • 「クエリは成功しました」と表示されることを確認します
  • 左側パネルの「テーブル」に sales_data が表示されます
テーブル作成クエリの実行結果と左側パネルでの sales_data テーブルの表示

ステップ7: データの確認クエリを実行する

テーブルに対してクエリを実行し、データを確認します。

  • クエリエディタに以下の SQL を入力し、「実行」をクリックします
SELECT * FROM sales_data LIMIT 5;
  • 結果タブにデータが表示されることを確認します
SELECT クエリの実行結果(5 件のデータが表形式で表示されている状態)

ステップ8: 集計クエリを実行する

カテゴリごとの売上合計を集計してみます。

  • クエリエディタに以下の SQL を入力し、「実行」をクリックします
SELECT
  category,
  COUNT(*) AS order_count,
  SUM(quantity * unit_price) AS total_sales
FROM sales_data
GROUP BY category
ORDER BY total_sales DESC;
  • 結果タブにカテゴリ別の注文件数と売上合計が表示されます
カテゴリ別集計クエリの実行結果

ステップ9: 条件付きクエリを実行する

特定の条件でデータを絞り込んでみます。

  • クエリエディタに以下の SQL を入力し、「実行」をクリックします
SELECT
  order_id,
  product_name,
  quantity,
  unit_price,
  quantity * unit_price AS total_amount
FROM sales_data
WHERE category = 'Electronics'
  AND quantity * unit_price >= 20000
ORDER BY total_amount DESC;
  • Electronics カテゴリで合計金額が 20,000 円以上の注文が表示されます
条件付きクエリの実行結果

まとめ

  • Amazon Athena は S3 上のデータに対して SQL クエリを実行できるサーバーレスのクエリサービスです
  • サーバーの構築やデータのロードが不要で、S3 にデータを配置するだけですぐに分析を開始できます
  • CREATE DATABASE でデータベースを作成し、CREATE EXTERNAL TABLE でテーブルのスキーマと S3 上のデータの場所を定義します
  • 標準 SQL(SELECT、WHERE、GROUP BY、ORDER BY など)を使って柔軟にデータを分析できます
  • クエリ結果は指定した S3 バケットに CSV 形式で自動保存されます
  • CloudTrail ログや ALB ログなど、S3 に蓄積される各種ログの分析に広く活用されています

参照先

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

株式会社Luxy(https://luxy-inc.com)の代表取締役.

2018年〜インフラエンジニアとしてキャリアをスタートし、オンプレミスのネットワーク・サーバ環境で3年半、クラウド環境で4年半の8年間エンジニアとして従事。
2021年に佐藤氏の創業した会社を引き継ぎ、代表に就任。

目次