1. はじめに
企業が持つデータを効果的に活用するために、データ分析基盤の構築は欠かせません。AWSでは複数のマネージドサービスを組み合わせることで、スケーラブルで費用対効果の高い分析基盤を構築できます。
本記事では、AWSの分析サービスを使った最もオーソドックスな構成での分析基盤構築手順を詳しく解説します。
2. 分析基盤のアーキテクチャ概要
基本構成図
[データソース] → [S3] → [AWS Glue] → [Amazon Athena] → [Amazon QuickSight]
↓ ↓ ↓ ↓ ↓
RDS/DynamoDB データレイク ETL処理 SQLクエリ 可視化・ダッシュボード
ログファイル
外部API
各コンポーネントの役割
- Amazon S3: データレイクとして大量データを安価に保存
- AWS Glue: データカタログ管理とETL処理
- Amazon Athena: S3上のデータをSQLで分析
- Amazon QuickSight: ビジネスインテリジェンス・可視化ツール
3. 前提条件
- AWSアカウントの準備
- IAM権限の設定(各サービスへのアクセス権限)
- 分析対象となるデータの準備
4. 手順1: Amazon S3でデータレイクを構築
S3バケットの作成
# AWS CLI使用例
aws s3 mb s3://your-analytics-datalake-bucket --region ap-northeast-1
フォルダ構造の設計
your-analytics-datalake-bucket/
├── raw-data/ # 生データ
│ ├── sales/
│ ├── customers/
│ └── products/
├── processed-data/ # 加工後データ
│ ├── sales/
│ └── customers/
└── query-results/ # Athenaクエリ結果
データのアップロード
# CSVファイルのアップロード例
aws s3 cp sales_data.csv s3://your-analytics-datalake-bucket/raw-data/sales/
5. 手順2: AWS Glueでデータカタログとクローラーの設定
Glueデータベースの作成
- AWS Glueコンソールにアクセス
- 「データベース」から「データベースの追加」をクリック
- データベース名:
analytics_database
を入力
クローラーの作成
# AWS CLI例:クローラーの作成
aws glue create-crawler \
--name sales-data-crawler \
--role AWSGlueServiceRole-analytics \
--database-name analytics_database \
--targets '{"S3Targets":[{"Path":"s3://your-analytics-datalake-bucket/raw-data/sales/"}]}'
クローラーの実行
# クローラーの実行
aws glue start-crawler --name sales-data-crawler
6. 手順3: ETL処理の作成
Glue ETLジョブの作成
# Glue ETLジョブのサンプルコード
import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
args = getResolvedOptions(sys.argv, ['JOB_NAME'])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)
# データソースの読み込み
datasource0 = glueContext.create_dynamic_frame.from_catalog(
database = "analytics_database",
table_name = "raw_data_sales"
)
# データ変換処理
applymapping1 = ApplyMapping.apply(
frame = datasource0,
mappings = [
("sale_id", "string", "sale_id", "string"),
("customer_id", "string", "customer_id", "string"),
("amount", "double", "amount", "double"),
("sale_date", "string", "sale_date", "timestamp")
]
)
# 結果をS3に保存
datasink2 = glueContext.write_dynamic_frame.from_options(
frame = applymapping1,
connection_type = "s3",
connection_options = {
"path": "s3://your-analytics-datalake-bucket/processed-data/sales/"
},
format = "parquet"
)
job.commit()
7. 手順4: 加工後データのカタログ登録
加工後データ用クローラーの作成
ETL処理で生成されたParquetファイルをAthenaでクエリするため、加工後データ用のクローラーを作成します。
# 加工後データ用のクローラーを作成
aws glue create-crawler \
--name processed-data-crawler \
--role AWSGlueServiceRole-analytics \
--database-name analytics_database \
--targets '{"S3Targets":[{"Path":"s3://your-analytics-datalake-bucket/processed-data/sales/"}]}'
加工後データクローラーの実行
# クローラーの実行
aws glue start-crawler --name processed-data-crawler
# クローラー実行状況の確認
aws glue get-crawler --name processed-data-crawler
8. 手順5: Amazon Athenaでクエリ環境の構築
Athenaの初期設定
- Athenaコンソールにアクセス
- クエリ結果の保存場所を設定:
s3://your-analytics-datalake-bucket/query-results/
テーブル存在確認
ビューを作成する前に、加工後データのテーブルがData Catalogに正しく登録されているか確認します。
-- データベース内のテーブル一覧を確認
SHOW TABLES IN analytics_database;
-- 加工後データテーブルの構造確認
DESCRIBE analytics_database.processed_data_sales;
-- データの存在確認
SELECT COUNT(*) FROM analytics_database.processed_data_sales LIMIT 10;
注意: もし processed_data_sales
テーブルが存在しない場合は、以下を確認してください:
- ETLジョブが正常に完了しているか
- 加工後データ用クローラー(processed-data-crawler)が実行済みか
- S3の加工後データフォルダにParquetファイルが出力されているか
# S3の加工後データ確認
aws s3 ls s3://your-analytics-datalake-bucket/processed-data/sales/ --recursive
# クローラーの再実行(必要に応じて)
aws glue start-crawler --name processed-data-crawler
サンプルクエリの実行
-- 売上データの基本分析
SELECT
DATE_FORMAT(sale_date, '%Y-%m') as month,
COUNT(*) as transaction_count,
SUM(amount) as total_sales,
AVG(amount) as avg_sale_amount
FROM analytics_database.processed_data_sales
WHERE sale_date >= DATE('2024-01-01')
GROUP BY DATE_FORMAT(sale_date, '%Y-%m')
ORDER BY month;
ビューの作成
テーブルの存在確認完了後、分析用ビューを作成します。
-- 月次売上サマリビューの作成
CREATE VIEW monthly_sales_summary AS
SELECT
DATE_FORMAT(sale_date, '%Y-%m') as month,
COUNT(*) as transaction_count,
SUM(amount) as total_sales,
AVG(amount) as avg_sale_amount
FROM analytics_database.processed_data_sales
GROUP BY DATE_FORMAT(sale_date, '%Y-%m');
9. 手順6: Amazon QuickSightでダッシュボード作成
QuickSightの初期設定
- QuickSightコンソールにアクセス
- アカウントの作成(Standard Edition推奨)
- S3およびAthenaへのアクセス権限を付与
データセットの作成
- 「データセット」→「新しいデータセット」
- データソース: 「Athena」を選択
- データベース:
analytics_database
- テーブル:
monthly_sales_summary
ダッシュボードの作成
推奨ビジュアル構成:
├── 月次売上推移(線グラフ)
├── 売上TOP10商品(棒グラフ)
├── 地域別売上分析(地図)
└── KPI指標(数値カード)
10. 運用とモニタリング
CloudWatchでのモニタリング設定
# Glueジョブの実行状況監視
aws logs create-log-group --log-group-name /aws/glue/jobs/sales-etl-job
自動化の設定
# EventBridgeでスケジュール実行
aws events put-rule \
--name daily-etl-schedule \
--schedule-expression "cron(0 2 * * ? *)" \
--state ENABLED
11. セキュリティとコスト最適化
IAMロールの設定
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::your-analytics-datalake-bucket/*"
},
{
"Effect": "Allow",
"Action": [
"glue:GetTable",
"glue:GetPartitions"
],
"Resource": "*"
}
]
}
コスト最適化のポイント
- S3: Intelligent Tieringの活用
- Glue: DPU(Data Processing Unit)の最適化
- Athena: パーティション分割によるスキャン量削減
- QuickSight: 必要最小限のユーザー数での運用
12. トラブルシューティング
よくある問題と解決方法
Glueクローラーがテーブルを認識しない
# データ形式の確認
aws s3 ls s3://your-analytics-datalake-bucket/raw-data/sales/ --recursive
Athenaクエリが遅い
-- パーティション追加
ALTER TABLE analytics_database.sales_data
ADD PARTITION (year='2024', month='01')
LOCATION 's3://your-analytics-datalake-bucket/processed-data/sales/year=2024/month=01/';
13. まとめ
本記事で紹介した構成は、AWSにおける分析基盤の基本パターンです。
構築完了後の利点
- スケーラビリティ: データ量の増加に柔軟に対応
- コスト効率: 従量課金制でのコスト最適化
- 保守性: マネージドサービスによる運用負荷軽減
- 拡張性: 新しいデータソースの追加が容易
次のステップ
- リアルタイム分析: Amazon Kinesis Analyticsの導入
- 機械学習: Amazon SageMakerとの連携
- データガバナンス: AWS Lake Formationの活用
このオーソドックスな構成をベースに、組織の要件に合わせてカスタマイズしていくことで、効果的なデータ分析基盤を構築できます。
コメント