AWS EC2 实例找回 IP 实战指南: 保障业务连续性的关键策略

2025-02-17 10:34 杨豪旭
47

AWS EC2 实例找回 IP 实战指南:

保障业务连续性的关键策略

前言:在 AWS EC2 实例中,如果未绑定弹性IP(EIP),每次实例重启后,公网IP会发生变化。这对于依赖固定公网IP进行访问的应用或服务来说,可能导致不可预见的中断和问题。使用自动化脚本来获取原来实例的公网IP成为一种实用的解决方案。

本方案通过编写自动化脚本,旨在解决用户在实例重启后公网IP变更带来的问题。该脚本能够在实例启动后,自动查找并记录当前的公网IP,从而帮助运维人员快速恢复或更新与实例连接的相关配置,确保服务的连续性和稳定性,找回原IP减少业务上的损失。


一、什么是EIP

EIP(Elastic IP,弹性IP)是 AWS 提供的一种静态公网 IP 地址,专门用于与 EC2 实例进行绑定。它有以下几个特点:

静态公网IPEIP 是一个可以被持久化、固定的公网 IP 地址。与普通的动态公网 IP 不同,EIP 在与 EC2 实例断开或重启时,仍然保持不变。这使得它适用于需要稳定公网访问的应用场景。

独立于实例EIP 与 EC2 实例是解耦的,即 EIP 可以在不同的 EC2 实例之间进行重新绑定,而无需更改应用或服务的 IP 地址。这对于实现高可用性和容灾恢复非常重要

计费EIP 是免费的,只要它绑定到正在运行的实例。如果 EIP 不再绑定任何实例,AWS 会开始收费。因此,最好仅在需要固定公网 IP 的时候使用 EIP。

二、典型使用场景

需要固定公网 IP 的服务:例如,企业需要确保某个服务器的公网 IP 地址不发生变化,以便对外提供稳定的 API 或 Web 服务。

高可用性和容灾:当一个实例发生故障时,可以快速将 EIP 绑定到其他健康实例,从而减少停机时间。

连接外部服务或用户:当有外部客户端或服务通过 IP 地址访问 EC2 实例时,EIP 提供了不变的公网 IP 地址。


该方案适用场景: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:输出格式,可以是 jsontexttable


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 服务的持续升级与创新,我们将持续关注并探索更多优化策略,为云服务的稳定运行保驾护航。


联系我们
电话咨询 13711342725
QQ咨询
微信客服