Amazon Q Developer CLIのカスタムエージェントを使用してみた
はじめに
こんにちは、コンサルティング部の神野です。
2025年7月31日、Amazon Q Developer CLIにカスタムエージェント機能がリリースされました!
カスタムエージェント機能はMCPサーバーの設定や、プロンプト、hooksの切り替えを行い、目的に合わせてAmazon Q Developer CLIを切り替えて最適化されたエージェントとして使用することができます。
簡単に言うと、「この作業の時はこの設定」「あの作業の時はあの設定」という風に、シーンに応じてエージェントを使い分けられる機能です。
例えばモノレポでバックエンド・フロントエンド・インフラの設計書やコードが混在している場合、複数のMCPサーバーを設定していると、Amazon Q Developerが質問に対して混乱して、適切に回答できない、意図とは異なるMCPサーバーを使用するなどの問題が発生することがあります。
カスタムエージェント機能を使えば、目的に応じて最適なエージェントを切り替えられるので、このような課題を解決できる可能性があります。
今回は、Amazon Q Developer CLIの新機能「カスタムエージェント」を使って、モノレポでの設計書レビューを題材に方法をご紹介します。
今回作るもの
- フロントエンド設計書レビュー用エージェント
- インフラ設計書レビュー用エージェント
それぞれが独立したコンテキストとMCPサーバー設定を持ち、混乱なくレビューできる環境を構築します!
前提条件
- Amazon Q Developer CLI がインストール済み
- version 1.13.1
- Node.js v20以上(MCPサーバー実行用)
- モノレポ構造のプロジェクトは下記のような作りにします
なお、今回はカスタムエージェントの効果を分かりやすくするため、サンプルの設計書を用意しました。実際のプロジェクトでありがちな問題(セキュリティリスクやパフォーマンスの課題など)を含めています。
project/
├── frontend/
│ └── design-docs/
│ └── ui-architecture.md
└── infrastructure/
├── main.tf
└── design-docs/
└── aws-architecture.md
フロントエンドの設計書
サンプルの設計書を用意します。
長いので折りたたんでおきます。
フロントエンドUIアーキテクチャ設計書
# フロントエンドUIアーキテクチャ設計書
## 1. 概要
### 1.1 プロジェクト概要
ECサイトのフロントエンドアプリケーションのUIアーキテクチャ設計書です。
React 18とTypeScriptを使用したSPAとして実装します。
### 1.2 対象ユーザー
- 一般消費者(B2C)
- 月間アクティブユーザー: 10万人想定
- 同時接続数: ピーク時5,000人
## 2. 技術スタック
- **フレームワーク**: React 18.2
- **言語**: TypeScript 5.0
- **状態管理**: Redux Toolkit
- **スタイリング**: CSS Modules + Tailwind CSS
- **HTTPクライアント**: Axios
- **ルーティング**: React Router v6
- **ビルドツール**: Vite
## 3. アーキテクチャ概要
### 3.1 コンポーネント構造
src/
├── components/
│ ├── common/ # 共通コンポーネント
│ ├── features/ # 機能別コンポーネント
│ └── layouts/ # レイアウトコンポーネント
├── pages/ # ページコンポーネント
├── hooks/ # カスタムフック
├── services/ # API通信層
├── store/ # Redux Store
├── types/ # TypeScript型定義
└── utils/ # ユーティリティ関数
### 3.2 状態管理設計
#### グローバル状態(Redux)
- ユーザー認証情報
- カート情報
- 商品一覧のキャッシュ
#### ローカル状態(useState/useReducer)
- フォームの入力値
- UIの表示/非表示状態
- ページネーション状態
### 3.3 データフロー
1. ユーザーアクション → Componentでイベントハンドリング
2. APIコール(services層経由)
3. レスポンスをRedux Storeに保存
4. コンポーネントの再レンダリング
## 4. API通信設計
### 4.1 エンドポイント構成
```typescript
const API_BASE_URL = process.env.REACT_APP_API_URL || 'http://localhost:3000/api';
// APIエンドポイント
/api/auth/login POST ログイン
/api/auth/logout POST ログアウト
/api/products GET 商品一覧取得
/api/products/{id} GET 商品詳細取得
/api/cart GET カート取得
/api/cart/items POST カート追加
/api/orders POST 注文作成
4.2 エラーハンドリング
// 問題: エラーレスポンスの形式が統一されていない
// 一部のエンドポイントでは message、他では error_message を使用
interface ErrorResponse {
message?: string; // 認証系API
error_message?: string; // 商品系API
code: string;
}
// TODO: バックエンドと協議して統一する必要あり
4.3 認証処理
JWTトークンを使用した認証を実装。
トークンはlocalStorageに保存(セキュリティリスクあり)。
// 問題: localStorageは XSS攻撃に脆弱
localStorage.setItem('authToken', token);
// 改善案: httpOnly Cookieの使用を検討
5. パフォーマンス最適化
5.1 コード分割
React.lazyを使用したルートレベルでのコード分割を実装。
const ProductList = React.lazy(() => import('./pages/ProductList'));
const ProductDetail = React.lazy(() => import('./pages/ProductDetail'));
5.2 キャッシュ戦略
- 問題点: 現在キャッシュ戦略が未定義
- 商品一覧のキャッシュ期間が不明確
- stale-while-revalidateパターンの実装が必要
5.3 画像最適化
- lazy loading未実装
- WebP形式への対応なし
- レスポンシブ画像の最適化が不十分
6. アクセシビリティ
6.1 実装済み項目
- セマンティックHTML
- altテキストの設定
- キーボードナビゲーション対応
6.2 未対応項目
- スクリーンリーダー対応が不完全
- ARIAラベルの設定が不十分
- コントラスト比の検証未実施
7. セキュリティ考慮事項
7.1 XSS対策
- Reactのデフォルトエスケープに依存
- dangerouslySetInnerHTMLの使用箇所なし
7.2 CSRF対策
- 未実装: CSRFトークンの実装が必要
7.3 認証・認可
- JWTトークンの有効期限: 24時間
- リフレッシュトークン: 未実装
- ロール別アクセス制御: 未実装
8. テスト戦略
8.1 単体テスト
- Jest + React Testing Library
- カバレッジ目標: 80%
- 現在のカバレッジ: 45%(改善必要)
8.2 E2Eテスト
- Cypress使用予定(未実装)
9. 監視・ログ
9.1 エラー監視
- Sentryの導入予定
- 現在はconsole.errorのみ
9.2 パフォーマンス監視
- Web Vitalsの測定未実装
- Google Analyticsのみ導入済み
10. 今後の課題
優先度: 高
- エラーレスポンス形式の統一
- 認証トークンのセキュア化(httpOnly Cookie)
- キャッシュ戦略の明確化
- CSRFトークンの実装
優先度: 中
- テストカバレッジの向上
- E2Eテストの実装
- パフォーマンス監視の強化
- アクセシビリティの改善
優先度: 低
- 画像最適化の改善
- PWA対応
- 国際化(i18n)対応
11. 更新履歴
- 2024-01-15: 初版作成
- 2024-01-20: セキュリティセクション追加
- 2024-01-25: パフォーマンス最適化セクション更新
インフラの設計書
こちらも長いので折りたたんでおきます。
AWSインフラストラクチャ設計書
# AWSインフラストラクチャ設計書
## 1. 概要
### 1.1 プロジェクト概要
ECサイトのAWSインフラストラクチャ設計書です。
高可用性とスケーラビリティを考慮した構成を目指しています。
### 1.2 要件
- **可用性**: 99.9%(年間ダウンタイム8.76時間以内)
- **ユーザー数**: 月間アクティブユーザー10万人
- **ピーク時負荷**: 同時接続5,000人
- **データ保持**: 注文データ7年間保持
- **リージョン**: ap-northeast-1(東京)
## 2. アーキテクチャ概要
### 2.1 全体構成図
```
Internet
|
↓
CloudFront (CDN)
|
↓
Route 53 (DNS)
|
↓
ALB (Application Load Balancer)
|
├─── AZ-1a ───┐
│ │
│ EC2 │
│ (Web) │
│ │
└─── AZ-1c ───┘
|
↓
RDS (PostgreSQL)
Single-AZ ← 問題点
```
### 2.2 使用するAWSサービス
- **ネットワーク**: VPC, ALB, CloudFront, Route 53
- **コンピューティング**: EC2, Auto Scaling
- **データベース**: RDS (PostgreSQL)
- **ストレージ**: S3, EBS
- **セキュリティ**: WAF(未設定), Security Groups, IAM
- **監視**: CloudWatch, X-Ray(未設定)
## 3. ネットワーク設計
### 3.1 VPC構成
```yaml
VPC:
CIDR: 10.0.0.0/16
Subnets:
Public:
- az-1a: 10.0.1.0/24
- az-1c: 10.0.2.0/24
Private:
- az-1a: 10.0.10.0/24
- az-1c: 10.0.11.0/24
Database:
- az-1a: 10.0.20.0/24
- az-1c: 10.0.21.0/24 # 未使用(Single-AZのため)
```
### 3.2 セキュリティグループ
#### ALB用セキュリティグループ
```
Inbound:
- HTTP (80): 0.0.0.0/0
- HTTPS (443): 0.0.0.0/0
Outbound:
- All traffic: 0.0.0.0/0
```
#### EC2用セキュリティグループ
```
Inbound:
- HTTP (80): ALB-SG
- SSH (22): 踏み台サーバーIP # 問題: 直接SSHアクセス可能
Outbound:
- All traffic: 0.0.0.0/0
```
#### RDS用セキュリティグループ
```
Inbound:
- PostgreSQL (5432): EC2-SG
Outbound:
- なし
```
### 3.3 問題点
1. **NAT Gateway未設定**
- プライベートサブネットからのインターネットアクセス不可
- パッケージアップデートができない
2. **VPCエンドポイント未設定**
- S3へのアクセスがインターネット経由
- データ転送料金が発生
## 4. コンピューティング設計
### 4.1 EC2構成
```yaml
インスタンスタイプ: t3.medium
OS: Amazon Linux 2
台数:
最小: 2
希望: 4
最大: 10
Auto Scaling設定:
スケールアウト: CPU使用率 > 70%
スケールイン: CPU使用率 < 30%
問題点:
- t3.mediumでは負荷に耐えられない可能性
- Reserved Instance未使用
```
### 4.2 Application Load Balancer
```yaml
タイプ: Application
スキーム: internet-facing
リスナー:
- Port 80 → Port 443リダイレクト
- Port 443 → Target Group
ヘルスチェック:
パス: /health
間隔: 30秒
タイムアウト: 5秒
問題点:
- スティッキーセッション有効(スケーラビリティ低下)
```
## 5. データベース設計
### 5.1 RDS構成
```yaml
エンジン: PostgreSQL 14
インスタンスクラス: db.t3.medium
ストレージ: 100GB (gp2)
可用性: Single-AZ # 重大な問題
バックアップ:
保持期間: 7日間
バックアップウィンドウ: 03:00-04:00 JST
問題点:
- Single-AZ構成(可用性要件未達)
- Read Replica未設定
- 暗号化未設定
```
### 5.2 パフォーマンス問題
1. **接続プール未設定**
- max_connections: デフォルト値
- コネクション枯渇の可能性
2. **監視不足**
- スロークエリログ未設定
- Performance Insights無効
## 6. ストレージ設計
### 6.1 S3構成
```yaml
バケット:
- ec-site-static: 静的コンテンツ
- ec-site-uploads: ユーザーアップロード
- ec-site-backups: バックアップ
問題点:
- バージョニング未設定
- ライフサイクルポリシー未設定
- アクセスログ未設定
- 暗号化: SSE-S3のみ(KMS未使用)
```
### 6.2 CloudFront設定
```yaml
オリジン:
- S3: 静的コンテンツ
- ALB: 動的コンテンツ
キャッシュ動作:
- *.jpg, *.png: 7日間
- *.css, *.js: 1日間
- /api/*: キャッシュなし
問題点:
- OAI(Origin Access Identity)未設定
- S3バケットが直接アクセス可能
```
## 7. セキュリティ設計
### 7.1 IAMロール
#### EC2用IAMロール
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:*"], // 問題: 権限が広すぎる
"Resource": "*"
}
]
}
```
### 7.2 セキュリティ上の問題
1. **WAF未設定**
- SQLインジェクション対策なし
- XSS対策なし
- Rate Limiting なし
2. **Secrets Manager未使用**
- データベースパスワードが環境変数に平文保存
3. **CloudTrail未設定**
- API呼び出しの監査ログなし
4. **GuardDuty未設定**
- 脅威検知なし
## 8. 監視・ログ設計
### 8.1 CloudWatch設定
#### 設定済みメトリクス
- EC2: CPU使用率、ネットワーク
- RDS: CPU使用率、接続数
- ALB: リクエスト数、エラー率
#### 未設定項目
- カスタムメトリクス
- ログ収集(CloudWatch Logs)
- ダッシュボード
- 詳細モニタリング
### 8.2 アラート設定
```yaml
設定済み:
- RDS CPU > 80%
- EC2 StatusCheck Failed
未設定:
- アプリケーションエラー率
- レスポンスタイム
- ディスク使用率
```
## 9. 災害復旧(DR)計画
### 9.1 現状
- **RPO(目標復旧時点)**: 未定義
- **RTO(目標復旧時間)**: 未定義
- **バックアップ**: RDS自動バックアップのみ
- **リージョン間レプリケーション**: なし
### 9.2 問題点
1. DR計画が未策定
2. 別リージョンへのバックアップなし
3. 復旧手順書なし
4. 定期的な復旧訓練なし
## 10. コスト最適化
### 10.1 現在の月額コスト(推定)
| サービス | 構成 | 月額費用 |
|---------|------|----------|
| EC2 | t3.medium × 4台 | $120 |
| RDS | db.t3.medium Single-AZ | $85 |
| ALB | 1台 | $25 |
| S3 | 500GB | $12 |
| CloudFront | 1TB転送 | $85 |
| Route 53 | 1ホストゾーン | $50 |
| **合計** | | **$450** |
### 10.2 コスト削減案
1. **Reserved Instance購入**
- EC2: 1年前払いで30%削減
- RDS: 1年前払いで28%削減
- 年間削減額: 約$1,620
2. **スポットインスタンス活用**
- バッチ処理用EC2に適用
- 最大70%のコスト削減
3. **S3ライフサイクル**
- 古いデータをGlacierへ移行
- ストレージコスト80%削減
## 11. Well-Architected評価
### 11.1 信頼性の柱: 65/100
**良い点:**
- Multi-AZ構成のALB
- Auto Scaling設定
**改善点:**
- RDS Single-AZ(重大)
- バックアップ戦略不足
- DR計画なし
### 11.2 セキュリティの柱: 45/100
**良い点:**
- VPC によるネットワーク分離
- Security Groups設定
**改善点:**
- WAF未設定(重大)
- 暗号化不足
- 監査ログなし
- 最小権限の原則違反
### 11.3 パフォーマンス効率の柱: 70/100
**良い点:**
- CloudFront使用
- Auto Scaling
**改善点:**
- Read Replica未設定
- キャッシュ戦略不十分
### 11.4 コスト最適化の柱: 55/100
**良い点:**
- 必要最小限のリソース
**改善点:**
- Reserved Instance未使用
- ライフサイクルポリシー未設定
### 11.5 運用上の優秀性の柱: 40/100
**良い点:**
- 基本的な監視設定
**改善点:**
- ログ集約なし
- 自動化不足
- runbook/playbook なし
## 12. 改善ロードマップ
### Phase 1: 緊急対応(1ヶ月以内)
1. **WAF設定**
- OWASP Top 10対策
- Rate Limiting
2. **RDS Multi-AZ化**
- ダウンタイムを最小化して移行
3. **Secrets Manager導入**
- データベースパスワード管理
### Phase 2: セキュリティ強化(3ヶ月以内)
1. **暗号化実装**
- RDS暗号化
- S3 KMS暗号化
2. **監査ログ設定**
- CloudTrail有効化
- GuardDuty有効化
3. **IAM権限見直し**
- 最小権限の原則適用
### Phase 3: 可用性向上(6ヶ月以内)
1. **DR計画策定**
- クロスリージョンバックアップ
- 復旧手順書作成
2. **監視強化**
- CloudWatch Logs設定
- X-Ray導入
3. **パフォーマンス改善**
- Read Replica設定
- ElastiCache導入検討
## 13. 更新履歴
- 2024-01-05: 初版作成
- 2024-01-12: セキュリティセクション追加
- 2024-01-20: Well-Architected評価追加
- 2024-01-25: コスト最適化案追加
インフラのTerraformコード
main.tf
# main.tf
terraform {
required_version = ">= 1.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = "ap-northeast-1"
}
# VPC
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
enable_dns_hostnames = true
enable_dns_support = true
tags = {
Name = "ecommerce-vpc"
}
}
# Internet Gateway
resource "aws_internet_gateway" "main" {
vpc_id = aws_vpc.main.id
tags = {
Name = "ecommerce-igw"
}
}
# Public Subnets
resource "aws_subnet" "public_1a" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.1.0/24"
availability_zone = "ap-northeast-1a"
map_public_ip_on_launch = true
tags = {
Name = "ecommerce-public-1a"
}
}
resource "aws_subnet" "public_1c" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.2.0/24"
availability_zone = "ap-northeast-1c"
map_public_ip_on_launch = true
tags = {
Name = "ecommerce-public-1c"
}
}
# Private Subnets
resource "aws_subnet" "private_1a" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.11.0/24"
availability_zone = "ap-northeast-1a"
tags = {
Name = "ecommerce-private-1a"
}
}
resource "aws_subnet" "private_1c" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.12.0/24"
availability_zone = "ap-northeast-1c"
tags = {
Name = "ecommerce-private-1c"
}
}
# Security Group for ALB
resource "aws_security_group" "alb" {
name = "ecommerce-alb-sg"
description = "Security group for ALB"
vpc_id = aws_vpc.main.id
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "ecommerce-alb-sg"
}
}
# Security Group for EC2
resource "aws_security_group" "ec2" {
name = "ecommerce-ec2-sg"
description = "Security group for EC2 instances"
vpc_id = aws_vpc.main.id
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
security_groups = [aws_security_group.alb.id]
}
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"] # セキュリティリスク!
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "ecommerce-ec2-sg"
}
}
# RDS Subnet Group
resource "aws_db_subnet_group" "main" {
name = "ecommerce-db-subnet-group"
subnet_ids = [aws_subnet.private_1a.id, aws_subnet.private_1c.id]
tags = {
Name = "ecommerce-db-subnet-group"
}
}
# Security Group for RDS
resource "aws_security_group" "rds" {
name = "ecommerce-rds-sg"
description = "Security group for RDS"
vpc_id = aws_vpc.main.id
ingress {
from_port = 3306
to_port = 3306
protocol = "tcp"
security_groups = [aws_security_group.ec2.id]
}
tags = {
Name = "ecommerce-rds-sg"
}
}
# RDS Instance (Single-AZ構成 - 可用性リスク!)
resource "aws_db_instance" "main" {
identifier = "ecommerce-db"
engine = "mysql"
engine_version = "8.0.35"
instance_class = "db.t3.micro"
allocated_storage = 20
max_allocated_storage = 100
storage_type = "gp2"
storage_encrypted = false # セキュリティリスク!
db_name = "ecommerce"
username = "admin"
password = "SuperSecret123!" # 平文パスワード - セキュリティリスク!
vpc_security_group_ids = [aws_security_group.rds.id]
db_subnet_group_name = aws_db_subnet_group.main.name
multi_az = false # Single-AZ - 可用性リスク!
backup_retention_period = 7
backup_window = "03:00-04:00"
maintenance_window = "sun:04:00-sun:05:00"
skip_final_snapshot = true
tags = {
Name = "ecommerce-db"
}
}
カスタムエージェントの設定ファイル構造
まず、カスタムエージェントの設定ファイルがどのような構造になっているか、各パラメータの役割を詳しく見ていきましょう。
ファイル配置場所:グローバル vs プロジェクト
カスタムエージェントの設定ファイルは以下の2箇所に配置できます(公式ドキュメント 参照)。
スコープ | ディレクトリ | 特徴 |
---|---|---|
グローバル | ~/.aws/amazonq/cli-agents/{agent-name}.json |
どのプロジェクトからでも利用可能。個人用や汎用的なワークフロー向け。 |
プロジェクト | .amazonq/cli-agents/{agent-name}.json |
そのプロジェクト配下でのみ有効。チーム共有やプロジェクト特有の設定に最適。 |
同名のエージェントが両方に存在する場合は プロジェクト(ローカル)側が優先 され、CLI はコンフリクトを警告します。これによりプロジェクト固有のカスタマイズを安全に上書きできます。
個人的によく使うエージェントならグローバル、プロジェクトメンバーが同一の設定でエージェントを使いたいなどのケースはプロジェクトのような使い分けですかね。
設定ファイルの基本構造
{
"name": "エージェント名",
"description": "エージェントの説明",
"mcpServers": { /* MCP設定 */ },
"tools": [ /* 利用可能ツール */ ],
"allowedTools": [ /* 信頼するツール */ ],
"resources": [ /* 静的リソース */ ],
"hooks": { /* 起動時処理 */ },
"prompt": "エージェントへの指示"
}
この構造を見ていると、通常のMCP設定ファイルとは異なり、エージェント固有のコンテキストやリソースを定義できるようになっているのが特徴的ですね。特にresources
やprompt
の部分は、タスクに特化した設定を行う上で重要な要素となりそうです。
各パラメータの詳細説明
name & description
{
"name": "app-design-reviewer",
"description": "アプリケーション設計書レビュー用"
}
name
はq chat --agent [name]
で使用する識別子なので、短くて分かりやすい名前にするのがポイントです。また、description
はエージェント一覧で表示されるため、目的が一目で分かるように書いておくと便利ですね。
- name:
q chat --agent [name]
で使用する識別子 - description: エージェントの目的を記述
mcpServers
{
"mcpServers": {
"figma": {
"command": "npx",
"args": ["figma-mcp-server"],
"env": {
"FIGMA_TOKEN": "xxxxx"
}
}
}
}
こちらがカスタムエージェントの特に強力な部分で、このエージェント専用のMCPサーバーだけを有効化できます。コンテキストごとに必要なMCPサーバーのみ設定できるので良いですね。
- このエージェント専用のMCPサーバー設定
- 不要なMCPサーバーを除外できる
tools & allowedTools
{
"tools": ["*"],
"allowedTools": [
"fs_read",
"fs_write",
"@figma/get_design"
]
}
tools
で使用するツールを許可し、allowedTools
でユーザー確認なしで実行できるツールを指定できます。この設定により、頻繁に使用する安全なツールは確認なしで実行され、作業効率を向上させることができます。
- tools: 利用可能なツールの範囲(
"*"
で全ツール) - allowedTools: ユーザー確認なしで実行できる信頼済みツール
resources
{
"resources": [
"file://./frontend/design-docs/**/*.md",
"file://~/.aws/amazonq/ui-guidelines.md"
]
}
resources
はエージェントが自動的にコンテキストに含めるファイルを指定します。globパターンに対応しているため、特定のディレクトリ以下のファイルを一括で指定できて便利です。また、ホームディレクトリに置いたガイドラインファイルなどを指定しておけば、レビューの観点を統一できそうです。
- 自動的にコンテキストに含めるファイル
- globパターン対応(
**/*.md
) - 相対パスと絶対パスの両方が使用可能
hooks
{
"hooks": {
"agentSpawn": [
{
"command": "pwd",
"description": "現在のディレクトリ確認"
}
]
}
}
hooks
はエージェント起動時に自動で実行されるコマンドを定義できます。これにより、エージェントが動作するために必要な情報(現在のディレクトリ、ファイル一覧など)を事前に収集し、コンテキストに含めることができます。特にプロジェクト固有の情報を収集したい場合に有効ですね。
- agentSpawn: エージェント起動時に実行
- コマンドの実行結果がコンテキストに追加される
- 動的な情報の取得に便利
便利ですよね。後はユーザーが会話したタイミングで実行するuserPromptSubmit
も設定可能です。
prompt
{
"prompt": "あなたはUI/UXの専門家です。ユーザビリティと保守性の観点から設計書をレビューしてください。"
}
prompt
はいわゆるシステムプロンプトで、エージェントの振る舞いや専門性を定義します。ここでレビューの観点、出力フォーマット、重視するポイントなどを指定することで、一貫したレビューを実現するのに役立ちます。
- エージェントの振る舞いを定義
- 専門性や重視する観点を指定
- レビューの形式や出力フォーマットも指定可能
実装:アプリケーション設計書レビュー用エージェント
フロントエンドとバックエンドの設計書に特化したエージェントを作成します。
設定ファイルの作成
~/.aws/amazonq/cli-agents/app-design-reviewer.json
{
"name": "frontend-design-reviewer",
"description": "フロントエンド設計書レビュー用エージェント",
"mcpServers": {},
"tools": ["fs_read", "report_issue"],
"allowedTools": [
"fs_read"
],
"resources": [
"file://./frontend/design-docs/**/*.md",
"file://./shared/api-spec.yaml",
"file://~/.aws/amazonq/frontend-guidelines.md"
],
"hooks": {
"agentSpawn": [
{
"command": "find ./frontend/design-docs -name '*.md' | head -5",
"description": "レビュー対象確認"
}
]
},
"prompt": "あなたはフロントエンド設計の専門家です。\n\n以下の観点でレビューしてください:\n- UI/UXデザインとの整合性\n- コンポーネント設計\n- 状態管理\n- パフォーマンス(レンダリング効率)\n- アクセシビリティ\n- API連携の設計\n\nユーザビリティと保守性を重視した評価をお願いします。"
}
このアプリケーション設計書レビュー用エージェントの設定でmcpServers
は設定しないことにしました。フロントエンドのレビューでは基本的なファイル読み取りだけで十分と考えたからです。また、resources
でガイドラインファイルやAPI仕様書を指定しておくことで、必要な観点を含めたレビューが可能になります。
実装:インフラ設計書レビュー用エージェント
AWS等のインフラ設計書に特化したエージェントを作成します。
設定ファイルの作成
~/.aws/amazonq/cli-agents/infra-design-reviewer.json
:
{
"name": "infra-design-reviewer",
"description": "インフラストラクチャ設計書レビュー用エージェント",
"mcpServers": {
"aws-docs": {
"command": "uvx",
"args": ["awslabs.aws-documentation-mcp-server@latest"]
},
"aws-pricing": {
"command": "uvx",
"args": [
"awslabs.aws-pricing-mcp-server@latest"
],
"env": {
"AWS_REGION": "ap-northeast-1"
}
}
},
"tools": ["*"],
"allowedTools": [
"fs_read",
"fs_write",
"execute_bash",
"use_aws",
"report_issue",
"@aws-docs",
"@aws-pricing"
],
"resources": [
"file://./infrastructure/design-docs/**/*.md",
"file://./infrastructure/terraform/**/*.tf",
"file://./infrastructure/sample-code/**/*.js",
"file://~/.aws/amazonq/aws-well-architected.md"
],
"hooks": {
"agentSpawn": [
{
"command": "find ./infrastructure -name '*.md' -o -name '*.tf' -o -name '*.js' | head -5",
"description": "レビュー対象確認"
}
]
},
"prompt": "あなたはAWS Well-Architectedの専門家です。\n\n【重要】MCPサーバーを必ず使用してレビューを行ってください:\n- @aws-docsを必ず使用して最新のAWS公式ドキュメントを参照すること\n- @aws-pricing/get_pricingを必ず使用してコスト分析を実施すること\n- レビュー時は必ずこれらのツールで最新情報を確認してから回答すること\n\n以下の観点でレビューしてください:\n- 可用性とスケーラビリティ\n- セキュリティ(最小権限の原則)\n- コスト最適化\n- 運用性(監視・ログ)\n- パフォーマンス効率\n\n必ず最新のAWSベストプラクティスに基づいて評価し、具体的な改善提案を提供してください。MCPサーバーを使用せずに回答することは禁止です。"
}
インフラ設計書レビュー用エージェントでは、AWS公式のMCPサーバーを積極的に活用しているのが特徴です。特にAWS Documentation MCP Server
で最新のベストプラクティスを参照し、AWS Pricing MCP Server
で正確なコスト情報を取得することで、より信頼性の高いレビューが可能になります。
prompt
でMCPサーバーの使用を義務付けているのも、最新情報に基づいたレビューを確実に行うための工夫です。
動作確認
ここで、カスタムエージェントの効果を確認してみましょう。
同じ設計書を異なるエージェントでレビューして、どのような違いが出るか比較してみたいと思います。
フロントエンド設計書のレビュー:カスタムエージェントを使用しない場合
まずは、カスタムエージェントを使わない従来の方法で確認してみましょう。
前提なども特に入れずシンプルにレビューしてとだけお願いしてみます。
q chat
Q> frontend/design-docs/ui-architecture.mdをレビューしてください
実行結果
> このUI アーキテクチャ設計書をレビューしました。全体的によく構成されていますが、いくつかの改善点があります。
## 良い点
• **構造化された文書**: セクションが論理的に整理されており、読みやすい
• **技術スタックの明確化**: 使用技術が具体的に記載されている
• **問題点の認識**: セキュリティやパフォーマンスの課題を明確に特定している
• **優先度付けされた課題管理**: 今後の課題が優先度別に整理されている
## 改善すべき点
### 1. アーキテクチャ図の不足
現在テキストベースの説明のみです。以下を追加することを推奨します:
• コンポーネント階層図
• データフロー図
• システム全体のアーキテクチャ図
### 2. 具体的な実装例の不足
typescript
// 現在の記載例
const ProductList = React.lazy(() => import('./pages/ProductList'));
// より詳細な実装例が必要
// - エラーバウンダリーの実装
// - ローディング状態の処理
// - フォールバック UI の設計
### 3. パフォーマンス指標の具体化
• 「月間10万人、同時接続5,000人」の根拠が不明
• 具体的なパフォーマンス目標値(LCP、FID、CLSなど)が未定義
• バンドルサイズの目標値が未設定
### 4. セキュリティ対策の詳細化
typescript
// 現在の課題として挙げられているが、解決策が不十分
// 以下の詳細な対策を追加すべき:
- Content Security Policy (CSP) の設定
- HTTPS の強制
- 依存関係の脆弱性スキャン戦略
### 5. 状態管理の設計詳細
• Redux の store 構造が不明確
• 非同期処理(Redux Thunk/RTK Query)の方針が未記載
• 状態の正規化戦略が未定義
### 6. エラーハンドリング戦略の強化
現在の記載では API エラーのみですが、以下も必要:
• ネットワークエラー
• アプリケーションエラー
• ユーザーへのエラー表示方針
## 推奨する追加セクション
### デプロイメント戦略
• CI/CD パイプライン
• 環境別設定管理
• ロールバック戦略
### 開発者体験(DX)
• 開発環境のセットアップ
• コーディング規約
• コードレビュープロセス
### ブラウザサポート
• 対応ブラウザの明確化
• ポリフィル戦略
• プログレッシブエンハンスメント
この設計書は良い出発点ですが、上記の改善点を反映することで、より実用的で包括的な文書になります。特に、セキュリティとパフォーマンスの具体的な実装
方針を早急に策定することを推奨します。
一般的なレビューとしては悪くないのですが、
フロントエンド特有の観点が少し物足りないでしょうか。次にカスタムエージェントを使ってレビューしてみます。
アプリケーション設計書レビューエージェントを使用
q chat --agent frontend-design-reviewer
Q> frontend/design-docs/ui-architecture.mdをレビューしてください
ちなみにエージェントを指定して起動すると[frontend-design-reviewer]
のように表示されます。
視覚的にも自分が今どのエージェントを使用しているかわかっていいですね。命名も具体的にしておくと直感的にわかっていいような気がします。
実行結果
## 🎯 総合評価
基本的な設計方針は適切ですが、いくつかの重要な課題があります。特にセキュリティとパフォーマンス面で改善が必要です。
## 📋 詳細レビュー
### **UI/UXデザインとの整合性**
評価: B-
• レスポンシブ対応やアクセシビリティへの言及はあるが、具体的なデザインシステムの定義が不足
• ユーザビリティテストやデザインレビュープロセスが明記されていない
改善提案:
typescript
// デザインシステムの定義例
const designTokens = {
colors: { primary: '#007bff', secondary: '#6c757d' },
spacing: { xs: '4px', sm: '8px', md: '16px' },
typography: { h1: '2rem', body: '1rem' }
};
### **コンポーネント設計**
評価: B+
• Atomic Designに近い構造で適切
• 機能別とレイアウト別の分離は良い設計
改善提案:
src/components/
├── atoms/ # 最小単位(Button, Input等)
├── molecules/ # 組み合わせ(SearchBox, ProductCard等)
├── organisms/ # 複雑な組み合わせ(Header, ProductList等)
├── templates/ # ページテンプレート
└── pages/ # 実際のページ
### **状態管理**
評価: C+
• Redux Toolkitの選択は適切だが、状態の分割基準が曖昧
• サーバー状態とクライアント状態の区別が不明確
重要な問題:
typescript
// 現在の問題: サーバー状態とクライアント状態の混在
// 改善案: React QueryやSWRの導入を検討
import { useQuery } from '@tanstack/react-query';
const useProducts = () => {
return useQuery({
queryKey: ['products'],
queryFn: fetchProducts,
staleTime: 5 * 60 * 1000, // 5分間キャッシュ
});
};
### **パフォーマンス(レンダリング効率)**
評価: D+
• **重大な問題**: キャッシュ戦略が未定義
• 画像最適化が不十分
• メモ化戦略の言及なし
改善提案:
typescript
// メモ化の実装例
const ProductCard = React.memo(({ product }: { product: Product }) => {
return (
<div>
<img
src={product.image}
alt={product.name}
loading="lazy"
sizes="(max-width: 768px) 100vw, 50vw"
/>
</div>
);
});
// 仮想化の実装(大量データ対応)
import { FixedSizeList as List } from 'react-window';
### **アクセシビリティ**
評価: C
• 基本的な対応は言及されているが、具体的な実装が不足
• WCAG 2.1 AA準拠への言及がない
改善提案:
typescript
// アクセシビリティの具体的実装例
const ProductCard = ({ product }: ProductCardProps) => {
return (
<article
role="article"
aria-labelledby={`product-${product.id}`}
>
<h3 id={`product-${product.id}`}>{product.name}</h3>
<button
aria-label={`${product.name}をカートに追加`}
onClick={handleAddToCart}
>
カートに追加
</button>
</article>
);
};
### **API連携の設計**
評価: D
• **重大な問題**: エラーレスポンス形式の不統一
• 認証トークンのlocalStorage保存はセキュリティリスク
緊急改善が必要:
typescript
// 統一されたエラーハンドリング
interface ApiError {
message: string;
code: string;
details?: Record<string, any>;
}
// セキュアな認証実装
const authService = {
login: async (credentials) => {
// httpOnly cookieを使用
const response = await api.post('/auth/login', credentials, {
withCredentials: true
});
return response.data;
}
};
## 🚨 優先対応事項
### **即座に対応すべき問題:**
1. セキュリティ: localStorageからhttpOnly Cookieへの移行
2. API設計: エラーレスポンス形式の統一
3. CSRF対策: トークンの実装
### **短期改善項目:**
1. React QueryまたはSWRの導入でサーバー状態管理を改善
2. 画像最適化(WebP対応、lazy loading)
3. テストカバレッジの向上(45% → 80%)
### **中長期改善項目:**
1. デザインシステムの構築
2. パフォーマンス監視の実装
3. PWA対応
## 📊 推奨技術スタック追加
typescript
// 推奨追加ライブラリ
{
"@tanstack/react-query": "^4.0.0", // サーバー状態管理
"react-hook-form": "^7.0.0", // フォーム管理
"framer-motion": "^6.0.0", // アニメーション
"@testing-library/jest-dom": "^5.0.0", // テスト強化
"react-error-boundary": "^4.0.0" // エラーハンドリング
}
この設計書は基本的な方向性は良いですが、実装の詳細とセキュリティ面で重要な改善が必要です。特にAPI連携とパフォーマンス最適化を優先的に見直すこと
をお勧めします
事前に定義した指標に基づいて、より細かく体系的なレビューをしてくれています。特にコード例や具体的な改善提案を含めてくれるのが良いですね。
自社のガイドラインやコーディング規約をresources
に含めたりプロンプトでレビュー指針を指示しておくことで、チーム全員が同じ観点でレビューできるようになると思います。これはチーム開発では特に重要なポイントですね。
インフラ設計書のレビュー:カスタムエージェントを使用しない場合
q chat
Q> infrastructure/design-docs/aws-architecture.mdをレビューしてください
実行結果
## 主要な問題点
### 🚨 重大な問題
1. RDS Single-AZ構成
• 99.9%の可用性要件を満たせない
• データベース障害時に完全停止
• 即座にMulti-AZ構成に変更が必要
2. WAF未設定
• セキュリティ要件が不十分
• SQLインジェクション、XSS攻撃に脆弱
3. 暗号化不足
• RDS暗号化なし
• Secrets Manager未使用でパスワード平文保存
### ⚠️ 重要な改善点
4. ネットワーク設計の不備
• NAT Gateway未設定でプライベートサブネットからインターネットアクセス不可
• VPCエンドポイント未設定で不要なデータ転送料金
5. 監視・ログ不足
• CloudWatch Logs未設定
• CloudTrail未設定で監査ログなし
• 詳細な監視メトリクス不足
6. IAM権限過大
• EC2ロールでS3への全権限付与は危険
• 最小権限の原則に違反
## 良い点
• 文書構造が明確で読みやすい
• Well-Architected Frameworkに基づく評価
• 具体的な改善ロードマップ
• コスト試算が含まれている
• 問題点を正直に記載している
## 推奨する改善
### 即座に対応すべき項目
1. RDS Multi-AZ化
bash
aws rds modify-db-instance \
--db-instance-identifier your-db-instance \
--multi-az \
--apply-immediately
2. WAF設定
• AWS Managed Rules for OWASP Top 10
• Rate limiting rules
3. Secrets Manager導入
• データベース認証情報の安全な管理
### 文書の改善提案
1. アーキテクチャ図の改善
• より詳細な構成図
• データフロー図の追加
2. セキュリティ要件の明確化
• コンプライアンス要件
• データ分類とアクセス制御
3. 運用手順書の追加
• デプロイメント手順
• インシデント対応手順
• 定期メンテナンス手順
この設計書は良いスタートポイントですが、本番環境で使用する前に上記の重大な問題を解決することを強く推奨します。特にRDSのMulti-AZ化とWAFの設定は最優先で対応してください。
こちらも基本的なレビューはできていますが、インフラストラクチャ特有の深い分析や最新のベストプラクティスに基づいた提案には少し物足りなさを感じます。
インフラ設計書レビューエージェントを使用
q chat --agent infra-design-reviewer
Q> infrastructure/design-docs/aws-architecture.mdをレビューしてください
AWS Well-Architectedの専門家として、MCPサーバーを使用してインフラ設計書をレビューいたします。まず最新のAWS公式ドキュメントを参照し、コスト分析を
実施してから詳細なレビューを行います。
🛠️ Using tool: search_documentation (trusted) from mcp server aws-docs
⋮
● Running search_documentation with the param:
⋮ {
⋮ "name": "search_documentation",
⋮ "arguments": {
⋮ "search_phrase": "AWS Well-Architected Framework pillars best practices",
⋮ "limit": 5
⋮ }
⋮ }
⋮
● Completed in 1.534s
設定からツールを信用して自動的にレビューを行なってくれます。ツールを使用するかどうか聞かれないのはいいですね。
その分しっかりとした権限設定が大事になるなと思いました。
実行結果
## AWS Well-Architected Framework レビュー結果
MCPサーバーを使用して最新のAWS公式ドキュメントとコスト分析を実施した結果、以下の詳細なレビューを提供いたします。
### 🔴 重大な問題(即座に対応が必要)
#### 1. 可用性とスケーラビリティ
• **RDS Single-AZ構成**: 99.9%可用性要件に対して致命的
• 現在コスト: $80.64/月
• Multi-AZ化後: $161.28/月(約2倍)
• **推奨**: 即座にMulti-AZ化を実施
• **NAT Gateway未設定**: プライベートサブネットからのインターネットアクセス不可
• セキュリティパッチ適用不可能
• **推奨**: 各AZにNAT Gateway設置(月額約$45追加)
#### 2. セキュリティ(最小権限の原則)
• **WAF未設定**: OWASP Top 10攻撃に対して無防備
• **推奨**: CloudFront + WAF設定(月額$5-10追加)
• **機密情報の平文保存**:
bash
# 問題のあるコード
echo "export DB_PASSWORD=SuperSecret123!" >> /etc/environment
• **推奨**: AWS Secrets Manager使用(月額$0.40/シークレット)
• **SSH直接アクセス可能**:
hcl
# 危険な設定
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"] # 全世界からアクセス可能
}
• **推奨**: Systems Manager Session Manager使用
### 🟡 重要な改善点
#### 3. コスト最適化
現在の月額コスト分析(最新価格):
• EC2 t3.medium × 4台: $156.67/月
• RDS db.t3.medium Single-AZ: $80.64/月
• ALB: $22.54/月
• **合計**: $259.85/月
コスト削減提案:
1. Reserved Instance購入: 年間$1,620削減(30%削減)
2. Auto Scaling最適化: ピーク時以外50%削減可能
3. S3ライフサイクル: 古いデータをGlacierへ(80%削減)
#### 4. 運用性(監視・ログ)
• **CloudWatch Logs未設定**: アプリケーションログ収集なし
• **X-Ray未設定**: 分散トレーシングなし
• **Performance Insights無効**: データベース性能監視なし
### 🟢 パフォーマンス効率
#### 良い点:
• CloudFront CDN使用
• Auto Scaling設定済み
• ALB使用
#### 改善点:
• **Read Replica未設定**: 読み取り性能向上のため
• **ElastiCache未使用**: セッション管理とキャッシュ
• **スティッキーセッション有効**: スケーラビリティ阻害
### 📋 改善ロードマップ(優先順位付き)
#### Phase 1: 緊急対応(1週間以内)
1. RDS Multi-AZ化 - 可用性要件達成
2. WAF設定 - セキュリティ強化
3. Secrets Manager導入 - 機密情報管理
#### Phase 2: セキュリティ強化(1ヶ月以内)
1. CloudTrail有効化 - 監査ログ
2. GuardDuty有効化 - 脅威検知
3. IAM権限見直し - 最小権限適用
#### Phase 3: 運用効率化(3ヶ月以内)
1. CloudWatch Logs設定 - ログ集約
2. Reserved Instance購入 - コスト削減
3. DR計画策定 - 災害復旧
### 💰 コスト影響分析
| 改善項目 | 月額コスト変化 | 年間影響 |
|---------|---------------|----------|
| RDS Multi-AZ化 | +$80.64 | +$967.68 |
| WAF設定 | +$5-10 | +$60-120 |
| NAT Gateway | +$45 | +$540 |
| Reserved Instance | -$65 | -$780 |
| 正味影響 | +$65-70 | +$787-847 |
### 🎯 Well-Architected スコア改善
| 柱 | 現在 | 改善後 | 主要改善項目 |
|----|------|--------|-------------|
| 信頼性 | 65/100 | 85/100 | RDS Multi-AZ, DR計画 |
| セキュリティ | 45/100 | 80/100 | WAF, Secrets Manager |
| パフォーマンス | 70/100 | 85/100 | Read Replica, ElastiCache |
| コスト最適化 | 55/100 | 75/100 | Reserved Instance |
| 運用性 | 40/100 | 75/100 | ログ集約, 監視強化 |
この分析は最新のAWS公式ドキュメントと現在の価格情報に基づいており、ECサイトの99.9%可用性要件を満たすための具体的な改善提案を含んでいます。
こちらもいかがでしょうか!
MCPサーバーを使って最新のAWS情報や正確なコスト情報を取得しながら、事前に定義した指標で体系的にレビューしてくれています。具体的な改善提案やコスト影響を示してくれるのも良いですね。
感想
実際にカスタムエージェント機能を使ってみて感じた点をまとめてみました。
MCPサーバーの混在問題への対応
これまでモノレポで複数のMCPサーバーを使っていると、Amazon Q Developerが「どのサーバーを使えばいいかわからない」みたいな状況になることがあって困っていました。カスタムエージェントを使うと、エージェントごとに必要なMCPサーバーだけを指定できるので、この問題が解決できるので嬉しいですね。
エージェント切り替えが便利
q chat --agent frontend-design-reviewer
のように切り替えるだけで、その分野に特化したエージェントが使用できるのが便利でした。毎回「今回はフロントエンドの話です」プロンプトに説明する手間が省けるのも地味に助かります。
カスタムエージェントはチーム共有も可能
設定ファイルをプロジェクトに置いてgit管理すれば、チーム全員が同じエージェント設定を使えるのも良いポイントです。レビューエージェントなどを使用すればレビューの観点を統一できるので、チーム開発では特に価値がありそうです。
おわりに
Amazon Q Developer CLIのカスタムエージェント機能を使って、モノレポでの設計書レビューをサンプルにご紹介しました!
MCPサーバーが増えてきて「Amazon Q Developerが混乱してうまく検索できない」という問題に悩んでいる方は、カスタムエージェントを試して、タスクごとに必要な設定だけを有効化することで、問題解消につながるかもしれませんね。
今後も様々なユースケースでカスタムエージェントを活用していきたいと思います!
最後までご覧いただきありがとうございました!