2025-10-22 11:38:04 +08:00

221 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Lightsail 静态IP 更换工具
一个用于自动更换 AWS Lightsail 实例静态IP的Web工具支持自动区域检测和实例定位。
## 功能特性
- 🔍 **自动区域检测** - 输入静态IP地址后自动定位所属AWS区域
- 🎯 **自动实例定位** - 自动找到绑定的Lightsail实例
- 🆕 **新IP分配** - 自动分配新的静态IP地址
- 🔗 **自动绑定** - 将新静态IP绑定到实例
- 🗑️ **可选释放** - 可选择是否释放旧静态IP
- 📊 **操作日志** - 记录所有操作历史和状态
- 🔄 **重试机制** - 处理临时错误和API限流
- 🌐 **Web界面** - 简洁易用的Web操作界面
## 系统要求
- Python 3.7+
- AWS账户和相应的API权限
- 网络访问AWS Lightsail服务
## 安装步骤
### 1. 克隆项目
```bash
git clone <your-repo-url>
cd Ec2ElasticIpSwapper
```
### 2. 安装依赖
```bash
pip install -r requirements.txt
```
### 3. 配置AWS凭证
#### 方法一:环境变量(推荐)
创建 `.env` 文件:
```bash
# .env
AWS_REGION=ap-northeast-1
AWS_ACCESS_KEY_ID=AKIA...
AWS_SECRET_ACCESS_KEY=xxxx...
```
#### 方法二AWS CLI配置
```bash
aws configure
```
#### 方法三IAM角色EC2实例
如果运行在EC2实例上可以配置IAM角色。
### 4. 启动服务
```bash
python -m uvicorn app:app --host 0.0.0.0 --port 9099
```
### 5. 访问Web界面
打开浏览器访问:`http://localhost:9099`
## 使用方法
1. **输入当前静态IP** - 在输入框中输入当前绑定在Lightsail实例上的静态IP地址
2. **点击更换按钮** - 系统会自动:
- 检测IP所属区域
- 找到绑定的实例
- 分配新的静态IP
- 绑定到实例
- 释放旧静态IP可选
3. **查看操作日志** - 在下方表格中查看所有操作记录
## 所需AWS权限
确保您的AWS凭证具有以下权限
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"lightsail:GetStaticIps",
"lightsail:AllocateStaticIp",
"lightsail:AttachStaticIp",
"lightsail:DetachStaticIp",
"lightsail:ReleaseStaticIp",
"lightsail:GetInstance",
"lightsail:GetRegions",
"sts:GetCallerIdentity"
],
"Resource": "*"
}
]
}
```
## API接口
### 更换静态IP
```http
POST /api/rotate_by_ip
Content-Type: application/json
{
"current_ip": "1.2.3.4",
"release_old": true
}
```
**响应示例:**
```json
{
"ok": true,
"region": "ap-northeast-1",
"instance_id": "my-instance",
"old_ip": "1.2.3.4",
"new_ip": "5.6.7.8",
"old_released": true
}
```
### 获取操作日志
```http
GET /api/logs
```
### 清空操作日志
```http
POST /api/logs/clear
```
### 健康检查
```http
GET /healthz
```
## 配置说明
### 环境变量
| 变量名 | 说明 | 默认值 |
|--------|------|--------|
| `AWS_REGION` | 起始区域(用于获取区域列表) | `us-east-1` |
| `AWS_ACCESS_KEY_ID` | AWS访问密钥ID | - |
| `AWS_SECRET_ACCESS_KEY` | AWS秘密访问密钥 | - |
### 重试配置
代码中内置了重试机制,用于处理临时错误:
- **最大重试次数**: 3次
- **重试间隔**: 0.8秒(指数退避)
- **重试条件**: 实例状态错误、请求限制、限流异常等
## 故障排除
### 常见错误
1. **"静态IP not found in any region"**
- 检查IP地址是否正确
- 确认IP属于当前AWS账户
- 验证AWS凭证权限
2. **"静态IP is not attached to any instance"**
- 确认静态IP已绑定到Lightsail实例
- 检查实例状态是否正常
3. **权限错误**
- 检查AWS凭证是否正确配置
- 确认具有所需的Lightsail权限
### 日志查看
- 在Web界面下方查看操作日志
- 每个操作都会记录时间、区域、实例、IP地址、状态等信息
## 注意事项
- ⚠️ **备份重要数据** - 更换IP可能影响服务连接
- ⚠️ **DNS更新** - 更换IP后需要更新相关DNS记录
- ⚠️ **防火墙规则** - 检查安全组和防火墙规则
- ⚠️ **费用考虑** - 未使用的静态IP会产生费用建议及时释放
## 技术栈
- **后端**: FastAPI + Python
- **AWS SDK**: Boto3
- **前端**: 原生HTML/CSS/JavaScript
- **服务器**: Uvicorn ASGI
## 许可证
MIT License
## 贡献
欢迎提交Issue和Pull Request
## 更新日志
### v1.0.0
- 初始版本
- 支持Lightsail静态IP自动更换
- Web界面和API接口
- 自动区域检测和实例定位