AWS Cloudshell一键更换EC2实例Elastic IP(含运营商IP)


#!/bin/bash

# 确保脚本以错误退出方式运行
set -e

# 用户需要配置的变量
# 请输入您的目标实例 ID
INSTANCE_ID="i-080a5478b1443441d"  # 替换为您的 EC2 实例 ID

# 获取当前关联的 Elastic IP 的 Allocation ID
CURRENT_EIP_ALLOC_ID=$(aws ec2 describe-addresses --filters "Name=instance-id,Values=$INSTANCE_ID" --query "Addresses[0].AllocationId" --output text)

if [ "$CURRENT_EIP_ALLOC_ID" != "None" ]; then
    echo "当前实例 ($INSTANCE_ID) 关联的 Elastic IP Allocation ID: $CURRENT_EIP_ALLOC_ID"
    echo "正在释放当前的 Elastic IP..."
    aws ec2 release-address --allocation-id $CURRENT_EIP_ALLOC_ID
    echo "当前的 Elastic IP 已释放。"
else
    echo "实例 ($INSTANCE_ID) 没有关联的 Elastic IP。"
fi

# 分配新的 Elastic IP
echo "正在分配新的 Elastic IP..."
NEW_EIP_ALLOC_ID=$(aws ec2 allocate-address --domain vpc --query "AllocationId" --output text)
NEW_EIP_PUBLIC_IP=$(aws ec2 describe-addresses --allocation-ids $NEW_EIP_ALLOC_ID --query "Addresses[0].PublicIp" --output text)
echo "新的 Elastic IP Allocation ID: $NEW_EIP_ALLOC_ID"
echo "新的 Elastic IP Public IP: $NEW_EIP_PUBLIC_IP"

# 关联新的 Elastic IP 到实例
echo "正在将新的 Elastic IP 关联到实例 ($INSTANCE_ID)..."
aws ec2 associate-address --instance-id "$INSTANCE_ID" --allocation-id "$NEW_EIP_ALLOC_ID"
echo "新的 Elastic IP 已成功关联到实例 ($INSTANCE_ID)。"
echo "新的 Public IP: $NEW_EIP_PUBLIC_IP"
以下是更换运营商IP(Wavelength)

#!/bin/bash

# 确保脚本以错误退出方式运行
set -e

# 用户在脚本启动时输入
read -p "请输入 EC2 实例 ID(例如 i-xxxxxxxxxxxxxxxxx): " INSTANCE_ID
read -p "请输入 Network Border Group(例如 us-east-1-wl1-atl-wlz-1): " NETWORK_BORDER_GROUP

# 固定区域(如需要,也可以扩展为输入)
REGION="us-east-1"

# Carrier IP 记录文件
USED_IP_FILE="used_carrier_ips.txt"

# 确保记录文件存在
touch "$USED_IP_FILE"

# 定义函数来执行 EIP 更换操作
change_eip() {
    echo "-----------------------------"
    echo "开始更换 Carrier IP 于实例 ($INSTANCE_ID)"
    echo "-----------------------------"

    # 获取当前关联的 Elastic IP 的 Allocation ID 和 Association ID
    CURRENT_EIP_ALLOC_ID=$(aws ec2 describe-addresses --filters "Name=instance-id,Values=$INSTANCE_ID" --query "Addresses[0].AllocationId" --output text --region "$REGION")
    ASSOCIATION_ID=$(aws ec2 describe-addresses --filters "Name=instance-id,Values=$INSTANCE_ID" --query "Addresses[0].AssociationId" --output text --region "$REGION")

    if [ "$CURRENT_EIP_ALLOC_ID" != "None" ]; then
        echo "当前实例 ($INSTANCE_ID) 关联的 Elastic IP Allocation ID: $CURRENT_EIP_ALLOC_ID"
        
        # 解除当前 Elastic IP 的关联
        if [ "$ASSOCIATION_ID" != "None" ]; then
            echo "正在解除当前的 Elastic IP 关联..."
            aws ec2 disassociate-address --association-id "$ASSOCIATION_ID" --region "$REGION"
            echo "当前的 Elastic IP 已解除关联。"
        fi

        # 释放当前的 Elastic IP
        echo "正在释放当前的 Elastic IP..."
        aws ec2 release-address --allocation-id "$CURRENT_EIP_ALLOC_ID" --network-border-group "$NETWORK_BORDER_GROUP" --region "$REGION"
        echo "当前的 Elastic IP 已释放。"
    else
        echo "实例 ($INSTANCE_ID) 没有关联的 Elastic IP。"
    fi

    while true; do
        # 分配新的 Elastic IP
        echo "正在分配新的 Elastic IP..."
        NEW_EIP_ALLOC_ID=$(aws ec2 allocate-address --domain vpc --network-border-group "$NETWORK_BORDER_GROUP" --query "AllocationId" --output text --region "$REGION")
        
        # 查询 Carrier IP
        NEW_CARRIER_IP=$(aws ec2 describe-addresses --allocation-ids "$NEW_EIP_ALLOC_ID" --query "Addresses[0].CarrierIp" --output text --region "$REGION")
        echo "尝试分配 Carrier IP: $NEW_CARRIER_IP"

        # 检查 Carrier IP 是否已经用过
        if grep -Fxq "$NEW_CARRIER_IP" "$USED_IP_FILE"; then
            echo "警告: Carrier IP ($NEW_CARRIER_IP) 已在记录中,释放并重新分配..."
            # 释放分配到的 IP
            aws ec2 release-address --allocation-id "$NEW_EIP_ALLOC_ID" --network-border-group "$NETWORK_BORDER_GROUP" --region "$REGION"
        else
            echo "Carrier IP ($NEW_CARRIER_IP) 是新的,继续使用。"
            break
        fi
    done

    # 关联新的 Elastic IP
    echo "正在将新的 Elastic IP 关联到实例 ($INSTANCE_ID)..."
    aws ec2 associate-address --instance-id "$INSTANCE_ID" --allocation-id "$NEW_EIP_ALLOC_ID" --region "$REGION"
    echo "新的 Elastic IP 已成功关联到实例 ($INSTANCE_ID)。"

    # 记录新的 Carrier IP 到文件
    echo "$NEW_CARRIER_IP" >> "$USED_IP_FILE"
    echo "新的 Carrier IP 已记录: $NEW_CARRIER_IP"
    echo "-----------------------------"
}

# 主循环
while true; do
    change_eip

    # 提示用户按回车键以继续更换,或 Ctrl+C 退出
    read -p "按回车键以继续更换 Carrier IP,或按 Ctrl+C 退出脚本..."
done
以下是另一种更换运营商IP(Wavelength)方式,通过不断关联并立即释放弹性运营商 IP。

#!/bin/bash

# ------------------------------
# 脚本:按回车分配并释放 EIP,直到实例拿到一个未用过的运营商 IP 并记录时间
# ------------------------------
set -e

# 1. 启动时输入实例 ID 和网络边界组
read -p "请输入 EC2 实例 ID(例如 i-04cdc286300c68ee8): " INSTANCE_ID
read -p "请输入 Network Border Group(例如 us-east-1-wl1-atl-wlz-1): " NETWORK_BORDER_GROUP

# 2. 固定区域
REGION="us-east-1"

# 3. 历史记录文件(时间 + IP),文件名 ip.txt
USED_IP_FILE="ip.txt"
touch "$USED_IP_FILE"

echo
echo "======================================"
echo "脚本已启动。每次按回车键尝试换一个未用过的运营商 IP。"
echo "要退出,请按 Ctrl+C"
echo "======================================"
echo

# 4. 主循环:每次回车触发一次“换 IP”流程
while true; do
    read -p "按回车键开始换 IP…"

    # 内层循环:直到拿到一个全新的 IP 才跳出
    while true; do

        # ---- A. 如果实例已有 EIP,先解除关联并释放 ----
        CURRENT_ALLOC_ID=$(aws ec2 describe-addresses \
            --filters "Name=instance-id,Values=$INSTANCE_ID" \
            --query "Addresses[0].AllocationId" \
            --output text --region "$REGION")

        if [ "$CURRENT_ALLOC_ID" != "None" ]; then
            echo "检测到已有 EIP:$CURRENT_ALLOC_ID,正在解除关联并释放…"
            ASSOC_ID=$(aws ec2 describe-addresses \
                --filters "Name=instance-id,Values=$INSTANCE_ID" \
                --query "Addresses[0].AssociationId" \
                --output text --region "$REGION")
            aws ec2 disassociate-address --association-id "$ASSOC_ID" --region "$REGION"
            aws ec2 release-address \
                --allocation-id "$CURRENT_ALLOC_ID" \
                --network-border-group "$NETWORK_BORDER_GROUP" \
                --region "$REGION"
        fi

        # ---- B. 分配新的 EIP 并关联到实例 ----
        echo "分配新的 EIP..."
        NEW_ALLOC_ID=$(aws ec2 allocate-address \
            --domain vpc \
            --network-border-group "$NETWORK_BORDER_GROUP" \
            --query "AllocationId" \
            --output text \
            --region "$REGION")
        aws ec2 associate-address \
            --instance-id "$INSTANCE_ID" \
            --allocation-id "$NEW_ALLOC_ID" \
            --region "$REGION" >/dev/null

        # ---- C. 立即解除关联并释放这个 EIP ----
        ASSOC_NEW=$(aws ec2 describe-addresses \
            --allocation-ids "$NEW_ALLOC_ID" \
            --query "Addresses[0].AssociationId" \
            --output text --region "$REGION")
        echo "解除关联并释放 EIP ($NEW_ALLOC_ID → AssocId: $ASSOC_NEW)…"
        aws ec2 disassociate-address --association-id "$ASSOC_NEW" --region "$REGION"
        aws ec2 release-address \
            --allocation-id "$NEW_ALLOC_ID" \
            --network-border-group "$NETWORK_BORDER_GROUP" \
            --region "$REGION"

        # ---- D. 从实例的 Public DNS 提取当前 IP ----
        PUBLIC_DNS=$(aws ec2 describe-instances \
            --instance-ids "$INSTANCE_ID" \
            --query "Reservations[0].Instances[0].PublicDnsName" \
            --output text --region "$REGION")

        if [ -n "$PUBLIC_DNS" ] && [ "$PUBLIC_DNS" != "None" ]; then
            DNS_HOST="${PUBLIC_DNS%%.*}"           # ec2-155-146-100-87
            IP_PART="${DNS_HOST#ec2-}"             # 155-146-100-87
            INSTANCE_IP="${IP_PART//-/\.}"         # 155.146.100.87
        else
            # 如果 DNS 拿不到,就直接取 PublicIpAddress
            INSTANCE_IP=$(aws ec2 describe-instances \
                --instance-ids "$INSTANCE_ID" \
                --query "Reservations[0].Instances[0].PublicIpAddress" \
                --output text --region "$REGION")
        fi

        echo "当前实例运营商 IP → $INSTANCE_IP"

        # ---- E. 去重检查:如果已记录,继续循环;否则记录并跳出 ----
        if grep -Fq "$INSTANCE_IP" "$USED_IP_FILE"; then
            echo ">> IP $INSTANCE_IP 已用过,重试一次…"
            echo
            continue
        fi

        # 记录时间戳和新 IP
        TIMESTAMP=$(date "+%Y-%m-%dT%H:%M:%S%z")
        echo "$TIMESTAMP $INSTANCE_IP" >> "$USED_IP_FILE"
        echo "✅ 已记录:$TIMESTAMP $INSTANCE_IP"
        echo

        # 拿到全新 IP,结束内层循环
        break
    done
done
Next Post Previous Post
No Comment
Add Comment
comment url