# AWS IP 替换工具(Flask) Flask + boto3 + MySQL 的小工具,用于: - 根据输入 IP 查找对应 EC2 实例并终止,使用预设 AMI 创建新实例 - 通过数据库中的 IP-账户映射自动选择 AWS 账户,前端不暴露账户列表 - 如果新公网 IP 落入运维黑名单,自动停机/开机循环更换 IP(受 `IP_RETRY_LIMIT` 控制) - MySQL 存储黑名单 (`ip_operations`)、IP-账户映射 (`ip_account_mapping`)、服务器规格 (`server_specs`,含实例类型/Name/磁盘/安全组/区域/子网/AZ)、IP 替换历史 (`ip_replacement_history`) ## 快速开始 1) 安装依赖 ```bash python -m venv .venv .\\.venv\\Scripts\\activate pip install -r requirements.txt ``` 2) 配置环境变量 复制 `.env.example` 为 `.env`,按需修改: - `DATABASE_URL`:MySQL 连接串,例如 `mysql+pymysql://user:pass@localhost:3306/ip_ops` - `IP_RETRY_LIMIT`:新 IP 与黑名单冲突时的停机/开机重试次数 3) 准备数据库 创建数据库并授权,首次运行会自动建表 `aws_accounts`、`ip_operations`、`ip_account_mapping`、`server_specs`、`ip_replacement_history`: ```sql CREATE DATABASE ip_ops DEFAULT CHARACTER SET utf8mb4; GRANT ALL ON ip_ops.* TO 'user'@'%' IDENTIFIED BY 'pass'; ``` `aws_accounts` 存储 AWS 账户凭据及默认 AMI/网络配置,可随时新增/更新记录后立即生效(无需重启)。 `ip_account_mapping` 记录 IP 与账户名映射(运行前请先写入),例如: ```sql INSERT INTO ip_account_mapping (ip_address, account_name) VALUES ('54.12.34.56', 'account_a'); ``` 4) 配置 AWS 账户 通过 SQL 或数据库管理工具向 `aws_accounts` 写入账户信息: ```sql INSERT INTO aws_accounts ( name, region, access_key_id, secret_access_key, ami_id, subnet_id, security_group_ids, key_name ) VALUES ( 'account_a', 'us-east-1', 'AKIA...', 'SECRET...', 'ami-xxxx', 'subnet-xxxx', 'sg-1,sg-2', 'my-key' ); ``` `security_group_ids` 用逗号分隔,可留空;`subnet_id`/`key_name` 可选。新增或更新记录后,接口会实时使用最新配置。 5) 配置初始服务器映射 在 `/mapping_page` 录入 IP -> 账户名映射,或直接写入 `ip_account_mapping`。 6) 启动 ```bash flask --app app run --host 0.0.0.0 --port 5000 # 或 python app.py ``` ## 运行流程 1) 页面输入需要替换的 IP,后端用 `ip_account_mapping` 定位账户并读取对应 AWS 配置 2) 在该账户中查找公/私网 IP 匹配的实例,读取实例类型、Name、根盘大小/类型、安全组(ID/名称)、区域/子网/AZ,并记录到 `server_specs`;若实例未找到则回退使用数据库中已存的规格 3) 按记录的规格创建新实例(实例类型、磁盘类型/大小、安全组、子网/AZ),如新公网 IP 在 `ip_operations` 黑名单中,则停机/开机循环直至获得可用 IP(或达到重试上限);旧实例的终止异步触发,不会阻塞新实例创建 4) 记录 IP 替换历史到 `ip_replacement_history`,前端可查看最近 100 条替换记录;同时更新 `server_specs` 中的 IP 规格为最新 IP ## 注意事项 - 真实环境会产生终止/创建实例等成本操作,先在测试账户验证流程 - 若 AWS 或数据库配置加载失败,页面会直接显示错误提示 - 需定期维护 `ip_operations` 黑名单、`ip_account_mapping` 映射,以及 `server_specs` 中的规格数据