use anyhow::{Result, anyhow};
use tracing::{info, error, Level};
use tracing_subscriber::FmtSubscriber;
use burncloud_aws::aws_deploy::MultiRegionDeployer;
use burncloud_aws::security::create_secure_aws_env;
use clap::{Parser, Subcommand};
#[derive(Parser)]
#[command(author, version, about, long_about = None)]
struct Cli {
#[command(subcommand)]
command: Option<Commands>,
}
#[derive(Subcommand)]
enum Commands {
Deploy,
Uninstall,
}
#[tokio::main]
async fn main() -> Result<()> {
let cli = Cli::parse();
if let Err(e) = create_secure_aws_env() {
error!("❌ 安全环境配置失败: {}", e);
return Err(anyhow!("{}", e));
}
let subscriber = FmtSubscriber::builder()
.with_max_level(Level::INFO)
.finish();
tracing::subscriber::set_global_default(subscriber)?;
match cli.command.unwrap_or(Commands::Deploy) {
Commands::Deploy => {
info!("🌍 多区域AWS Bedrock监控系统部署");
info!("📋 部署内容:");
info!(" - 遍历.env中所有AWS_REGION");
info!(" - 在每个区域部署完整监控堆栈");
info!(" - Lambda函数和IAM权限");
info!(" - SNS主题和订阅");
info!(" - CloudWatch告警(8个)");
info!(" - EventBridge规则");
info!(" - AK/SK自动关闭配置");
info!(" - 429 throttling限制");
let deployer = MultiRegionDeployer::from_env()?;
let results = deployer.deploy_to_all_regions().await?;
let success_count = results.iter().filter(|r| matches!(r.status, burncloud_aws::aws_deploy::DeployStatus::Success)).count();
let failed_count = results.iter().filter(|r| matches!(r.status, burncloud_aws::aws_deploy::DeployStatus::Failed(_))).count();
info!("\n{}", "=".repeat(80));
info!("📊 区域部署详细统计");
info!("{}", "=".repeat(80));
if success_count > 0 {
info!("\n✅ 成功部署的区域 ({} 个):", success_count);
for result in results.iter().filter(|r| matches!(r.status, burncloud_aws::aws_deploy::DeployStatus::Success)) {
info!(" 🌍 {} (耗时: {:?})", result.region, result.duration);
}
}
if failed_count > 0 {
info!("\n❌ 部署失败的区域 ({} 个):", failed_count);
for result in results.iter().filter(|r| matches!(r.status, burncloud_aws::aws_deploy::DeployStatus::Failed(_))) {
if let burncloud_aws::aws_deploy::DeployStatus::Failed(ref error) = result.status {
info!(" 🌍 {} (耗时: {:?})", result.region, result.duration);
info!(" 💥 失败原因: {}", error);
}
}
}
info!("\n📈 部署总结:");
info!(" ✅ 成功: {}/{} 区域", success_count, results.len());
info!(" ❌ 失败: {}/{} 区域", failed_count, results.len());
info!(" ⏱️ 总耗时: {:?}", results.iter().map(|r| r.duration).sum::<std::time::Duration>());
if success_count > 0 {
info!("\n🎉 多区域部署完成!");
info!("✨ {} 个区域的Bedrock 429错误现在将自动触发AK/SK关闭!", success_count);
info!("🚀 429 throttling限制已在所有成功部署的区域激活!");
}
},
Commands::Uninstall => {
info!("🗑️ 准备执行全量卸载操作...");
info!("⚠️ 警告:这将删除所有监控相关的资源,包括:");
info!(" - CloudWatch 告警 (所有 bedrock- 前缀的告警)");
info!(" - EventBridge 规则 (bedrock-api-monitor-rule)");
info!(" - SNS 主题 (bedrock-throttling-alerts)");
info!(" - Lambda 函数 (bedrock-monitor-function)");
info!("ℹ️ 注意:IAM 角色 (lambda-bedrock-monitor-role) 将被保留");
let deployer = MultiRegionDeployer::from_env()?;
deployer.uninstall_from_all_regions().await?;
info!("🎉 监控系统卸载操作完成!");
}
}
Ok(())
}