AIペアアーキテクトのすすめ(第2回)
PythonでSlack日次レポートツールを作る例を通して、AWS Kiroを使った設計相談の実践法を解説。関数分割やディレクトリ構成、再送処理などをAIと検討します。
前回

Kiroと一緒に設計してみる:Slack日次レポートツールを題材に
コードを書く前に、AIと「どう作るか」を考える。
今回は実際に、AWS Kiroと対話しながら設計を詰めていくプロセスを体験してみよう。
今回作るもの
題材はシンプルな小物ツールです
Slackに日次レポートを投稿するPythonスクリプト
仕様はすでに決まっています。
- 目的:Slackチャンネルに日次レポートを投稿する
- 使用技術:Python + Slack Web API
- 実行環境:Lambdaまたはcron
- 外部依存:
requestsのみ - APIトークン:環境変数で管理
つまり、「何を作るか」も「どう動かすか」も決まっている状態なので、あとは、どう実装するのが最適かをKiroと相談しながら決めていきます。
1. 要件をKiroに伝える

Slackの日次レポート投稿スクリプトをPythonで作りたい。requestsだけで実装したい

Slackの日次レポート投稿スクリプトの設計案を提案させていただきます。
設計案
プロジェクト構成
slack-daily-report/
├── src/
│ ├── main.py # メイン実行ファイル
│ ├── slack_client.py # Slack API クライアント
│ └── report_generator.py # レポート生成ロジック
├── requirements.txt # 依存関係
├── .env.example # 環境変数のサンプル
└── README.md # 使用方法
主要コンポーネント
1. SlackClient (slack_client.py)
Slack Web APIへのHTTPリクエスト処理
メッセージ投稿機能
エラーハンドリング
2.ReportGenerator (report_generator.py)
日次レポートの内容生成
データ収集・整形ロジック
レポートフォーマット管理
3.Main (main.py)
Lambda handler または cron実行のエントリーポイント
環境変数の読み込み
全体の実行フロー制御
環境変数
SLACK_BOT_TOKEN: Slack Bot User OAuth Token
SLACK_CHANNEL: 投稿先チャンネル(例: #daily-reports)
REPORT_TIMEZONE: タイムゾーン(例: Asia/Tokyo)
この時点でKiroは、設計の初期スケッチを提示してくれます。だがすぐにコードを生成させません
2. 設計方針を「比較させる」

コンポーネントを分けずに1ファイルにまとめる方法と、分割する方法のメリット・デメリットを教えて

推奨判断基準
1ファイルが適している場合
– レポート内容がシンプル(テキストのみ)
– 将来的な機能拡張予定なし
– 使い捨てスクリプト的な用途
分割が適している場合
– 複数のデータソースからレポート生成
– 将来的にフォーマット変更や機能追加予定
– チーム開発や長期保守が必要
この比較をもとに、「テスト性を重視して関数分割にしよう」と判断できます。
AIが選択肢を提示し、人間が方向性を決める。これがChat駆動開発の基本サイクルになります。
3. ディレクトリ構成を相談する

このツールを小規模パッケージとして配布したい。どんなディレクトリ構成がいい?

推奨構成
slack-daily-reporter/
├── slack_daily_reporter/ # パッケージディレクトリ
│ ├── __init__.py # パッケージ初期化
│ ├── client.py # Slack API クライアント
│ ├── reporter.py # レポート生成・投稿
│ └── cli.py # CLI エントリーポイント
├── tests/ # テストディレクトリ
│ ├── __init__.py
│ ├── test_client.py
│ └── test_reporter.py
├── examples/ # 使用例
│ ├── basic_usage.py
│ └── lambda_handler.py
├── pyproject.toml # パッケージ設定(推奨)
├── setup.py # 後方互換性用(オプション)
├── requirements.txt # 依存関係
├── README.md # ドキュメント
├── LICENSE # ライセンス
├── .gitignore # Git除外設定
└── CHANGELOG.md # 変更履歴
各ファイルの役割
パッケージコア
__init__.py: 主要クラスをエクスポート
client.py: SlackClient クラス
reporter.py: DailyReporter クラス
cli.py: コマンドライン実行用
配布・開発支援
pyproject.toml: モダンなパッケージ設定(PEP 518準拠)
examples/: 実際の使用例(Lambda、cron等)
tests/: 単体テスト
パッケージ名の考慮点
良い例
slack-daily-reporter
slack-report-bot
daily-slack-notifier
避けるべき
slack (既存パッケージと競合)
reporter (汎用的すぎる)
この構成で進めてもよろしいでしょうか?PyPIへの公開も視野に入れた設計になっています。
ここで「確かにこの構成なら後で拡張しやすい」と納得できれば、設計の方向が固まるわけです。
AIを“相談役”として使うと、こうした構成判断が非常にスムーズになります。
4. 再送処理の設計を詰める

Slack APIのRate Limitに当たる可能性がある。リトライ処理はどう書くのが良い?

日次レポートの場合
Exponential Backoff が最適
リクエスト頻度が低いため、アグレッシブなリトライは不要
max_retries=3, base_delay=5秒 程度で十分
理由
予測可能: 日次レポートは時間的余裕がある
サーバー負荷軽減: 指数的な待機でSlack側の負荷を考慮
ジッター効果: 複数のLambdaが同時実行されても分散される
ここで「開発初期なので単純なリトライでいい」と決めることができます。
AIに“比較”と“判断材料”を出してもらうのがコツです。
5. 設計レビューをAIに任せる
ここまででKiroに出してもらった案を元に、自分で設計メモをまとめます。
そして、次のように尋ねてみる。

この設計案の改善点を指摘して

1. セキュリティ面の課題
問題点
環境変数でのトークン管理のみでは不十分
ログにトークンが漏れるリスク
改善案
# AWS Systems Manager Parameter Store対応
# Azure Key Vault対応
# ローカル開発時の .env ファイル対応
2. エラーハンドリングの不備
問題点
Rate Limit以外のエラー(ネットワーク、認証等)への対応不足
部分的失敗時の処理が不明確
改善案
# 4xx: クライアントエラー(リトライ不要)
# 5xx: サーバーエラー(リトライ必要)
# ネットワークタイムアウト対応
# 認証エラーの明確な区別
3. 設定管理の柔軟性不足
問題点
環境変数のみでは複雑な設定に対応困難
複数チャンネルへの投稿や条件分岐が考慮されていない
改善案
# config.yaml または config.json 対応
# 環境別設定(dev/staging/prod)
# 動的な投稿先選択機能
4. ロギング・監視の欠如
問題点
実行状況の可視性が低い
デバッグ時の情報不足
改善案
# 構造化ログ(JSON形式)
# メトリクス収集(実行時間、成功/失敗率)
# アラート機能(失敗時の通知)
5. テスタビリティの問題
問題点
外部API依存でテストが困難
モック化の仕組みが不明確
改善案
# 依存性注入パターン
# HTTPクライアントの抽象化
# テスト用のファクトリー関数
6. パフォーマンス考慮不足
問題点
大量データ処理時のメモリ使用量
同期処理のみでスループット制限
改善案
# ストリーミング処理対応
# 非同期処理オプション(asyncio)
# バッチ処理機能
7. 運用面の課題
問題点
デプロイ方法が不明確
バージョン管理戦略なし
改善案
# Docker対応
# CI/CDパイプライン設定例
# セマンティックバージョニング
このように、AIをレビューアとして活用できるのもKiroの使い所です。
まとめ ― 設計をAIと詰める実践プロセス
第2回では、Kiroと実際に対話しながら設計を詰める流れを紹介しました。
ポイントをまとめると:
- すぐにコードを生成させない
→ まずは設計方針を相談する - 比較を依頼する
→ 「2パターン出して」と指示すると有効 - 理由を尋ねる
→ 「なぜその構成が良い?」を聞くと回答の質が上がる - レビューを依頼する
→ 設計段階で改善点を洗い出せる
こうした会話を重ねることで、AIとの設計議論が「思考の整理ツール」として機能します。
次回予告
第3回では、今回決めた設計をもとに実際のコードを生成し、
AIとのペアプログラミングでリファクタリングを進めるプロセスを紹介します。
(第2回おわり)





コメント