1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

開発初心者が3時間で議事録要約アプリを作った話

Last updated at Posted at 2025-07-05

サマリ

事業会社のIT部門に勤める開発初心者が、AWSのサーバーレスアーキテクチャを構築し、議事録要約アプリを開発しました。
本記事では、S3、API Gateway、Lambda、DynamoDBを用いて、議事録要約アプリをWebアプリケーションとして実装した手順を紹介します。

目的

今回は、個人的な学習を目的としています。
本格的な本番展開や利用者の拡大は目的としていません。
そのため、アプリケーションの要件やUI/UXも最低限のクオリティにとどめています。

前提

  • AWSのアカウントを所持していること

要件

スクリーンショット 2025-07-05 11.45.57.png

  • 録音を開始する
  • 録音を停止し、Transcribeによる文字起こしおよびClaudeによる要約処理を始める
  • これまでの要約結果を一覧表示させる

使用するサービス

  • AWS
    • S3
    • API Gateway
    • Lambda
    • Transcribe
    • DynamoDB
  • Claude

構成

スクリーンショット 2025-07-05 17.10.07.png

構築手順

  1. S3バケットの作成

    • 録音、Transcribe結果、フロントエンドホスティング用のS3バケットを作成
    • バケット名を一意に設定
    • パブリックアクセスを許可
    • s3:GetObjectを許可するバケットポリシーを設定
  2. IAMロールの作成 (Lambda用)
    信頼されたエンティティをLambdaとするIAMロールを作成(例: meeting-minutes-lambda-role)。
    以下の管理ポリシーをアタッチ:

    • AWSLambdaBasicExecutionRole
    • AmazonS3FullAccess (または細分化したS3権限)
    • AmazonTranscribeFullAccess
    • AmazonDynamoDBFullAccess (または細分化したDynamoDB権限)
  3. Lambda関数の作成
    3.1. uploadAudioAndStartTranscription
    録音をアップロードし、Transcribeジョブを開始する関数を実装します。

    • ランタイム: Python 3.12
    • ロール: meeting-minutes-lambda-role
    • 環境変数: S3_BUCKET_NAME
    • コード: こちら

    3.2. summarizeMeetingTranscript
    文字起こし結果の要約処理をします

    • ランタイム: Python 3.12
    • ロール: meeting-minutes-lambda-role
    • 環境変数: DYNAMODB_TABLE_NAME (DynamoDBテーブル名)
    • コード: S3の文字起こしJSONを読み込み、Claudeを呼び出して要約し、DynamoDBにJSTで保存します。詳細はこちら

    トリガー設定: S3のtranscripts/プレフィックスに.jsonファイルが作成された際にトリガーされるよう設定します。

    3.3. getMeetingSummaries
    DynamoDBより、要約一覧を取得します。

    • ランタイム: Python 3.12
    • ロール: meeting-minutes-lambda-role
    • 環境変数: DYNAMODB_TABLE_NAME
    • コード: DynamoDBから全要約項目を取得し、JSTで整形して返します
      詳細はこちら
  4. DynamoDBテーブルの作成
    テーブル名: MeetingMinutesSummary

    • プライマリキー (パーティションキー): meeting_id (タイプ: String)
  5. API Gatewayの設定
    REST APIを作成します(例: MeetingTranscriptAPI)。

    5.1. /uploadリソース (POST)

    • リソース名: upload
    • メソッド: POST
    • 統合タイプ: Lambdaプロキシ統合
    • CORSを有効化: Access-Control-Allow-OriginをS3ウェブサイトURLに設定し、POST,OPTIONSを許可します

    5.2. /summariesリソース (GET)

    • リソース名: summaries
    • メソッド: GET
    • 統合タイプ: Lambdaプロキシ統合
    • CORSを有効化: Access-Control-Allow-OriginをS3ウェブサイトURLに設定し、GET,OPTIONSを許可します

    5.3. APIのデプロイ
    APIを新しいステージにデプロイします(例: poc)。

    表示される呼び出しURLを控えます。

  6. フロントエンドの準備とデプロイ
    index.html, style.css, app.jsの3ファイルを作成します。

    app.js内で、API Gatewayの呼び出しURLをUPLOAD_API_ENDPOINTとSUMMARIES_API_ENDPOINTに設定します(例: YOUR_URL/upload, YOUR_URL/summaries)。

    これらのファイルをS3バケットのルートにアップロードします
    ソースはこちら

  7. index.htmlのS3オブジェクトURLを開きます。
    以下のような画面がひらけば成功です!
    スクリーンショット 2025-07-05 13.28.43.png

詰まったところ

  • Lambdaのデプロイ忘れ
    初歩的ですが。。。
    Lambdaにて「デプロイ」を行わずに関数を実行しようとして、起動エラーが発生しました。
    Lambda関数を確認したところ、デプロイを忘れていました。
    Lambdaはデプロイしないと、コーディングした処理を実行できません。
  • CORS設定忘れ
    API GatewayのCORS設定を失念し、以下のエラーが発生しました。
    No 'Access-Control-Allow-Origin' header is present on the requested resource.
    

所感

AWSの構築経験がない私でも、サーバーレスアーキテクチャを実装することができました。
Claudeを除き、すべてAWSの無料枠内で構築できるため、費用面でのハードルも低く感じました。
今後は話者識別機能、認証機能の追加や要件、UI/UXの改善を検討していきます。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?