221 lines
4.5 KiB
Markdown
221 lines
4.5 KiB
Markdown
# 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接口
|
||
- 自动区域检测和实例定位
|