サマリ
事業会社のIT部門に勤める開発初心者が、AWSのサーバーレスアーキテクチャを構築し、議事録要約アプリを開発しました。
本記事では、S3、API Gateway、Lambda、DynamoDBを用いて、議事録要約アプリをWebアプリケーションとして実装した手順を紹介します。
目的
今回は、個人的な学習を目的としています。
本格的な本番展開や利用者の拡大は目的としていません。
そのため、アプリケーションの要件やUI/UXも最低限のクオリティにとどめています。
前提
- AWSのアカウントを所持していること
要件
- 録音を開始する
- 録音を停止し、Transcribeによる文字起こしおよびClaudeによる要約処理を始める
- これまでの要約結果を一覧表示させる
使用するサービス
- AWS
- S3
- API Gateway
- Lambda
- Transcribe
- DynamoDB
- Claude
構成
構築手順
-
S3バケットの作成
- 録音、Transcribe結果、フロントエンドホスティング用のS3バケットを作成
- バケット名を一意に設定
- パブリックアクセスを許可
- s3:GetObjectを許可するバケットポリシーを設定
-
IAMロールの作成 (Lambda用)
信頼されたエンティティをLambdaとするIAMロールを作成(例: meeting-minutes-lambda-role)。
以下の管理ポリシーをアタッチ:- AWSLambdaBasicExecutionRole
- AmazonS3FullAccess (または細分化したS3権限)
- AmazonTranscribeFullAccess
- AmazonDynamoDBFullAccess (または細分化したDynamoDB権限)
-
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で整形して返します
詳細はこちら
-
DynamoDBテーブルの作成
テーブル名: MeetingMinutesSummary- プライマリキー (パーティションキー): meeting_id (タイプ: String)
-
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を控えます。
-
フロントエンドの準備とデプロイ
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バケットのルートにアップロードします
ソースはこちら
詰まったところ
- 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の改善を検討していきます。