🍄
Redis + Lambda(Python) + Docker Composeで実現する日次バッチ処理システム
🚀 背景・モチベーション
SAA(AWS認定ソリューションアーキテクトアソシエイト)を勉強している中で、「自分でAWSのサービスを組み合わせて何か作ってみたい」と思い、実際に手を動かしてみることにしました。
題材として選んだのは、広告システムのクリックログ集計です。
「Redisのカウンターでクリック数を記録し、日次でLambda(Python)バッチを動かしてCTR(クリック率)を計測・集計する」という仕組みを構築してみました。
マーケティングや広告分野の経験はありません。
そのため、マーケティング的な観点や指標の捉え方が本職の方とは異なる部分もあるかもしれませんが、「AWSサービスを組み合わせてバッチ処理を自動化する」という技術的なチャレンジを主眼に置いています。
📋 要件・制約
単純にこの構成でやってみたかっただけです
技術要件
- 広告のクリックログをRedisに蓄積
- Lambda日次バッチでログを集計してPostgreに蓄積
- Redisのデータは日次バッチ完了時に削除
制約条件
- レスポンスを早く→本体から切り離してAPI Gateway + Redisで集計
- 管理画面のレスポンスも落としたくない→夜間日次バッチで集積してPostgreに登録
🏗️ 設計方針・アーキテクチャ
システム構成
データフロー
- API Gateway: クリックイベントをRedisハッシュに記録
-
Redis: 日次キー(
clicklog_keys:YYYYMMDD
)でハッシュ形式でデータ保存 - Lambda: 日次バッチでRedisからデータ取得・集計
-
PostgreSQL: 集計結果を
advertisement_analytics
テーブルに保存
技術選定理由
- Redis: 高速なインメモリ処理とハッシュ形式での効率的なデータ管理
- Lambda: サーバーレスでスケーラブルなバッチ処理
- Python: 個人の好み
🔧 実装のポイント・工夫
1. Redisハッシュ形式でのデータ管理
# 効率的なデータ構造
key = f"clicklog_keys:{target_date}"
r.hincrby(key, f"{ad_id}:{search_word}", 1)
- 広告には複数のタグが紐づいており、「どのタグで表示されクリックされたか」の情報が必要
->タグごとの広告効果測定が可能 - 集計していないデータの誤削除を防ぐために日付を持たせ、パラメータで日付を取得する形に実装
->日付変更間際で変な動きをさせない
2. バッチ処理での効率的なデータ取得
# ハッシュ全体を一度に取得
log_data = r.hgetall(key_set_name)
# バッチ挿入でPostgreSQLに保存
execute_values(cursor, insert_query, insert_data)
3. Docker Composeでの環境統一
batch:
build: ./containers/batch
depends_on:
- redis
- db
environment:
REDIS_HOST: redis
REDIS_PORT: ${REDIS_PORT}
POSTGRES_HOST: db
POSTGRES_PORT: ${POSTGRES_PORT}
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- ./containers/batch:/app
4. エラーハンドリングとロールバック
try:
execute_values(cursor, insert_query, insert_data)
conn.commit()
except Exception as e:
conn.rollback()
print(f"❌ PostgreSQL登録エラー: {e}")
これprintってCloudWatchとかに出んのかや?
💬 今後の展望・課題
- Redisカウンターにデータを登録するところの作成
- Lambdaへの乗せ換え
Discussion