はじめに
まずは結論から
- Kiro の仕様駆動開発で実際にAWS上で動くAPIを構築してみた
- Bedrock(Claude Sonnet 4.6) + Lambda + API Gateway + DynamoDB のサーバーレス構成
- 構築したアプリのコードはGitHubに公開
想定される読者
- Kiro再入門-機能編(その1)を読んだ方
- Kiroで実際にシステムを作ってみたい方
- AWSサーバーレス構成に興味がある方
前回の機能編ではKiroの各機能(MCP, Steering, Hooks, Powers, Skills等)を紹介しました。
本記事では、これらの機能を使って実際に動くアプリケーションを構築します。
作るもの
- AWSサービスをそれなりに使いたい
- UIが入るとややこしくなるのでコマンドラインで確認できるもの
- AI的な要素も欲しいよね
- お片付けも簡単に
という観点で検討した結果、SAMでデプロイするサーバーレスなAIメモアシスタントAPIを作ってみることにしました。
メモのCRUDに加えて、Bedrockを使ったメモへのAI質問応答・全メモ要約機能を持ちます。
また、お片付け(sam delete)まで含めます。
API Gateway (REST API)
├─ POST/GET/PUT/DELETE /memos → Lambda (CRUD) → DynamoDB
├─ POST /memos/{id}/ask → Lambda (AI) → DynamoDB + Bedrock Claude
└─ POST /memos/summary → Lambda (Summary) → DynamoDB + Bedrock Claude
技術スタック
| 要素 | 技術 |
|---|---|
| Runtime | Python 3.13 |
| API | Amazon API Gateway (REST API) |
| Compute | AWS Lambda × 3関数 |
| Database | Amazon DynamoDB |
| AI | AWS Bedrock (Claude Sonnet 4.6) |
| IaC | AWS SAM |
実装の流れ
それではStepに分けて、実際にKiroでアプリケーションを作成した流れを追っていきます。
Step 1: プロジェクト準備
MCP Server 接続
機能編で紹介した通り、.kiro/settings/mcp.json にdraw.io MCPを設定します。
{
"mcpServers": {
"drawio": {
"command": "npx",
"args": [
"@drawio/mcp"
]
}
}
}
Steering & Skills 設定
Generate Steering Docs で基本ファイル(product.md, tech.md, structure.md)を自動生成し、AWSサーバーレスのベストプラクティスに書き換えてもらいます。
ついでに aws-design.md としてカスタムステアリングも追加してあります。
また、以下の2つのSkillsを作成しました。
チャットで /deploy や /cloudformation と入力するだけで呼び出せます。
| スキル | 内容 |
|---|---|
/cloudformation |
CloudFormationテンプレートの作成・スタック管理・トラブルシューティング |
/deploy |
sam build → sam deploy を実行し、API GatewayのURLを表示 |
Hooks 設定
以下の2つのHookを設定しておきます。
| フック | トリガー | 動作 |
|---|---|---|
| code-quality-review |
.py .ts 等のソースファイル保存時 |
コード品質レビュー(コードスメル・設計パターン・セキュリティ等)を自動実施 |
| docs-on-code-change |
.py template.yaml requirements.txt 保存時 |
README.md等の関連ドキュメントを自動更新 |
Bedrock モデルアクセスの有効化
AWSコンソールの us-west-2(オレゴン) リージョンで Bedrock のモデルアクセスを有効化しておきます。
今回は Claude Sonnet 4.6 を使用します。
Step 2: 仕様駆動開発でAPI作成
Specセッションの開始
Specセッションを開始します。
まずは以下のように簡単な要件を記入します。
AWS上でサーバーレスに稼働するAI要約APIを作りたい。
Phase 1: Requirements(要件定義)
Kiroが requirements.md を自動生成します。
各要件にはユーザーストーリーと受け入れ基準が含まれます。
いくつかの問いかけに対して、回答を選択してSubmit Answerで進めると、Requirementを作成してくれます。

Kiroの要約によると、こんな感じの内容みたいです。
- テキスト要約API - 基本的な要約機能
- 認証と認可 - Cognitoによるセキュリティ
- 非同期処理 - 大きなテキストの処理
- 要約結果の永続化 - DynamoDBでの保存
- AI統合 - 複数のAIサービス対応
- レート制限とコスト管理 - 使用量制御
- モニタリングとロギング - CloudWatchによる監視
- 要約オプション設定 - カスタマイズ可能な出力
必要に応じてKiroに問いかけて、内容を修正します。
今回はサクッと動かせるようにしたかったので、認証認可のCognito部分は外しました。

内容を確認して問題なければ次に進みます。Continue → Generate Design です。

Phase 2: Design(設計)
設計フェーズでは、design.md が生成されます。技術スタック、アーキテクチャ、API設計、DynamoDBテーブル設計などが含まれます。
ChatでDesignフェーズが始まります。作成したRequirementに基づき設計が進みます。

英語でのアウトプットだったので、Kiroに日本語で要約してもらいました。

ざっと読んで、X-Rayは過剰に感じたので消してもらいました。

問題なければ、次の工程に進みます。Continue → Generate Tasksです。

Phase 3: Tasks(タスク分割)
tasks.md に依存関係を考慮したタスクリストが生成されます。
基本的には作ってもらったタスクの順序で開発を進めれば良いと思います。

Run all tasksが使えるので、一気にタスクを進めていきます。

コマンド入力のところで止まるので、対応を決定します。
Trustの粒度も選べます。コマンド自体を無条件で信頼するのか、特定の条件のみで実行を許可するのか。

Kiroはコマンド実行時にはKiro専用のターミナル上で動いてくれるので、何が起こったのか把握しやすいです。

要所要所でテストフェーズが入り、エラーが潰せるまで再帰的にコーディング→テストを実行してくれます。

実装中のポイント
- 各タスクの進捗がtasks.mdで管理される
- 途中で処理が止まっても、タスクの状況を確認して止まった箇所から再開できる
- Hooksが自動で発火し、コード品質レビューとドキュメント更新が走る
- テストも自動生成され、クリアするまでコードが改修される
Step 4: デプロイ & 動作確認
ビルド & デプロイ
実装が完了したら、実際にAWS環境に適用していきましょう。
sam build
sam deploy --guided
sam deployはこんな感じ。初回だけ--guidedをつけてパラメータを設定してください。
XXX has no authorization. Is this Okay?[y/N]が何回か出てきますが、yで進めてください。

デプロイが完了すると、今回作成したリソースのAPI GatewayのURLが発行されます。

2回目以降は、/deploy カスタムスキルを使えば、チャットから一発で実行できます。
動作確認
# デプロイ時の出力からAPI URLを設定(xxxxxxxxxxを置き換えてください)
export API_URL="xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/dev"
メモ登録
curlコマンドでAPIを実行します。まずはメモを順番に登録。
# メモを3件登録
curl -s -X POST $API_URL/memos \
-H "Content-Type: application/json" \
-d '{"title": "課長指示", "content": "3月24日までに売上げレポートをまとめる。"}'
curl -s -X POST $API_URL/memos \
-H "Content-Type: application/json" \
-d '{"title": "議事録", "content": "来期の受注見込みを作成。3月中。"}'
curl -s -X POST $API_URL/memos \
-H "Content-Type: application/json" \
-d '{"title": "トラブル対応", "content": "A案件のトラブル。なる早で対応。"}'
メモ一覧
続いてメモ一覧を取得してみます。
# メモ一覧
curl -s $API_URL/memos | jq
AI質問
メモの内容について、AIに質問してみます。
# 個別メモについてAIに質問(xxxxxxxxxxを実際のメモIDに置き換えてください)
export MEMO_ID="xxxxxxxxxxxxxxxx"
curl -s -X POST $API_URL/memos/$MEMO_ID/ask \
-H "Content-Type: application/json" \
-d '{"question": "このメモには何が入ってる?"}' | jq
AIの回答は得られるものの、メモが短いのであまり意味はないですねw

Step 5: 全メモ要約機能を追加
AIの機能が微妙だったので、全メモ一括要約機能(POST /memos/summary)を追加。
Specセッションを追加して、Kiroに要望を伝えます。初期のSpecと同様に、requirements → design → tasksの流れで進めます。
また、視認性を良くするために、APIレスポンス形式の改善(AcceptヘッダーによるJSON/テキスト切り替え)もSpecとして追加しました。
最終的に、以下の3つのSpecが作成されました。
| Spec | 内容 |
|---|---|
| ai-summary-api | AIメモ要約APIの初期設計(CRUD + AI質問応答) |
| all-memos-summary | 全メモ一括要約機能 |
| api-response-formatting | Acceptヘッダーによるレスポンス形式切り替え |
Kiro上にも要望がSpecの塊として残るので、何をやったか後々追いやすくなっています。

動作確認結果
/deployでサクッとデプロイ後、先ほどと同様にコマンドライン上で動作確認を行います。
# 全メモを一括要約(JSON形式)
curl -s -X POST $API_URL/memos/summary \
-H "Content-Type: application/json" \
-d '{}' | jq
# 全メモを一括要約(テキスト形式 - 読みやすい)
curl -s -X POST $API_URL/memos/summary \
-H "Content-Type: application/json" \
-H "Accept: text/plain" \
-d '{}'
軽いメモ3件でしたが、それらしい出力をしてくれました。
================================================================================
📝 メモ要約結果
================================================================================
📊 処理情報:
• 処理時間: 16.62秒
• 要約対象: 3/3件のメモ
• モデル: us.anthropic.claude-sonnet-4-6
• 切り詰め: なし
--------------------------------------------------------------------------------
📄 要約内容:
## メモの包括的な要約
### 全体的なテーマ・トピック
3件のメモはいずれも**業務上のタスク・アクション項目**に関するものであり、主に**営業・売上管理業務**を中心とした職場での作業指示や課題を記録したものです。
---
### 重要な情報・ポイント
| メモ | 内容 | 優先度・期限 |
|------|------|------------|
| トラブル対応 | A案件のトラブル発生、早急な対応が必要 | **最優先**(なる早) |
| 議事録 | 来期の受注見込み資料の作成 | 3月中 |
| 課長指示 | 売上レポートのとりまとめ | **3月24日まで** |
---
### メモ間の関連性・パターン
- **期限の集中**:複数のタスクが**3月**に集中しており、月末に向けて業務負荷が高まっている状況が伺えます。
- **営業・売上軸**:「受注見込み」「売上レポート」「A案件トラブル」はいずれも**営業活動や売上管理**に関連しており、一貫したテーマが見られます。
- **指示系統**:議事録・課長指示は**上位からの業務指示**である一方、トラブル対応は**現場で発生した緊急課題**という性質の違いがあります。
---
### 主要な結論・洞察
1. **即時対応が必要なタスク**(A案件トラブル)と**期限付きの計画的タスク**(レポート・受注見込み)が混在しており、**優先順位の整理**が重要です。
2. 3月24日の売上レポート提出期限が明確なため、**逆算したスケジュール管理**が求められます。
3. A案件のトラブルが長引く場合、他のタスクへの**影響・遅延リスク**も考慮する必要があります。
4. 月末に向けた**業務の集中**を踏まえ、タスクの分担や進捗管理の仕組みを整えることが望ましいと考えられます。
================================================================================
このような流れでAIメモアシスタントAPIを実装できました。
実際には、デプロイ前後に色々エラーが発生して1回ですんなり行かなかったです。
バグ取り対応についても後ほど残しておきます。
Step 6: お片付け
以下のコマンドを実行することで作成したAWSリソースを削除することが出来ます。
sam delete
本当に消してもよいか聞かれるので、y + Enterで進めます。

CloudFormationスタックが削除され、Lambda、API Gateway、DynamoDBテーブルがすべてクリーンアップされます。
サーバーレスとはいえわずかながら課金されるので、忘れずにお片付けしておきましょう。
成果物など
アーキテクチャ図
draw.io MCPを使って、AWSアーキテクチャ図を生成してみました。
チャットで以下のように指示します。
全てのDesign.mdファイルを確認し、drawioでAWSのアーキテクチャ図を作成してください。
アイコンはAWS公式のものを使ってください。
draw.ioのWeb画面が表示され、以下のようなアーキテクチャ図が生成されます。

実際には1回ですんなり生成できなかったので、何回か修正してもらいました。
draw.io自体をほぼ使ったことないので、今回はおまけ程度です。
AWSリソース
今回作成されたAWSリソースの一覧です。
| リソース | AWSサービス | 概要 |
|---|---|---|
| ApiGateway | API Gateway | REST APIエンドポイント。CORS有効 |
| MemoFunction | Lambda | Python 3.13。メモCRUD操作。メモリ512MB、タイムアウト10秒 |
| AIFunction | Lambda | Python 3.13。個別メモへのAI質問応答。メモリ1024MB、タイムアウト35秒 |
| AllMemosSummaryFunction | Lambda | Python 3.13。全メモ一括要約。メモリ1024MB、タイムアウト65秒 |
| MemoTable | DynamoDB | メモデータの永続化。オンデマンド課金、暗号化有効 |
| LogGroup × 3 | CloudWatch Logs | 各Lambda関数のログ。保持期間7日 |
生成されたプロジェクト構成
.
├── .kiro/
│ ├── steering/ # AIへの常時コンテキスト指示
│ ├── specs/ # 機能仕様書(requirements/design/tasks)
│ ├── hooks/ # IDEイベント連動の自動化フック
│ ├── skills/ # カスタムスキル(/deploy, /cloudformation)
│ └── settings/ # MCP等の設定
├── src/
│ ├── functions/ # Lambda関数ハンドラー
│ │ ├── memo/ # メモCRUD操作
│ │ ├── ai/ # AI質問応答
│ │ └── all_memos_summary/ # 全メモ要約
│ ├── models/ # データモデル
│ ├── repositories/ # データアクセス層
│ ├── services/ # ビジネスロジック
│ └── utils/ # ユーティリティ
├── tests/
│ ├── unit/ # ユニットテスト(60+)
│ ├── property/ # プロパティベーステスト
│ └── integration/ # 統合テスト
├── scripts/ # ユーティリティスクリプト
├── events/ # テスト用イベントペイロード
├── template.yaml # SAMテンプレート
├── samconfig.toml # SAMデプロイ設定
└── requirements.txt
ソースコード
今回構築したアプリのコードはGitHubに公開しています。
コスト見積もり
今回のアプリは従量課金のサーバーレス構成のため、軽い利用であればほぼ利用料は掛かりません。
Bedrockには無料利用枠がない点だけ注意してください。
Kiroのクレジット
今回、新規にアカウント登録したので、ボーナス500クレジットが付与されていました。
おおよそ半分の250クレジット程度でひと通りのアプリが作れましたので、もう少し複雑なアプリにもトライできそう。

(おまけ)バグ対応
生成したプログラムをデプロイする段階でいくつか詰まったポイントが有りましたので、参考までに紹介。
基本的にはKiroにエラー内容を伝えて修正してもらってます。
事例1:Pythonのバージョン
基本的なところですが、
- Kiro推奨:Python 3.12
- 自端末環境:Python 3.13
でバージョンが異なっていたので、まずは自端末の環境に合わせるように修正。

事例2:Lambda実行時エラー
APIを実行してみるとInternal Errorとなり、ログを確認。
Lambda全体にパッケージがうまく割りあたってないということで、コード修正して再デプロイ。

事例3:API Gatewayのトークンエラー
AIを呼び出すLambdaを実行したところMissing Authentication Tokenエラーに。
原因はYAMLファイルの構造が壊れていたためでした。

事例4:AI起動エラー
LLMモデルの指定が誤っており、何度か変更してもらい、ようやく動くようになりました。
最終的なモデルはus.anthropic.claude-sonnet-4-6。

まとめ
今回は、Kiroに再入門してみた〜実践編〜ということで、実際に動くアプリケーションをKiroに作ってもらいました。
少ない指示で複数のAWSサービスを組み合わせたAPIを作れるのはすごいですね。
機能拡張する際も、Specがひとつずつ増えていくのは分かりやすくて良いと思いました。
ただ、複雑な機能になってくると、この辺りがゴチャ付いてしまう気もしています。
バグ取りもKiroにお任せでクリアできましたが、そもそもバグが出ちゃうのは避けられないのかな?
ただやっぱりUIがないとちょっと寂しいので、もう少し遊んでみてWeb画面の作成でも活用できたらなぁと思います。
以上です!









