0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS Kiro に再入門してみた - 実践編

0
Posted at

はじめに

まずは結論から

  • Kiro の仕様駆動開発で実際にAWS上で動くAPIを構築してみた
  • Bedrock(Claude Sonnet 4.6) + Lambda + API Gateway + DynamoDB のサーバーレス構成
  • 構築したアプリのコードはGitHubに公開

想定される読者

前回の機能編では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.jsondraw.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 buildsam deploy を実行し、API GatewayのURLを表示

KiroPrepareSteering.png

Hooks 設定

以下の2つのHookを設定しておきます。

フック トリガー 動作
code-quality-review .py .ts 等のソースファイル保存時 コード品質レビュー(コードスメル・設計パターン・セキュリティ等)を自動実施
docs-on-code-change .py template.yaml requirements.txt 保存時 README.md等の関連ドキュメントを自動更新

KiroPrepareHooks.png

Bedrock モデルアクセスの有効化

AWSコンソールの us-west-2(オレゴン) リージョンで Bedrock のモデルアクセスを有効化しておきます。
今回は Claude Sonnet 4.6 を使用します。

Step 2: 仕様駆動開発でAPI作成

Specセッションの開始

Specセッションを開始します。

まずは以下のように簡単な要件を記入します。

AWS上でサーバーレスに稼働するAI要約APIを作りたい。

Phase 1: Requirements(要件定義)

Kiroが requirements.md を自動生成します。
各要件にはユーザーストーリーと受け入れ基準が含まれます。

KiroSpecStart.png

新規チャットが立ち上がり、会話がスタートします。
KiroSpecRequirementStart.png

いくつかの問いかけに対して、回答を選択してSubmit Answerで進めると、Requirementを作成してくれます。
KiroSpecRequirement.png

Kiroの要約によると、こんな感じの内容みたいです。

  1. テキスト要約API - 基本的な要約機能
  2. 認証と認可 - Cognitoによるセキュリティ
  3. 非同期処理 - 大きなテキストの処理
  4. 要約結果の永続化 - DynamoDBでの保存
  5. AI統合 - 複数のAIサービス対応
  6. レート制限とコスト管理 - 使用量制御
  7. モニタリングとロギング - CloudWatchによる監視
  8. 要約オプション設定 - カスタマイズ可能な出力

必要に応じてKiroに問いかけて、内容を修正します。
今回はサクッと動かせるようにしたかったので、認証認可のCognito部分は外しました。
KiroSpecRequirementModify.png

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

Phase 2: Design(設計)

設計フェーズでは、design.md が生成されます。技術スタック、アーキテクチャ、API設計、DynamoDBテーブル設計などが含まれます。

ChatでDesignフェーズが始まります。作成したRequirementに基づき設計が進みます。
KiroSpecDesignStart.png

こんな感じで設計書を作ってくれました。
KiroSpecDesignOutput.png

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

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

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

Phase 3: Tasks(タスク分割)

tasks.md に依存関係を考慮したタスクリストが生成されます。

基本的には作ってもらったタスクの順序で開発を進めれば良いと思います。
KiroSpecTask.png

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

コマンド入力のところで止まるので、対応を決定します。

  • Run: 今回のコマンドを実行します
  • Trust: コマンドを信頼し、次回以降同じコマンドの入力が合った際は確認なしに実行します
    KiroSpecTaskCommand.png

Trustの粒度も選べます。コマンド自体を無条件で信頼するのか、特定の条件のみで実行を許可するのか。
KiroSpecTaskCommandTrust.png

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

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

実装中のポイント

  • 各タスクの進捗がtasks.mdで管理される
  • 途中で処理が止まっても、タスクの状況を確認して止まった箇所から再開できる
  • Hooksが自動で発火し、コード品質レビューとドキュメント更新が走る
  • テストも自動生成され、クリアするまでコードが改修される

Step 4: デプロイ & 動作確認

ビルド & デプロイ

実装が完了したら、実際にAWS環境に適用していきましょう。

sam build
sam deploy --guided

sam buildはこんな感じ。
KiroSamBuild.png

sam deployはこんな感じ。初回だけ--guidedをつけてパラメータを設定してください。
XXX has no authorization. Is this Okay?[y/N]が何回か出てきますが、yで進めてください。
KiroSamDeploy.png

デプロイしてよいかの最終確認が入るので、yで実行。
KiroSamDeployConfirm.png

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

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案件のトラブル。なる早で対応。"}'

実行結果は以下のような感じ。
KiroExecuteAdd.png

メモ一覧

続いてメモ一覧を取得してみます。

# メモ一覧
curl -s $API_URL/memos | jq

登録されたメモの内容が確認できます。
KiroExecuteList.png

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
KiroExecuteAI.png

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の塊として残るので、何をやったか後々追いやすくなっています。
KiroSpecAdd.png

動作確認結果

/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で進めます。
KiroDelete.png

CloudFormationスタックが削除され、Lambda、API Gateway、DynamoDBテーブルがすべてクリーンアップされます。
サーバーレスとはいえわずかながら課金されるので、忘れずにお片付けしておきましょう。

成果物など

アーキテクチャ図

draw.io MCPを使って、AWSアーキテクチャ図を生成してみました。

チャットで以下のように指示します。

全てのDesign.mdファイルを確認し、drawioでAWSのアーキテクチャ図を作成してください。
アイコンはAWS公式のものを使ってください。

draw.ioのWeb画面が表示され、以下のようなアーキテクチャ図が生成されます。
aws-architecture.png

実際には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クレジット程度でひと通りのアプリが作れましたので、もう少し複雑なアプリにもトライできそう。
KiroCreditRemain.png

(おまけ)バグ対応

生成したプログラムをデプロイする段階でいくつか詰まったポイントが有りましたので、参考までに紹介。

基本的にはKiroにエラー内容を伝えて修正してもらってます。

事例1:Pythonのバージョン

基本的なところですが、

  • Kiro推奨:Python 3.12
  • 自端末環境:Python 3.13

でバージョンが異なっていたので、まずは自端末の環境に合わせるように修正。
KiroBug01.png

事例2:Lambda実行時エラー

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

事例3:API Gatewayのトークンエラー

AIを呼び出すLambdaを実行したところMissing Authentication Tokenエラーに。
原因はYAMLファイルの構造が壊れていたためでした。
KiroBug03.png

事例4:AI起動エラー

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

まとめ

今回は、Kiroに再入門してみた〜実践編〜ということで、実際に動くアプリケーションをKiroに作ってもらいました。

少ない指示で複数のAWSサービスを組み合わせたAPIを作れるのはすごいですね。

機能拡張する際も、Specがひとつずつ増えていくのは分かりやすくて良いと思いました。
ただ、複雑な機能になってくると、この辺りがゴチャ付いてしまう気もしています。

バグ取りもKiroにお任せでクリアできましたが、そもそもバグが出ちゃうのは避けられないのかな?

ただやっぱりUIがないとちょっと寂しいので、もう少し遊んでみてWeb画面の作成でも活用できたらなぁと思います。

以上です!

参考リンク

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?