burncloud-aws 0.1.1

burncloud-aws
Documentation
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,
    /// 卸载所有监控资源 (包括Lambda, CloudWatch告警, SNS等)
    Uninstall,
}

#[tokio::main]
async fn main() -> Result<()> {
    // 解析命令行参数
    let cli = Cli::parse();

    // 🔒 强制创建安全的AWS环境,仅从.env文件读取凭证
    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(())
}