📁 完全なコードはGitHubで公開:GitHub: pipeiac02
シリーズ一覧(全12回)
Phase 1: 基盤構築
Phase 2: ワークフロー
Phase 3: セキュリティ・運用
Phase 4: 開発効率化
1. はじめに
1-1. このシリーズについて
AWS × Terraform でデータパイプラインを構築しながら、設計思考を身につけていく自己学習です。
「とりあえず動く」ではなく、「なぜこう設計するのか」を考えながら進めていきます。
1-2. 対象読者
- AWSはEC2くらいなら触ったことがある
- Terraformの基礎は分かる
- データパイプラインを作ってみたい
- 設計の考え方を学びたい
1-3. このシリーズのスタンス
筆者が自分の思考の可視化をするスタイルで書いていきます。
2. 何を作るか?
2-1. 完成形の全体像
このシリーズで作るのは、EC売上データを自動で分析できる状態にするパイプライン です。
2-2. できるようになること
| できること | 説明 |
|---|---|
| 自動実行 | S3にファイルを置くだけでパイプラインが動く |
| データ変換 | JSON → Parquet(分析に最適な形式) |
| SQLで分析 | Athenaでクエリを実行できる |
| 可視化 | QuickSightでダッシュボード作成 |
| 失敗通知 | エラー時にメールで通知 |
| 監視 | 異常を検知してアラート |
2-3. 使用するAWSサービス
| サービス | 役割 |
|---|---|
| S3 | データの保存場所 |
| Lambda | データ変換処理 |
| Step Functions | ワークフロー管理 |
| Glue | メタデータ管理 |
| EventBridge | イベント駆動 |
| Athena | SQLクエリ |
| QuickSight | 可視化 |
| SNS | 通知 |
| CloudWatch | 監視 |
| IAM | 権限管理 |
3. 比喩で理解する
3-1. データパイプラインを「レストランの厨房」で考える
いきなり技術の話をする前に、身近な例で全体像を掴んでみます。
3-2. 比喩の図解(レストラン)
3-3. 比喩と技術の対応表
| レストラン | AWSサービス | 役割 |
|---|---|---|
| 冷蔵庫(食材) | S3 Raw | 生データの保管場所 |
| ホールスタッフ | EventBridge | 「注文が入った」を検知 |
| 調理長 | Step Functions | 工程を管理・指示 |
| 料理人 | Lambda | 実際の調理(データ変換) |
| 盛り付け済み料理 | S3 Processed | 加工済みデータ |
| メニュー係 | Glue Crawler | メニュー表を更新 |
| メニュー表 | Glue Database | データの構造情報 |
| 配膳とお会計 | Athena | 料理を届ける(クエリ実行) |
| お客さんの食事 | QuickSight | 可視化・分析 |
| 店長への報告 | SNS | 失敗時の通知 |
| 煙感知器 | CloudWatch | 異常検知 |
3-4. 技術の図解(AWS)
3-5. 並べてみると
同じ構造 になっていることが分かります。
- 食材を保管 → 注文検知 → 調理 → 盛り付け → 配膳
- データを保管 → イベント検知 → 変換 → 保存 → クエリ
この「流れ」を意識して、各サービスの役割をイメージします。
4. 学習ロードマップ
4-1. シリーズ全体の流れ:Phase1~Phase4
12回に分けて、段階的にパイプラインを構築していきます。
4-2. 各回の概要
| # | タイトル | 学ぶこと | 比喩 |
|---|---|---|---|
| 1 | 全体像 | パイプラインの構成・ゴール | レストラン全体の見取り図 |
| 2 | S3設計 | Raw/Processedの役割、命名規則 | 冷蔵庫と盛り付け台の設計 |
| 3 | Lambda ETL | JSON→Parquet変換、Layer | 料理人の調理手順 |
| 4 | Glue Crawler | メタデータ管理、Athena連携 | メニュー表の自動更新 |
| 5 | Step Functions | ワークフロー設計、状態管理 | 調理長の工程管理 |
| 6 | EventBridge | S3トリガー、自動実行 | ホールスタッフの注文検知 |
| 7 | IAM最小権限 | ロール設計、ポリシー分離 | スタッフごとの権限管理 |
| 8 | エラーハンドリング | Retry/Catch/SNS通知 | 焦げたら再挑戦、ダメなら店長報告 |
| 9 | CloudWatch監視 | アラーム設計、傾向監視 | 煙感知器の設置 |
| 10 | Terraform設計 | ファイル構成、tfvars、backend | レシピ本の整理方法 |
| 11 | CI/CD | GitHub Actions連携 | 自動発注システム |
| 12 | 総まとめ | 全体テスト、振り返り | グランドオープン |
4-3. 各Phaseのゴール
| Phase | ゴール |
|---|---|
| Phase 1 | データが変換・保存される状態 |
| Phase 2 | 自動で動く状態 |
| Phase 3 | 安全・安心に運用できる状態 |
| Phase 4 | 効率よく開発・運用できる状態 |
5. 環境準備
5-1. 前提条件
| 項目 | 条件 |
|---|---|
| AWSアカウント | 作成済み |
| AWS CLI | インストール・設定済み |
| Terraform | v1.0.0 以上 |
| Git | インストール済み |
| エディタ | VS Code 推奨 |
5-2. 作業環境
| 項目 | 環境 |
|---|---|
| OS | WSL2 Ubuntu(Windows)または Mac |
| エディタ | VS Code |
| ターミナル | WSL2 または Mac Terminal |
5-3. AWS CLIの確認
aws --version
aws sts get-caller-identity
5-4. Terraformの確認
terraform version
5-5. リポジトリの準備
git clone https://github.com/shu130/pipeiac02.git
cd pipeiac02
5-6. ディレクトリ構成:シリーズ完了後
シリーズ完成後の構成です。
pipeiac02/
├── .github/
│ └── workflows/
│ ├── terraform-plan.yml # 第11回で追加(PR時にplan実行)
│ └── terraform-apply.yml # 第11回で追加(マージ時にapply実行)
├── oidc/ # 第11回:OIDC設定(別管理推奨)
│ ├── main.tf # 第11回:OIDCプロバイダ・IAMロール
│ ├── variables.tf # 第11回:変数定義
│ └── outputs.tf # 第11回:出力値
├── test-data/ # テスト用サンプルデータ
│ ├── ec-sales-03.json # 第3回:Lambda ETLテスト
│ ├── ec-sales-05.json # 第5回:Step Functionsテスト
│ ├── ec-sales-06.json # 第6回:EventBridge自動起動テスト
│ ├── iam-test.json # 第7回:IAM権限テスト
│ ├── error-test-ok.json # 第8回:エラーハンドリング正常系
│ ├── monitor-test.json # 第9回:CloudWatch監視テスト
│ ├── refactor-test.json # 第10回:リファクタリング後テスト
│ ├── e2e-test.json # 第12回:E2E正常系テスト
│ ├── invalid-json.json # 第12回:E2E異常系(不正JSON)
│ └── empty-array.json # 第12回:E2E異常系(空配列)
├── tf/
│ ├── main.tf # 第2回:プロバイダ設定・共通タグ
│ ├── variables.tf # 第2回:変数定義
│ ├── outputs.tf # 第2回:出力値定義
│ ├── backend.tf # 第11回:S3バックエンド設定
│ ├── terraform.tfvars # 第2回:変数値(Git管理外)
│ ├── s3.tf # 第2回:S3バケット
│ ├── lambda.tf # 第3回:Lambda関数
│ ├── glue.tf # 第4回:Glue Database・Crawler
│ ├── stepfunctions.tf # 第5回:Step Functions
│ ├── eventbridge.tf # 第6回:EventBridgeルール・S3通知
│ ├── sns.tf # 第8回:SNSトピック・サブスクリプション
│ ├── cloudwatch.tf # 第9回:アラーム・ダッシュボード
│ ├── iam.tf # 第3,4,5,6回:IAMロール・ポリシー
│ └── lambda/
│ └── etl.py # 第3回:ETL処理コード
└── README.md
補足:
-
terraform-plan.yml: PR作成時にterraform planを実行し、結果をPRにコメント -
terraform-apply.yml: mainマージ時にterraform applyを自動実行 -
oidc/: GitHub Actions用のOIDC認証設定(メインのtfとは別管理) -
backend.tf: tfstateをS3で管理するための設定
6. まとめ
6-1. この記事でやったこと
| 項目 | 内容 |
|---|---|
| 全体像 | パイプラインの完成形を図解 |
| 比喩 | レストランの厨房で理解 |
| ロードマップ | 12回のシリーズ構成 |
| 環境準備 | 必要なツール・リポジトリ |
6-2. 比喩の振り返り
| レストラン | AWS |
|---|---|
| 冷蔵庫 | S3 |
| ホールスタッフ | EventBridge |
| 調理長 | Step Functions |
| 料理人 | Lambda |
| メニュー係 | Glue Crawler |
| 煙感知器 | CloudWatch |
6-3. 次回予告
第2回: S3設計 では、データの保管場所を設計していきます。
- Raw と Processed の役割分担
- 命名規則の考え方
- Terraformでの実装
レストランで言うと「冷蔵庫と盛り付け台の設計」です。
(つづく)