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配置开机启动,确保每次重启后脚本自动跑:
- 创建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
- 启用并启动服务:
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
相关产品推荐
相关产品推荐

