You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EC2实例每日重启IP变更后,如何配置NameCheap与AWS实现域名自动解析?

解决EC2重启后自动同步NameCheap域名解析的实战方案

嘿,我之前刚好碰到过一模一样的情况——弹性IP全被占了,EC2每天维护重启就换公网IP,还得让example.com一直能访问到实例上的应用。给你一套靠谱的分步解决方案,核心就是让EC2重启后自动获取新IP,并同步更新NameCheap的DNS记录:

第一步:搞定NameCheap的API访问权限

要自动改DNS,得用NameCheap的API来操作,先把权限开好:

  • 登录NameCheap后台,进入「个人资料(Profile)」→「API访问(API Access)」
  • 开启API访问开关,把你EC2当前的公网IP加到「白名单IP(Whitelisted IPs)」里(注:第一次重启后新IP可能不在白名单,得临时手动加一次,之后脚本就能自动用新IP请求了)
  • 记好你的「API密钥(API Key)」和「用户名(User Name)」,后面脚本要用到

第二步:在EC2上写自动更新IP的脚本

我们需要一个脚本,每次EC2重启后自动抓取新的公网IP,再调用NameCheap API更新DNS记录。这里用Python写,易读还容易调试:

2.1 编写脚本文件

创建update_namecheap_dns.py(路径比如/home/ubuntu/下),内容如下:

import requests
import subprocess

# ====== 替换成你自己的配置 ======
NAMECHEAP_USER = "你的NameCheap用户名"
NAMECHEAP_API_KEY = "你的NameCheap API密钥"
DOMAIN = "example.com"
HOST_RECORD = "@"  # 根域名填@,子域名比如app.example.com就填"app"
RECORD_TYPE = "A"
TTL = 300  # 建议设5分钟,加快解析生效速度
# ==============================

def get_ec2_public_ip():
    # 从EC2元数据服务获取当前公网IP(EC2内部专属地址,不用联网)
    try:
        ip = subprocess.check_output(
            ["curl", "-s", "http://169.254.169.254/latest/meta-data/public-ipv4"]
        ).decode("utf-8").strip()
        return ip
    except Exception as e:
        print(f"获取EC2公网IP失败: {str(e)}")
        return None

def update_namecheap_dns(new_ip):
    # 调用NameCheap API更新DNS记录
    api_url = "https://api.namecheap.com/xml.response"
    params = {
        "ApiUser": NAMECHEAP_USER,
        "ApiKey": NAMECHEAP_API_KEY,
        "UserName": NAMECHEAP_USER,
        "Command": "namecheap.domains.dns.setHosts",
        "ClientIp": new_ip,  # 用当前IP确保在NameCheap白名单内
        "SLD": DOMAIN.split(".")[0],
        "TLD": DOMAIN.split(".")[1],
        f"HostName1": HOST_RECORD,
        f"RecordType1": RECORD_TYPE,
        f"Address1": new_ip,
        f"TTL1": TTL
    }
    try:
        response = requests.get(api_url, params=params)
        # 检查API返回状态(NameCheap API返回XML,简单判断是否成功)
        if "<Status>OK</Status>" in response.text:
            print(f"🎉 DNS记录更新成功!新IP: {new_ip}")
            return True
        else:
            print(f"❌ DNS更新失败,返回内容: {response.text}")
            return False
    except Exception as e:
        print(f"❌ 调用NameCheap API失败: {str(e)}")
        return False

if __name__ == "__main__":
    public_ip = get_ec2_public_ip()
    if public_ip:
        update_namecheap_dns(public_ip)

2.2 安装脚本依赖

在EC2实例上运行命令安装所需工具:

sudo apt update && sudo apt install python3 python3-pip curl -y
pip3 install requests

2.3 设置开机自动执行

用systemd配置开机启动,确保每次重启后脚本自动跑:

  1. 创建systemd服务文件:
sudo nano /etc/systemd/system/update-dns.service

粘贴以下内容(注意替换脚本路径和用户名):

[Unit]
Description=Auto update NameCheap DNS with EC2 public IP on boot
After=network.target  # 等网络就绪再执行

[Service]
Type=oneshot
ExecStart=/usr/bin/python3 /home/ubuntu/update_namecheap_dns.py  # 替换成你的脚本实际路径
User=ubuntu  # 替换成你的EC2登录用户名

[Install]
WantedBy=multi-user.target
  1. 启用并启动服务:
sudo systemctl daemon-reload
sudo systemctl enable update-dns.service

第三步:验证效果

现在重启你的EC2实例,等个5分钟左右:

  • 去AWS控制台看EC2的新公网IP
  • 用nslookup example.com或者dig example.com检查域名解析是否指向新IP
  • 如果失败,查看脚本日志排查问题:journalctl -u update-dns.service

额外小贴士

  • 白名单问题:第一次重启后新IP可能不在NameCheap的API白名单里,导致脚本失败,这时候手动把新IP加到白名单即可,后续脚本会自动用新IP请求,无需再手动操作
  • TTL优化:把DNS的TTL设短(比如300秒),能让全球解析更快切换到新IP
  • 脚本权限:确保脚本有可执行权限,运行脚本的用户能正常访问EC2元数据(默认EC2用户都有这个权限)

内容的提问来源于stack exchange,提问作者xfocus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:53:08