AWS Glue のクローラーでデータカタログを作り Athena で引く
記事の「実践」を 1 項目ずつ進めるためのページです。AWS マネジメントコンソールで操作したら、右の一覧にチェックを入れてください。チェックはこのブラウザに保存されます。
前提条件
- リージョン:
ap-northeast-1(東京) - AWS マネジメントコンソールにログイン済みで、S3・AWS Glue・Athena を操作できる権限があること
- クローラー用の IAM ロールをコンソールから作成するため、IAM ロールとポリシーを作成できる権限(
iam:CreateRole、iam:CreatePolicy、iam:AttachRolePolicy)があること
AWS Glue のコンソールは、言語設定を日本語にしていても英語で表示されることがあります。本記事の Glue の手順は、画面の英語表記のまま記載しています。
作成するリソース一覧
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| S3 バケット | glue-handson-data-<アカウントID> | CSV データの格納先 |
| S3 バケット | glue-handson-athena-results-<アカウントID> | Athena のクエリ結果の保存先 |
| Glue データベース | glue_handson_db | クローラーが作るテーブルの登録先 |
| IAM ロール | AWSGlueServiceRole-glue-handson | クローラーが S3 を読み、データカタログに書き込むためのロール |
| Glue クローラー | orders-crawler | orders/ フォルダの CSV をクロールする |
| Glue テーブル | orders(クローラーが自動作成) | CSV のスキーマ定義 |
> S3 バケット名はグローバルで一意にする必要があるため、<アカウントID> の部分をご自身の AWS アカウント ID に置き換えてください。
サンプルデータを用意する
ローカルマシンで、以下の内容を orders_2026_04.csv として保存します。数値の列を含めておくと、クローラーが 1 行目をヘッダーと判定しやすくなります。
order_id,order_date,store,product,quantity,unit_price
1001,2026-04-01,tokyo,banana,12,150
1002,2026-04-01,osaka,apple,5,220
1003,2026-04-02,tokyo,orange,8,180
1004,2026-04-03,fukuoka,banana,20,150
1005,2026-04-03,osaka,banana,7,150
1006,2026-04-04,tokyo,apple,3,220
1007,2026-04-05,fukuoka,orange,10,180
1008,2026-04-05,tokyo,banana,15,150
あわせて、後半で追加するファイルとして、以下の内容を orders_2026_05.csv として保存しておきます。
order_id,order_date,store,product,quantity,unit_price
1009,2026-05-01,osaka,orange,6,180
1010,2026-05-02,tokyo,banana,25,150
1011,2026-05-02,fukuoka,apple,4,220
S3 バケットを作成して CSV をアップロードする
- AWS マネジメントコンソールにログインし、リージョンが
ap-northeast-1(東京)であることを確認します - 上部の検索バーに
S3と入力し、表示された「S3」を選択します - 左側ナビゲーションの「汎用バケット」を選択し、「バケットを作成」をクリックします
- バケット名に
glue-handson-data-<アカウントID>と入力します - その他の項目はデフォルトのままにし、ページ下部の「バケットを作成」をクリックします
- 同じ手順で、クエリ結果の保存先として
glue-handson-athena-results-<アカウントID>も作成します - バケット一覧から
glue-handson-data-<アカウントID>をクリックして開きます - 「フォルダの作成」をクリックし、フォルダ名に
ordersと入力して「フォルダの作成」をクリックします ordersフォルダを開き、「アップロード」をクリックします- 「ファイルを追加」をクリックして
orders_2026_04.csvを選択し、「アップロード」をクリックします
orders/ フォルダに orders_2026_04.csv が表示されればアップロード完了です。orders_2026_05.csv はこの時点ではアップロードしません。
Glue のデータベースを作成する
- 上部の検索バーに
Glueと入力し、表示された「AWS Glue」を選択します - 左側ナビゲーションの「Data Catalog」を展開し、「Databases」を選択します
- 「Add database」をクリックします
- 名前(Name)に
glue_handson_dbと入力します - その他の項目はデフォルトのままにし、「Create database」をクリックします
データベース一覧に glue_handson_db が表示されることを確認します。
クローラーを作成する
- 左側ナビゲーションの「Data Catalog」を展開し、「Crawlers」を選択します
- 「Create crawler」をクリックします
- 「Step 1: Set crawler properties」で、名前(Name)に
orders-crawlerと入力し、「Next」をクリックします - 「Step 2: Choose data sources and classifiers」の「Data source configuration」で、「Is your data already mapped to Glue tables?」に「Not yet」が選択されていることを確認します(デフォルトです)
- 「Add a data source」をクリックし、表示されたダイアログで以下を設定します
- Data source:
S3(デフォルト) - Location of S3 data:
In this account(デフォルト) - S3 path:
s3://glue-handson-data-<アカウントID>/orders/(「Browse S3」からordersフォルダを選んでも構いません) - Subsequent crawler runs:
Crawl all sub-folders(デフォルト)
- Data source:
- 「Add an S3 data source」をクリックします
- 「Data sources」の一覧に S3 パスが追加されたことを確認し、「Next」をクリックします
s3://glue-handson-data-<アカウントID>/orders/ が追加された状態- 「Step 3: Configure security settings」の「IAM role」で、「Create new IAM role」をクリックします
- 表示されたダイアログのロール名の入力欄には
AWSGlueServiceRole-が入っています。その続きにglue-handsonを入力してAWSGlueServiceRole-glue-handsonにし、「Create」をクリックします - 「Existing IAM role」に
AWSGlueServiceRole-glue-handsonが選択されたことを確認し、「Next」をクリックします
コンソールから作成したロールには、AWS 管理ポリシー AWSGlueServiceRole と、指定した S3 パスを読み取るためのカスタマー管理ポリシー(AWSGlueServiceRole-glue-handson-<英数字>-s3Policy)が付与されます。
AWSGlueServiceRole-glue-handson が選択された状態- 「Step 4: Set output and scheduling」で以下を設定します
- Target database:
glue_handson_db - Crawler schedule の Frequency:
On demand(デフォルト)
- Target database:
- その他の項目はデフォルトのままにし、「Next」をクリックします
- 「Step 5: Review and create」で設定内容を確認し、「Create crawler」をクリックします
クローラーを実行する
- 作成したクローラー
orders-crawlerの詳細画面で、右上の「Run crawler」をクリックします - 下部の「Crawler runs」タブで、Status が「Completed」になるまで待ちます(今回は 1 分弱でした。画面右上の更新アイコンで表示を更新できます)
- 実行結果の「Table changes」に「1 table change, 0 partition changes」と表示され、テーブルが 1 つ追加されたことを確認します
データカタログでスキーマを確認する
- 左側ナビゲーションの「Data Catalog」を展開し、「Tables」を選択します
- テーブル一覧に
ordersが表示されていることを確認し、ordersをクリックします - 「Table details」で、Database が
glue_handson_db、Location がs3://glue-handson-data-<アカウントID>/orders/、Classification がCSVになっていることを確認します - 下部の「Schema」タブで、CSV の 1 行目の列名(
order_id、order_date、store、product、quantity、unit_price)が列名として登録され、それぞれにデータ型が推測されていることを確認します(今回はorder_id・quantity・unit_priceがbigint、order_date・store・productがstringでした。order_dateは日付に見えますが、date型ではなくstringになります)
テーブル名は、クロール対象にしたフォルダ名 orders から付けられています。列名が col0、col1 のようになっている場合は、1 行目がヘッダーとして判定されていません。CSV の内容を見直してください。
Athena のクエリ結果の保存先を設定する
- 上部の検索バーに
Athenaと入力し、表示された「Athena」を選択します - 初回アクセス時は「クエリエディタを起動」をクリックします
- 上部の「クエリ設定」タブを選択し、「クエリ結果の暗号化」の右にある「管理」をクリックします
- 「クエリ結果の場所」に
s3://glue-handson-athena-results-<アカウントID>/と入力します(「S3 を参照」からバケットを選んでも構いません) - その他の項目はデフォルトのままにし、「保存」をクリックします
s3://glue-handson-athena-results-<アカウントID>/ が入力された状態Athena でクエリする
- 上部の「エディタ」タブを選択します
- 左側パネルの「データソース」が
AwsDataCatalog、「データベース」がglue_handson_dbになっていることを確認します(違う場合はドロップダウンから選択します) - 「テーブル」に
ordersが表示されていることを確認します
Athena 側で CREATE TABLE を書いていないのに、クローラーが登録したテーブルがそのまま見えています。
- クエリエディタに以下の SQL を入力し、「実行」をクリックします(2 回目以降は同じボタンが「もう一度実行する」と表示されます)
SELECT * FROM orders LIMIT 10;
- 結果タブに 8 件のデータが表示され、1 行目のヘッダーがデータとして混ざっていないことを確認します
続けて、店舗別の売上を集計します。
- クエリエディタに以下の SQL を入力し、「実行」をクリックします
SELECT
store,
COUNT(*) AS order_count,
SUM(quantity * unit_price) AS total_sales
FROM orders
GROUP BY store
ORDER BY total_sales DESC;
- 結果タブに店舗ごとの注文件数と売上合計が表示されることを確認します
- 「クエリ結果」タブの上部に表示される「スキャンしたデータ」で、このクエリが読み取ったデータ量を確認します
Athena の料金は、クエリがスキャンしたデータ量に応じて決まります。スキャン量はメガバイト単位に切り上げられ、1 クエリあたり最小 10 MB として計算されます。なお、CREATE TABLE などの DDL や失敗したクエリには課金されません。
ファイルを追加して再度クエリする
データカタログのテーブルは「orders/ フォルダのデータ」を指しているため、同じ形式のファイルを同じフォルダに追加すれば、クローラーを再実行しなくても Athena の結果に反映されます。
- S3 コンソールで
glue-handson-data-<アカウントID>のordersフォルダを開き、「アップロード」からorders_2026_05.csvをアップロードします - Athena のクエリエディタに戻り、以下の SQL を入力して「実行」(または「もう一度実行する」)をクリックします
SELECT
substr(CAST(order_date AS varchar), 1, 7) AS order_month,
COUNT(*) AS order_count
FROM orders
GROUP BY 1
ORDER BY 1;
- 結果タブに
2026-04が 8 件、2026-05が 3 件と表示され、追加したファイルの行も集計されていることを確認します
列を増やすなどスキーマが変わる場合や、パーティション(year=2026/ のようなフォルダ分け)を新しく追加した場合は、クローラーを再実行してデータカタログを更新します。