要件定義

項目 小項目 内容
プロジェクト概要 目的 プライベートAIアシスタント「すすむくん」の開発
スコープ AWSとChatGPTを活用したカレンダー連携、通知機能を含む
利用者と関係者 ターゲットユーザー 自分自身、チームメンバー
関係者 開発者、使用者(ユーザー)
機能要件 カレンダー同期 Googleカレンダーとの連携
通知機能 AWS Lambdaを使ってLINE WORKSで通知送信
問い合わせ応答機能 LINE WORKS上で問い合わせを行うと応答を返す
非機能要件 セキュリティ AWS Secrets Managerを利用
性能 通知処理は3秒以内に完了
可用性 システム稼働率95%以上を保証
データ要件 データ項目 ユーザー名、メールアドレス、スケジュール情報
保存期間 過去1年間
データ量 1日のトランザクション数は最大500回
システム連携 連携対象 GoogleカレンダーAPI、LINE WORKS API、ChatGPT API、AWS Lambda、AWS DynamoDB
制約条件 技術的制約 Pythonを主な開発言語とする
予算制約 個人利用として無料・低コストを優先
スケジュール制約 年明け(2025年1月中)リリース目標
スケジュール 要件定義書作成 2024/11/30
プロトタイプ開発 2024/12/15
ユーザーテスト 2025/01/10
リスクと対応策 API利用制限 利用頻度を事前調整
サーバー負荷 AWS Auto Scalingを設定
データ漏洩 定期的なセキュリティ確認
成果物 完成品 AIアシスタント「すすむくん」
承認プロセス 承認者 開発者自身
承認手順 自己レビュー後に次フェーズ進行

機能一覧

機能カテゴリ 機能名 詳細説明 優先度 備考 該当フロー
カレンダー連携 Googleカレンダー同期 Googleカレンダーの予定をリアルタイムで取得 カレンダー同期のフロー
イベントの登録確認 カレンダーに新規イベントが登録された際に確認通知を送信 イベント変更通知のフロー
日次予定リマインダー 当日の予定を指定時刻に通知 リマインダー通知のフロー
イベントリマインダー 特定イベントの開始時刻前にリマインド通知 リマインダー通知のフロー
通知機能 定時通知 毎日決まった時間に重要情報を通知 スケジュール設定可能 定時通知のフロー
イベント変更通知 カレンダーイベントが変更された場合に通知 イベント変更通知のフロー
緊急通知 ユーザーからの指定に応じて即時通知を送信 設定変更フロー
LINE WORKS通知管理 LINE WORKSの特定グループやユーザーへの通知を設定 設定変更フロー
問い合わせ応答機能 メッセージ応答 LINE WORKS上で受けた質問に応答 ChatGPTを活用 問い合わせ応答のフロー
FAQ検索機能 定型的な質問への回答を自動生成 問い合わせ応答のフロー
会話履歴参照機能 過去の問い合わせ履歴を基に応答を調整 問い合わせ応答のフロー
応答精度向上設定 ユーザーのフィードバックを基に応答精度を向上 設定変更フロー
設定・管理機能 設定画面 通知時間やリマインダー設定、通知先の管理 設定変更フロー
APIキー管理 GoogleカレンダーAPIやLINE WORKS APIのキー管理 設定変更フロー
ユーザー情報管理 ユーザー名、メールアドレスなどの情報を登録・編集 設定変更フロー
ログ管理 問い合わせや通知履歴を一覧表示 エラーハンドリング全体フロー
バックエンド機能 データベース管理 AWS DynamoDBでデータを保存・管理 データ更新フロー
外部API接続 GoogleカレンダーAPIやLINE WORKS APIとの接続 カレンダー同期のフロー
ChatGPT API連携 問い合わせ応答にChatGPTを活用 問い合わせ応答のフロー
スケジュールバッチ処理 定期的に通知やデータ更新を実行 定時通知のフロー
その他 システムステータス通知 システム障害やメンテナンス情報を通知 個人利用の場合は省略可 エラーハンドリング全体フロー
バージョン情報表示 システムのバージョンや更新履歴を表示 設定変更フロー

システム構成図

graph TD
    Client["クライアント<br>LINE WORKS"] -->|1.リクエスト送信| Gateway["AWS API Gateway"]
    Gateway -->|2.リクエスト転送| Lambda["AWS Lambda<br>ビジネスロジック"]
    Lambda -->|3.データ取得/保存| DB[(AWS DynamoDB)]
    Lambda -->|4.カレンダー同期| Calendar["GoogleカレンダーAPI"]
    Lambda -->|5.問い合わせ応答| ChatGPT["ChatGPT API"]
    Lambda -->|6.シークレット取得| Secrets["AWS Secrets Manager"]
    Lambda -->|7.応答返信| Gateway
    Gateway -->|8.結果通知| Client

    style Client fill:#ffeb3b,stroke:#333,stroke-width:2px
    style Gateway fill:#8bc34a,stroke:#333,stroke-width:2px
    style Lambda fill:#03a9f4,stroke:#333,stroke-width:2px
    style DB fill:#e91e63,stroke:#333,stroke-width:2px
    style Calendar fill:#ffc107,stroke:#333,stroke-width:2px
    style ChatGPT fill:#ff9,stroke:#333,stroke-width:2px
    style Secrets fill:#9e9e9e,stroke:#333,stroke-width:2px

graph TD
    A[LINE WORKS<br>クライアント] -->|リクエスト送信| Gateway["AWS API Gateway"]
    Gateway -->|リクエスト転送| Lambda["AWS Lambda"]
    subgraph Lambda内部処理
        L1[シークレット取得リクエスト]
        L2[シークレット取得レスポンス]
        L3[ビジネスロジック実行]
    end
    Lambda -->|リクエスト: シークレット取得| Secrets["AWS Secrets Manager"]
    Secrets -->|レスポンス: シークレット情報| L1
    L2 --> L3
    Lambda -->|応答| Gateway
    Gateway -->|結果通知| A

    style Secrets fill:#9e9e9e,stroke:#333,stroke-width:2px

  1. クライアント(LINE WORKS)

ユーザーから問い合わせや通知リクエストを送信。

  1. APIゲートウェイ

リクエストを受け取り、適切なLambda関数に振り分ける。

  1. AWS Lambda

ロジックを実行し、外部API(ChatGPT、Googleカレンダー)やデータベースと連携。

  1. 外部サービス(GoogleカレンダーAPI、ChatGPT API)

必要な情報を取得または応答を生成。

  1. データベース(AWS DynamoDB)

必要に応じてデータを読み書き。

  1. クライアントに応答を送信

LINE WORKSに結果を通知。

定時通知のAPIフロー

graph TD
    A[AWS EventBridge<br>定時トリガー発生] -->|1.トリガー発生| B[AWS Lambda]

    subgraph AWS Lambda
        direction TB
        B1["通知先情報を取得"]
        B2["メッセージ生成"]
        B3["エラー処理"]
    end
    B -->|2.通知先情報取得| C[(AWS DynamoDB<br>通知先情報)]
    C -->|3.レスポンス: 通知先情報| B1
    B1 -->|4.メッセージ生成| B2
    B2 -->|5.通知送信| D["LINE WORKS API<br>通知送信"]
    D -->|6.通知成功| E["ユーザーに通知表示<br>LINE WORKS"]
    D -->|6.通知失敗| B3
    B3 -->|7.エラーログ記録| F[(CloudWatch<br>エラーログ)]
    B3 -->|8.再試行| B2

    %% ノードのスタイル
    style A fill:#ffeb3b,stroke:#333,stroke-width:2px
    style B fill:#8bc34a,stroke:#333,stroke-width:2px
    style C fill:#e91e63,stroke:#333,stroke-width:2px,shape:circle
    style D fill:#ffc107,stroke:#333,stroke-width:2px
    style E fill:#e91e63,stroke:#333,stroke-width:2px
    style F fill:#9e9e9e,stroke:#333,stroke-width:2px,shape:circle

イベント変更通知API

graph TD
    A[GoogleカレンダーAPI<br>イベント変更検知] -->|1.変更イベント取得| B[AWS Lambda]

    subgraph AWS Lambda
        direction TB
        B1[通知先情報を取得<br>(AWS DynamoDB)]
        B2[変更内容に基づくメッセージ生成]
        B3[エラー処理]
    end

    B -->|2.通知先情報取得| C[(AWS DynamoDB<br>通知先情報)]
    C -->|3.レスポンス: 通知先情報| B1
    B1 -->|4.変更内容をもとにメッセージ生成| B2
    B2 -->|5.通知送信| D[LINE WORKS API<br>通知送信]
    D -->|6.通知成功| E[ユーザーに通知表示<br>LINE WORKS]
    D -->|6.通知失敗| B3
    B3 -->|7.エラーログ記録| F[(CloudWatch<br>エラーログ)]
    B3 -->|8.再試行| B2

    %% ノードのスタイル
    style A fill:#ffeb3b,stroke:#333,stroke-width:2px
    style B fill:#8bc34a,stroke:#333,stroke-width:2px
    style C fill:#e91e63,stroke:#333,stroke-width:2px,shape:circle
    style D fill:#ffc107,stroke:#333,stroke-width:2px
    style E fill:#e91e63,stroke:#333,stroke-width:2px
    style F fill:#9e9e9e,stroke:#333,stroke-width:2px,shape:circle

リマインダー通知フロー

graph TD
    A[AWS EventBridge<br>5分ごとにトリガー発生] -->|1.トリガー発生| B[AWS Lambda]

    subgraph AWS Lambda
        direction TB
        B1[現在時刻を取得]
        B2[近いイベントを検索<br>(GoogleカレンダーAPI)]
        B3[リマインダーメッセージ生成]
        B4[エラー処理]
    end

    B -->|2.現在時刻に基づいてイベント検索| C["GoogleカレンダーAPI<br>イベント取得"]
    C -->|3.イベント情報レスポンス| B2
    B2 -->|4.リマインダーメッセージ生成| B3
    B3 -->|5.通知送信| D[LINE WORKS API<br>通知送信]
    D -->|6.通知成功| E[ユーザーに通知表示<br>LINE WORKS]
    D -->|6.通知失敗| B4
    B4 -->|7.エラーログ記録| F[(CloudWatch<br>エラーログ)]
    B4 -->|8.再試行| B3

    %% ノードのスタイル
    style A fill:#ffeb3b,stroke:#333,stroke-width:2px
    style B fill:#8bc34a,stroke:#333,stroke-width:2px
    style C fill:#03a9f4,stroke:#333,stroke-width:2px
    style D fill:#ffc107,stroke:#333,stroke-width:2px
    style E fill:#e91e63,stroke:#333,stroke-width:2px
    style F fill:#9e9e9e,stroke:#333,stroke-width:2px,shape:circle

問い合わせ応答フロー

graph TD
    A[LINE WORKS<br>問い合わせメッセージ受信] -->|1.メッセージ送信| B[AWS API Gateway]

    B -->|2.リクエスト転送| C[AWS Lambda<br>問い合わせ処理]

    subgraph AWS Lambda
        direction TB
        C1[問い合わせ内容解析]
        C2[FAQデータベース検索<br>(DynamoDB)]
        C3[ChatGPT API呼び出し]
        C4[応答メッセージ生成]
        C5[エラー処理]
    end

    C -->|3.問い合わせ内容を解析| C1
    C1 -->|4.FAQ検索| C2
    C2 -->|5.FAQが見つかれば応答| C4
    C2 -->|FAQが見つからない| C3
    C3 -->|6.ChatGPTで応答生成| C4
    C4 -->|7.応答を送信| D[LINE WORKS API<br>応答メッセージ送信]
    D -->|8.応答が表示される| E[ユーザー]

    D -->|通知が失敗| C5
    C5 -->|9.エラーログ記録| F[(CloudWatch<br>エラーログ)]
    C5 -->|10.再試行| C4

    %% ノードのスタイル
    style A fill:#ffeb3b,stroke:#333,stroke-width:2px
    style B fill:#8bc34a,stroke:#333,stroke-width:2px
    style C fill:#03a9f4,stroke:#333,stroke-width:2px
    style C2 fill:#e91e63,stroke:#333,stroke-width:2px,shape:circle
    style C3 fill:#ffc107,stroke:#333,stroke-width:2px
    style C4 fill:#8bc34a,stroke:#333,stroke-width:2px
    style D fill:#e91e63,stroke:#333,stroke-width:2px
    style E fill:#ffc107,stroke:#333,stroke-width:2px
    style F fill:#9e9e9e,stroke:#333,stroke-width:2px,shape:circle

カレンダー同期フロー

graph TD
    A[LINE WORKS<br>同期リクエスト] -->|1.リクエスト送信| B[AWS API Gateway]
    B -->|2.リクエスト転送| C[AWS Lambda<br>カレンダー同期処理]

    subgraph AWS Lambda
        direction TB
        C1[ユーザー認証]
        C2[GoogleカレンダーAPI呼び出し]
        C3[同期データ保存]
        C4[エラー処理]
    end

    C -->|3.認証処理| C1
    C1 -->|4.カレンダーイベント取得| C2
    C2 -->|5.同期データを保存| D[(AWS DynamoDB)]
    D -->|6.同期成功応答| E[LINE WORKS<br>同期結果通知]
    C2 -->|エラー発生| C4
    C4 -->|7.エラーログ記録| F[(CloudWatch<br>エラーログ)]

    style A fill:#ffeb3b,stroke:#333,stroke-width:2px
    style B fill:#8bc34a,stroke:#333,stroke-width:2px
    style C fill:#03a9f4,stroke:#333,stroke-width:2px
    style D fill:#e91e63,stroke:#333,stroke-width:2px,shape:circle
    style E fill:#ffc107,stroke:#333,stroke-width:2px
    style F fill:#9e9e9e,stroke:#333,stroke-width:2px,shape:circle

データ更新フロー

graph TD
    A[管理画面<br>データ更新リクエスト] -->|1.リクエスト送信| B[AWS API Gateway]
    B -->|2.リクエスト転送| C[AWS Lambda<br>データ更新処理]

    subgraph AWS Lambda
        direction TB
        C1[更新内容解析]
        C2[DynamoDB更新]
        C3[エラー処理]
    end

    C -->|3.更新内容を解析| C1
    C1 -->|4.DynamoDB更新リクエスト| D[(AWS DynamoDB)]
    D -->|5.更新成功応答| E[管理画面に更新結果を返す]
    D -->|エラー発生| C3
    C3 -->|6.エラーログ記録| F[(CloudWatch<br>エラーログ)]

    style A fill:#ffeb3b,stroke:#333,stroke-width:2px
    style B fill:#8bc34a,stroke:#333,stroke-width:2px
    style C fill:#03a9f4,stroke:#333,stroke-width:2px
    style D fill:#e91e63,stroke:#333,stroke-width:2px,shape:circle
    style E fill:#ffc107,stroke:#333,stroke-width:2px
    style F fill:#9e9e9e,stroke:#333,stroke-width:2px,shape:circle

設定変更フロー

graph TD
    A[LINE WORKS<br>設定変更リクエスト] -->|1.リクエスト送信| B[AWS API Gateway]
    B -->|2.リクエスト転送| C[AWS Lambda<br>設定変更処理]

    subgraph AWS Lambda
        direction TB
        C1[設定内容解析]
        C2[DynamoDB更新]
        C3[エラー処理]
    end

    C -->|3.設定内容を解析| C1
    C1 -->|4.DynamoDB更新リクエスト| D[(AWS DynamoDB)]
    D -->|5.設定変更成功応答| E[LINE WORKS<br>設定変更結果通知]
    D -->|エラー発生| C3
    C3 -->|6.エラーログ記録| F[(CloudWatch<br>エラーログ)]

    style A fill:#ffeb3b,stroke:#333,stroke-width:2px
    style B fill:#8bc34a,stroke:#333,stroke-width:2px
    style C fill:#03a9f4,stroke:#333,stroke-width:2px
    style D fill:#e91e63,stroke:#333,stroke-width:2px,shape:circle
    style E fill:#ffc107,stroke:#333,stroke-width:2px
    style F fill:#9e9e9e,stroke:#333,stroke-width:2px,shape:circle

エラーハンドリング全体フロー

graph TD
    A[処理の開始] -->|エラー発生| B[エラーハンドリング]

    subgraph エラーハンドリング
        direction TB
        B1[(CloudWatch<br>エラーログ)]
        B2[管理者への通知<br>(LINE WORKS API)]
        B3[再試行処理<br>(AWS Lambda)]
    end

    B -->|1.エラーログ記録| B1
    B -->|2.管理者通知| B2
    B -->|3.再試行| B3
    B3 -->|再試行失敗| B1

    %% ノードのスタイル
    style A fill:#ffeb3b,stroke:#333,stroke-width:2px
    style B fill:#8bc34a,stroke:#333,stroke-width:2px
    style B1 fill:#9e9e9e,stroke:#333,stroke-width:2px,shape:cylinder
    style B2 fill:#ffc107,stroke:#333,stroke-width:2px
    style B3 fill:#8bc34a,stroke:#333,stroke-width:2px

https://fluttering-socks-c19.notion.site/AI-14ecf9d5b14e80baacc3cfa8bde2f5bc