AWS

AthenaをつかってS3リソース直接操作してみる

NEW 2026年8月24日

目次Category


はじめに

今回AWS技術研修内で行った、Amazon S3とAmazon Athenaを使ったCSVデータの検索・集計・売上分析についてまとめます。

主な作業内容は以下のとおりです。

  1. CSVファイルをAmazon S3へ保存する

  2. Amazon AthenaからS3上のCSVをテーブルとして参照する

  3. SQLを使って検索・集計する

  4. 月別・カテゴリ別・地域別・商品別に売上を分析する

Amazon Athenaは、S3に保存されたCSVやログなどのデータに対してSQLを実行できるサービスです。通常のデータベースのようにサーバーを構築したり、あらかじめデータを別のDBへ取り込んだりせず、必要なときにS3上のデータを分析できます。

※ 記事内の [name] は自分の名前に置き換え、角括弧も削除してください。例:ojt-athena-yoshida-01
※ S3とAthenaは同じリージョンを使用してください。

今回の構成

今回の構成

今回のハンズオンでは、S3に保存したCSVをAthenaから参照し、SQLの実行結果もS3へ保存します。

CSVファイル
   ↓
Amazon S3
   ↓
Amazon Athena
   ↓
SQLで検索・集計・分析
   ↓
クエリ実行結果をS3へ保存

最終的なS3の構成は次のようになります。

ojt-athena-[name]-01
└── athena-handson
    ├── data
    │   ├── sales.csv
    │   └── sales_additional.csv
    ├── analysis-data
    │   └── sales_analysis.csv
    └── results
        └── Athenaのクエリ実行結果

1. S3に分析データを準備する

Amazon S3の役割

Amazon S3の役割

今回の構成では、S3を分析対象データとAthenaのクエリ実行結果の保存先として使用します。

data には基本操作用CSV、analysis-data には売上分析用CSV、results にはAthenaのクエリ実行結果を保存します。

1-1. S3バケットとフォルダを作成する

1-1. S3バケットとフォルダを作成する

Amazon S3を開き、次のバケットを作成します。

ojt-athena-[name]-01

バケット内に次のフォルダを作成します。

athena-handson/data/
athena-handson/analysis-data/
athena-handson/results/

1-2. 基本操作用CSVを用意する

1-2. 基本操作用CSVを用意する

基本操作で使用する sales.csv を作成します。

sales.csv
sale_id,product_name,category,price,quantity
1,ノートPC,PC,120000,1
2,マウス,周辺機器,3000,2
3,キーボード,周辺機器,8000,1
4,モニター,周辺機器,35000,2
5,ノートPC,PC,150000,1
6,USBメモリ,周辺機器,2000,3

1-3. sales.csvをS3へアップロードする

1-3. sales.csvをS3へアップロードする

sales.csv を次のフォルダへアップロードします。

s3://ojt-athena-[name]-01/athena-handson/data/

アップロード後のS3 URIは次のようになります。

s3://ojt-athena-[name]-01/athena-handson/data/sales.csv

2. Athenaで基本操作を行う

Amazon Athenaの概要

Amazon Athenaの概要

Amazon Athenaは、S3上のデータに対してSQLを実行して分析できるサービスです。

この章では、クエリ結果の保存先設定、データベースとテーブルの作成、検索・集計、CSV追加時の動作確認を行います。

2-1. Athenaのクエリ結果保存先を設定する

2-1. Athenaのクエリ結果保存先を設定する

Amazon Athenaのクエリエディタを開き、次の手順で結果保存先を設定します。

  1. 右上のワークグループが primary であることを確認する
  2. 「クエリ設定」タブを開く
  3. 「管理」ボタンを押す
  4. 「Location of query result」に保存先を入力する
  5. 保存する
s3://ojt-athena-[name]-01/athena-handson/results/

2-2. データベースを作成する

2-2. データベースを作成する

Athenaのクエリエディタで次のSQLを実行します。

SQL
CREATE DATABASE IF NOT EXISTS athena_handson_[name];

作成後、クエリエディタ左側のデータベース選択欄から athena_handson_[name]を選択します。

2-3. 基本操作用テーブルを作成する

2-3. 基本操作用テーブルを作成する

既存テーブルがある場合に備えて削除したあと、S3上のCSVを参照する外部テーブルを作成します。

SQL
DROP TABLE IF EXISTS sales;

CREATE EXTERNAL TABLE sales (
    sale_id INT,
    product_name STRING,
    category STRING,
    price INT,
    quantity INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION 's3://ojt-athena-[name]-01/athena-handson/data/'
TBLPROPERTIES (
    'skip.header.line.count' = '1'
);

LOCATION にはCSVファイル名ではなく、CSVが保存されているフォルダまでを指定します。

2-4. SQLで検索・集計する

2-4. SQLで検索・集計する
データ件数を確認する
SQL
SELECT
    COUNT(*) AS row_count
FROM sales;

想定結果:

6
全データを表示する
SQL
SELECT
    sale_id,
    product_name,
    category,
    price,
    quantity
FROM sales
ORDER BY sale_id;
1万円以上の商品を検索する
SQL
SELECT
    sale_id,
    product_name,
    category,
    price,
    quantity
FROM sales
WHERE price >= 10000
ORDER BY price DESC;

想定される商品は、ノートPC2件とモニター1件です。

カテゴリごとの売上を集計する
SQL
SELECT
    category,
    SUM(quantity) AS total_quantity,
    SUM(price * quantity) AS total_sales
FROM sales
GROUP BY category
ORDER BY total_sales DESC;

想定結果:

category | total_quantity | total_sales
PC       | 2              | 270000
周辺機器 | 8              | 90000

2-5. 2つ目のCSVを追加して確認する

2-5. 2つ目のCSVを追加して確認する

同じ列構成の sales_additional.csv を作成します。

sales_additional.csv
sale_id,product_name,category,price,quantity
7,Webカメラ,周辺機器,7000,2
8,デスクトップPC,PC,200000,1
9,ヘッドセット,周辺機器,12000,1

作成したCSVを、sales.csvと同じフォルダへアップロードします。

s3://ojt-athena-[name]-01/athena-handson/data/

テーブルを作り直さず、件数確認のSQLを再実行します。

SQL
SELECT
    COUNT(*) AS row_count
FROM sales;

想定結果:

9

ここで確認できること

ポイント!

Athenaは、テーブルの LOCATION に指定したフォルダ内のファイルを読み取ります。

そのため、同じ列構成のCSVを同じフォルダへ追加すると、追加したファイルも検索対象になります。

3. Athenaで売上データを分析する

ここからは日付と地域を追加したCSVを使い、月別・カテゴリ別・地域別・商品別に売上を分析します。

3-1. 分析用CSVを用意する

3-1. 分析用CSVを用意する

分析用の sales_analysis.csv を作成します。

sales_analysis.csv
sale_date,sale_id,region,product_name,category,price,quantity
2026-01-05,101,東京,ノートPC,PC,120000,1
2026-01-12,102,大阪,マウス,周辺機器,3000,3
2026-01-20,103,東京,モニター,周辺機器,35000,2
2026-01-27,104,大阪,キーボード,周辺機器,8000,2
2026-02-03,105,東京,ノートPC,PC,130000,2
2026-02-10,106,大阪,USBメモリ,周辺機器,2000,5
2026-02-18,107,東京,Webカメラ,周辺機器,7000,3
2026-02-25,108,大阪,デスクトップPC,PC,200000,1
2026-03-04,109,東京,ヘッドセット,周辺機器,12000,2
2026-03-11,110,大阪,ノートPC,PC,125000,1
2026-03-19,111,東京,モニター,周辺機器,35000,1
2026-03-26,112,大阪,デスクトップPC,PC,210000,2

3-2. 分析用CSVをS3へアップロードする

3-2. 分析用CSVをS3へアップロードする

sales_analysis.csvを次のフォルダへアップロードします。

s3://ojt-athena-[name]-01/athena-handson/analysis-data/

sales.csvsales_analysis.csv は列構成が異なるため、同じ data フォルダには保存せず、別フォルダに分けます。

3-3. 分析用テーブルを作成する

3-3. 分析用テーブルを作成する

分析用CSVを参照する sales_analysis テーブルを作成します。

SQL
DROP TABLE IF EXISTS sales_analysis;

CREATE EXTERNAL TABLE sales_analysis (
    sale_date DATE,
    sale_id INT,
    region STRING,
    product_name STRING,
    category STRING,
    price INT,
    quantity INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION 's3://ojt-athena-[name]-01/athena-handson/analysis-data/'
TBLPROPERTIES (
    'skip.header.line.count' = '1'
);

件数を確認します。

SQL
SELECT
    COUNT(*) AS row_count
FROM sales_analysis;

想定結果:

12

3-4. 月別の売上推移を分析する

3-4. 月別の売上推移を分析する
SQL
SELECT
    YEAR(sale_date) AS sales_year,
    MONTH(sale_date) AS sales_month,
    SUM(quantity) AS total_quantity,
    SUM(price * quantity) AS total_sales
FROM sales_analysis
GROUP BY
    YEAR(sale_date),
    MONTH(sale_date)
ORDER BY
    sales_year,
    sales_month;

想定結果:

sales_year | sales_month | total_quantity | total_sales
2026       | 1           | 8              | 215000
2026       | 2           | 11             | 491000
2026       | 3           | 6              | 604000

読み取れること: 1月から3月にかけて売上が増加しています。ただし、この結果だけで売上増加の原因までは断定できません。

3-5. カテゴリ別の売上を分析する

3-5. カテゴリ別の売上を分析する
SQL
SELECT
    category,
    SUM(quantity) AS total_quantity,
    SUM(price * quantity) AS total_sales
FROM sales_analysis
GROUP BY category
ORDER BY total_sales DESC;

想定結果:

category | total_quantity | total_sales
PC       | 7              | 1125000
周辺機器 | 18             | 185000

読み取れること: 販売数量は周辺機器の方が多い一方、売上金額はPCの方が大きく、単価の高い商品が全体売上に大きく影響しています。

3-6. 地域別の売上を分析する

3-6. 地域別の売上を分析する
SQL
SELECT
    region,
    COUNT(*) AS record_count,
    SUM(quantity) AS total_quantity,
    SUM(price * quantity) AS total_sales
FROM sales_analysis
GROUP BY region
ORDER BY total_sales DESC;

想定結果:

region | record_count | total_quantity | total_sales
大阪   | 6            | 14             | 780000
東京   | 6            | 11             | 530000

読み取れること: 大阪の売上は東京より250,000円高くなっています。ただし「大阪だから売上が高い」とは断定できません。大阪では単価の高いデスクトップPCが販売されており、商品構成が売上差に影響している可能性があります。

3-7. 商品別売上ランキングを作成する

3-7. 商品別売上ランキングを作成する
SQL
SELECT
    product_name,
    SUM(quantity) AS total_quantity,
    SUM(price * quantity) AS total_sales,
    RANK() OVER (
        ORDER BY SUM(price * quantity) DESC
    ) AS sales_rank
FROM sales_analysis
GROUP BY product_name
ORDER BY sales_rank;

想定結果:

product_name   | total_quantity | total_sales | sales_rank
デスクトップPC | 3              | 620000      | 1
ノートPC       | 4              | 505000      | 2
モニター       | 3              | 105000      | 3
ヘッドセット   | 2              | 24000       | 4
Webカメラ      | 3              | 21000       | 5
キーボード     | 2              | 16000       | 6
USBメモリ      | 5              | 10000       | 7
マウス         | 3              | 9000        | 8

読み取れること: 最も売上が高い商品はデスクトップPCで、次にノートPCが続きます。

3-8. 分析結果から分かること・分からないこと

3-8. 分析結果から分かること・分からないこと

SQLで確認できるのは「登録されたデータ内の事実」

SQLで確認できるのは登録されたデータ内の事実

今回のSQLからは、月別・カテゴリ別・地域別・商品別の売上差を確認できます。

一方で、「大阪だから売上が高い」「3月だから売上が増えた」といった原因までは、今回の利用データだけでは断定できません。

原因を調べるには、キャンペーンの有無、在庫数、値引き、原価と利益率、顧客数、アクセス数などの追加データが必要になります。

4. 後片付け

ハンズオン終了後、不要であればAthenaのテーブルとデータベースを削除します。

SQL
DROP TABLE IF EXISTS sales;
DROP TABLE IF EXISTS sales_analysis;

DROP DATABASE IF EXISTS athena_handson_[name];

S3上のデータも不要であれば、次の配下を削除します。

s3://ojt-athena-[name]-01/athena-handson/data/
s3://ojt-athena-[name]-01/athena-handson/analysis-data/
s3://ojt-athena-[name]-01/athena-handson/results/

※ S3バケットを削除する場合は、先にバケット内のオブジェクトを削除して空の状態にします。
先にオブジェクトを削除しないとバケット自体の削除が行えません。

まとめ

今回のハンズオンでは、Amazon S3に保存したCSVファイルをAmazon Athenaから参照し、SQLを使って検索・集計・売上分析を行いました。

今回のポイントは、Athenaがデータを別のデータベースへ移さず、S3上のファイルをそのままSQLで分析できることです。

また、集計結果から「何が起きているか」は確認できますが、「なぜ起きたか」を判断するには追加データが必要になることも確認できました。

実際の利用パターンとしては、購入履歴や、サイトのアクセスログなどをCSVファイルに蓄積し、それをAthenaで分析して傾向をつかむなどの用途として利用します。(簡単なものだとALBの設定でログの集積が可能)

参考にした記事

今回のハンズオンを作成するにあたり、以下の記事・ドキュメントを参考にしました。

DevelopersIO

DevelopersIO

【初心者向け】AthenaからクエリしてS3上のデータを取得してみた

S3に保存したデータをAmazon Athenaから参照し、テーブル作成やSQLによるデータ取得を行う流れを確認する際に参考にしました。


【初心者向け】Application Load Balancerのアクセスログを、Amazon Athenaで色々なクエリを実行し分析してみた

Application Load BalancerのアクセスログをS3へ保存し、Athenaを使って分析する例が紹介されています。 Athenaの具体的な業務利用をイメージする際にも参考になります。

AWS公式ドキュメント

AWS公式ドキュメント

Getting started with Amazon Athena

Amazon Athenaでデータベースやテーブルを作成し、S3上のデータに対してクエリを実行する基本的な流れを確認する際に参考にしました。

この記事を書いた人

義田蓮巨

reo_yoshida

義田蓮巨