
一、什么是EIP
EIP(Elastic IP,弹性IP)是 AWS 提供的一种静态公网 IP 地址,专门用于与 EC2 实例进行绑定。它有以下几个特点:
静态公网IP:EIP 是一个可以被持久化、固定的公网 IP 地址。与普通的动态公网 IP 不同,EIP 在与 EC2 实例断开或重启时,仍然保持不变。这使得它适用于需要稳定公网访问的应用场景。
独立于实例:EIP 与 EC2 实例是解耦的,即 EIP 可以在不同的 EC2 实例之间进行重新绑定,而无需更改应用或服务的 IP 地址。这对于实现高可用性和容灾恢复非常重要。
计费:EIP 是免费的,只要它绑定到正在运行的实例。如果 EIP 不再绑定任何实例,AWS 会开始收费。因此,最好仅在需要固定公网 IP 的时候使用 EIP。
该方案适用场景:ec2实例没关联弹性IP地址,业务非常迫切的恢复原有IP
三、方案准备
(一)提高ec2 vcpu配额
1.打开链接
https://console.aws.amazon.com/servicequotas/home/services/ec2/quotas
2.搜索 Running On-Demand Standard,请求增加配额

3.填写一个大于您当前配额值的数字(比如现在是 200,要增加 300 个,就填写 500),请求

(二)配置权限环境
1.创建 IAM 用户
登录到 AWS 管理控制台 -- https://us-east-1.console.aws.amazon.com/iam/home?region=eu-north-1#/home
导航到 IAM 服务

选择 Users,然后点击 Add user。

输入用户名,选择 Access key - Programmatic access。
点击 Next: Permissions。

2.设置权限
直接附加现有策略:选择 AWS 提供的现有策略,例如 AdministratorAccess、AmazonS3FullAccess 等。

创建新策略:选择 Create policy,使用 JSON 或可视化编辑器定义所需权限,然后将其附加到用户。
3.创建 IAM 组(可选)
在 IAM 控制台,选择 Groups,然后点击 Create New Group。

输入组名称,选择所需的权限策略,然后点击 Create Group。
将用户添加到该组。

4.生成访问密钥
在用户的详情页,选择 Security credentials 标签。
点击 Create access key,然后保存好生成的 Access Key ID 和 Secret Access Key。

(三)配置aws cli
1.安装AWS Cli:
参考链接:https://aws.amazon.com/cn/getting-started/guides/setup-environment/module-three/
在 AWS CLI 官方网站 上下载适合您操作系统的版本并进行安装。
在终端中运行以下命令以确认安装成功: aws --version
2.配置 AWS CLI:
在终端中运行以下命令:aws configure
系统将提示您输入以下信息:
· AWS Access Key ID:您的访问密钥 ID。
· AWS Secret Access Key:您的访问密钥。
· Default region name:默认区域,例如 us-west-2。
· Default output format:输出格式,可以是 json、text 或 table
3.配置 AWS CLI:
运行以下命令以验证配置是否成功:aws s3 ls
如果您能看到您的 S3 存储桶列表,说明配置成功。
脚本内容:由于没关联弹性IP地址,实例重启就会重新分配public ip,原IP就会回到地址池,必要条件是这个public ip还没被重新分配给别的实例
刷IP运用的脚本:
import time
import boto3
from datetime import datetime, timedelta
from botocore.exceptions import ClientError
# 设置AWS凭证
session = boto3.Session()
region = 'your_region'
# 创建EC2和CloudWatch客户端
ec2 = session.client('ec2')
cw = session.client('cloudwatch')
# 目标公网IP
target_ip = 'your_target_eip_addr'
# 创建EC2实例
def create_instances():
response = ec2.run_instances(
ImageId='ami-XXXXXX', # 替换为您需要的AMI ID
InstanceType='t3.medium', #替换为您需要的EC2实例类型
MaxCount=5, #创建的Instance数量(Max和Min同时修改)
MinCount=5,
KeyName='XXXXX', # 替换为您的密钥对名称
SecurityGroupIds=['sg-XXXXX'] # 替换为您的安全组ID
)
instance_ids = [instance['InstanceId'] for instance in response['Instances']]
return instance_ids
# 检查实例状态
def is_instance_running(instance_id):
response = ec2.describe_instances(InstanceIds=[instance_id])
state = response['Reservations'][0]['Instances'][0]['State']['Name']
return state == 'running'
# 获取实例的公网IP
def get_instance_public_ip(instance_id):
response = ec2.describe_instances(InstanceIds=[instance_id])
return response['Reservations'][0]['Instances'][0]['PublicIpAddress']
# 删除实例
def terminate_instances(instance_ids):
ec2.terminate_instances(InstanceIds=[instance_ids])
# 主程序
def main():
start_time = datetime.now()
get_target_ip = False
instance_num=0
while not get_target_ip:
instance_ids = create_instances()
# 记录所有实例的状态
for instance_id in instance_ids:
# 如果该实例已运行
while not is_instance_running(instance_id):
time.sleep(2)
try:
public_ip = get_instance_public_ip(instance_id)
print(f"Instance {instance_id} has public IP: {public_ip}")
if public_ip == target_ip:
print(f"Found instance with target IP {target_ip}")
return
else:
terminate_instances(instance_id)
instance_num += 1
print(f"Terminated instance {instance_id} with wrong IP{public_ip},instance number:{instance_num}")
except ClientError as e:
print(f"Error retrieving IP for {instance_id}: {e}")
continue
if __name__ == '__main__':
main()
通过上述方案的精心准备与脚本执行,即便在 EC2 实例未关联弹性 IP 且公网 IP 丢失的棘手情况下,我们也能高效找回原 IP,极大降低业务损失风险。在云计算技术蓬勃发展的当下,深入理解和熟练运用此类技术手段,是保障业务稳定、提升运维效率的关键。未来,随着 AWS 服务的持续升级与创新,我们将持续关注并探索更多优化策略,为云服务的稳定运行保驾护航。
