🔍 CMDB MCP服务器&Streamlit聊天机器人
将存储在S3中的AWS/GCP CMDB策略数据作为MCP服务器提供,并通过Streamlit聊天机器人支持交互式查询。
📋 项目概述
🎯 主要功能
- MCP服务器:将S3 CMDB数据作为AI可用的“工具”提供
- Streamlit聊天机器人:使用Bedrock AI查看交互式CMDB
- 仪表板:可视化资源状态
- 浏览数据:按类别查询详细数据
💡 MCP(模型上下文协议)란?
MCP是AI模型可以访问外部数据和工具的标准协议。
- 常规方式:将所有数据以文本形式传递给AI→浪费令牌,速度慢
- MCP方式:需要AI时调用“工具”查询数据→高效、快速
在此项目中:
- MCP服务器将S3 CMDB数据作为8个“工具”提供
- AI分析问题,选择性地调用所需的工具
- 在其他AI应用程序(Claude Desktop等)中也可以重复使用相同的工具
🏗️ 架构
┌─────────────┐
│ S3 CMDB │ ← 실제 CMDB 데이터 저장소
│ Bucket │ (IAM, S3, EC2, RDS 등)
└──────┬──────┘
│
▼
┌─────────────┐
│ MCP Server │ ← 데이터를 "도구"로 변환
│ │ (get_identity_policies 등)
└──────┬──────┘
│
▼
┌─────────────┐
│ Streamlit │ ← 사용자 질문 받음
│ 챗봇 │ "IAM 정책 현황은?"
└──────┬──────┘
│
▼
┌─────────────┐
│ Bedrock │ ← AI가 필요한 도구 선택
│ Claude 3 │ → MCP 도구 호출
└─────────────┘ → 데이터 분석 후 답변数据流:
- 用户输入问题
- AI分析问题→选择所需的MCP工具
- MCP服务器在S3中查询数据
- AI在分析数据后用自然语言回答
📊 MCP服务器工具
MCP服务器将S3 CMDB数据作为AI可调用的8个“工具”提供。
1.策略查询工具(按类别查询数据)
get_identity_policies:IAM、组织、Cognito정책get_storage_policies:S3、EFS、FSx策略get_compute_policies:EC2、Lambda、ECS策略get_database_policies:RDS,DynamoDB策略get_network_policies:VPC、Cloud、Route 53策略get_security_policies:KMS、Secrets Manager、WAF策略
2.搜索和分析工具
search_resources:搜索资源(名称、类型、标记等)get_resource_summary:全部资源摘要统计信息
3.工具使用示例
用户问题:“IAM政策现状如何?”
1. AI 분석: "이 질문에는 get_identity_policies 도구가 필요"
2. MCP 호출: call_mcp_tool("get_identity_policies")
3. S3 조회: aws-policies/20241223/identity_policies.json
4. 데이터 반환: {"123456789012": {"IAM": [...]}}
5. AI 답변: "현재 IAM 사용자는 5명이며..."主要功能:
- 自动匿名化:保护账号ID、ARN等敏感信息
- 保留策略名/角色名:用于了解业务逻辑
- 实时S3数据联动
- 可以按日期查看历史记录
- AI答案匿名化:答案中包含的账号也自动掩蔽(例如7\*\*\*\*\*\*\*\*\*\*)
🤖 AI模型设置
使用Bedrock(基本)
默认情况下,使用AWS Bedrock Claude 3.5 Sonnet。
# .env 파일에서 설정
BEDROCK_REGION=us-east-1
BEDROCK_MODEL_ID=anthropic.claude-3-5-sonnet-20241022-v2:0使用Local LLM端点
要使用本地LLM,请:
- 修改.env文件:
# Bedrock 대신 로컬 LLM 사용
USE_LOCAL_LLM=true
LOCAL_LLM_ENDPOINT=http://localhost:11434/v1/chat/completions
LOCAL_LLM_MODEL=llama3.1:8b
- 修改streamlit_app.py:
# query_bedrock 함수를 다음으로 교체:
def query_local_llm(prompt, context=""):
"""로컬 LLM을 사용한 AI 응답 생성"""
import requests
import os
endpoint = os.getenv('LOCAL_LLM_ENDPOINT')
model = os.getenv('LOCAL_LLM_MODEL')
full_prompt = f"""
당신은 AWS CMDB 전문가입니다. 다음 CMDB 데이터를 바탕으로 질문에 답해주세요.
CMDB 데이터:
{context}
질문: {prompt}
답변은 한국어로, 구체적이고 실용적으로 제공해주세요.
"""
try:
response = requests.post(endpoint, json={
"model": model,
"messages": [{"role": "user", "content": full_prompt}],
"max_tokens": 2000,
"temperature": 0.7
})
return response.json()['choices'][0]['message']['content']
except Exception as e:
return f"로컬 LLM 오류: {str(e)}"
# main() 함수에서 사용:
if os.getenv('USE_LOCAL_LLM') == 'true':
response = query_local_llm(prompt, context)
else:
response = query_bedrock(prompt, context)🚀 执行方法
1.首选参数
# .env 파일 수정
AWS_ACCESS_KEY_ID=your_key
AWS_SECRET_ACCESS_KEY=your_secret
S3_CMDB_BUCKET=mwaa-cmdb-bucket2.执行整合(建议)
./run.sh自动运行:
- 创建和激活虚拟环境
- 安装软件包
- MCP服务器自动启动
- 启动Streamlit聊天机器人
3.手动运行(用于开发)
# MCP 서버 별도 실행 (선택사항)
python mcp_server.py &
# Streamlit 실행
streamlit run streamlit_app.py --server.port=8503 --server.address=0.0.0.0连接URL:
- 本地:http://localhost:8503
💬 聊天机器人使用示例
🔐 IAM政策相关问题
📊 了解现状
- “IAM政策一共有几个?”
- “IAM有几个角色?”
- “告诉我IAM用户情况”
- “IAM集团是如何组成的?”
🔍 详细分析
- “受管策略和内联策略的比率是多少?”
- “AWS托管策略与客户托管策略的现状如何?”
- “最常用的IAM政策是什么?”
- “权限最多的角色是?”
🚨 安全相关
- “让我看看拥有管理员权限的角色”
- “哪些资源具有PowerUser权限?”
- “哪些政策拥有S3相关权限?”
- “哪些角色具有与EC2相关的权限?”
📈 策略分析
- “每个策略关联的资源数量是多少?”
- “有没有禁用的策略?”
- “最复杂的政策是什么?”
- “特定服务的权限情况如何?”
🔎 搜索问题
- “帮我找ReadOnly权限相关政策”
- “有Lambda相关政策吗?”
- “哪些角色具有CloudWatch权限?”
- “请按特定策略名搜索”
聊天机器人功能
- 自然语言问题:使用日常语言查看CMDB
- 上下文感知:自动加载符合问题的数据
- 详细分析:Bedrock AI分析和解释数据
📊 仪表板功能
1.资源摘要
- 类别资源计数图表
- 资源分布饼图
- 资源总数度量
2.浏览数据
- 按类别查询数据
- 按日期查看历史记录
- 检查JSON源数据
- 显示表格格式数据
🔧 MCP服务器集成
Claude桌面设置
~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"cmdb-server": {
"command": "python",
"args": ["/path/to/cmdb_mcp/mcp_server.py"],
"env": {
"AWS_DEFAULT_REGION": "us-east-1"
}
}
}
}🔐 必需权限
AWS IAM权限
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::mwaa-cmdb-bucket",
"arn:aws:s3:::mwaa-cmdb-bucket/*"
]
},
{
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel"
],
"Resource": "*"
}
]
}🔒 安全和匿名
自动匿名功能
这个项目 第2步匿名化使用保护敏感信息:
步骤1:加载数据时匿名
- 从S3导入数据时自动匿名
- 帐户ID:
703000000000→703********* - ARN:
arn:aws:iam::703000000000:role/...→arn:aws:iam::703*********:role/... - 访问密钥:
AAABBBCCCDDDEEE→AAABBB************ - IP地址:
10.0.1.100→10.0.*.**
第2步:AI答案匿名化
- 在AI生成的答案中自动掩蔽敏感信息
- 即使答案中包含账号,也会自动
***处理 - 自动掩蔽电子邮件、IP地址等
保留的信息:
- IAM角色名,政策名(用于了解业务逻辑)
- 资源名称(用于分析)
- 服务名称,区域名称
掩蔽的信息:
- AWS帐户ID(12位)
- ❌ 访问密钥/密钥
- IP地址
- 电子邮件地址
- ARN的帐户ID部分
5.如果AI找不到数据
症状:“您有CloudWatch权限的角色是?”回答“没有数据”
原因:
- AI选择了错误的工具
- 受数据大小限制,仅传输部分数据(最常见的原因)
- 搜索关键字与数据不匹配
解决方法:
- 更具体地提问
- “CloudWatch权限” - “在IAM角色中查找包含CloudWatch的角色” - “包含cloudwatch或logs的IAM角色”
- 指定类别
- “特权角色” - “IAM角色列表中与CloudWatch相关的角色”
- 使用数据导航选项卡(最可靠的方法)
- 在“数据导航”选项卡中,而不是聊天机器人 identity_policies 直接查询 - 验证原始的JSON数据 - 使用浏览器搜索(Ctrl+F)搜索“cloudwatch”
📝 使用提示
有效的提问方法
- 具体地:“IAM用户策略列表”而不是“IAM策略”
- 指定类别:“安全相关资源现状”
- 请求比较:“与上周相比,资源发生了变化”
利用仪表板
- 首先在仪表板上查看完整的现状
- 在数据导航中查看兴趣类别的详细信息
- 聊天机器人的具体问题
