调用阿里云api去修改域名对应IP

问题简述

以阿里云厂家为例,假设我们有一个网站,它的服务器、数据库、负载均衡都部署在杭州区可用区B,将IP A绑定到某个域名上,启动了系统之后为客户提供服务。那么如果现在要对这套系统进行灾备,应该怎么做?

第一个方法:在可用区D复制一模一样的环境,然后以“主备服务器组”的方式配置一下负载均衡:如果端口监听不正常就会切换到备用服务器上,监听正常了再切回来。但是这个方式有一个问题,就是当前模式阿里云的主备切换是不支持HTTPS/HTTP的,如图:
akb48

可见,这种方式是有很大的局限性的。

那既然同是花钱,干脆就做一个异地容灾,整套系统在其他的地理区域比如上海区也复制一遍,把上海区的B IP也绑定到这个网站域名上,阿里云的域名解析是支持多IP绑定同一个域名的。平时的时候,上海区的IP被域名解析的权重是0,一旦杭州区出现了某些线路方面的硬件问题,那么就将杭州区的权重降成0,同时提高上海区的权重,这样用户就会直接访问到上海区的系统。

理想是丰满的,但是现实是骨感的,因为阿里云的权重配置区域是1~100,而不是0~100,如下图:
akb48

也就是说这个云解析的负载均衡是不能当做主备切换使用的,如果想要通过阿里云解析来达到主备切换的目的,方法只能是升级VIP DNS,配置网站监控,具体操作是https://help.aliyun.com/document_detail/59372.html?spm=5176.215331.1147916.23.65de614dac85Sw 。但是这个VIP升级是需要钱的,如果监控的网站越多,花费越大,如果老板不肯掏这份钱,那就只能换条路走。

脚本内容

想来想去,还是老办法—-调用阿里云API修改云解析记录达到切换IP的目的。脚本如下,这里我采取了命令行交互的形式,实际上都是将域名IP写死的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/env python
#coding=utf-8
#此脚本版本是2.7,用来修改阿里云云解析IP地址,使用之前请先安装sdk:pip install aliyun-python-sdk-domain

import json
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
print "请注意!本脚本只会修改lechange.com域名下的A记录!!!"
RRKeyWord = raw_input("请输入您要修改的域名:")
Value = raw_input("请输入新的IP:")
client = AcsClient('这里是AK', '这里是SK','cn-hangzhou')
request = CommonRequest()
request.set_accept_format('json')
request.set_domain('alidns.aliyuncs.com')
request.set_method('POST')
request.set_version('2015-01-09')

def getRecordId(RRKeyWord):
global RecordId
request.set_action_name('DescribeDomainRecords')
request.add_query_param('DomainName', 'lechange.com') #这里写死了lechange.com域名
request.add_query_param('RRKeyWord', RRKeyWord)
request.add_query_param('TypeKeyWord', 'A')
response = client.do_action_with_exception(request)
encode_json = json.loads(response)
RecordId = encode_json['DomainRecords']['Record'][0]['RecordId'] #需要获取这个RecordId

def UpdateDomainRecord(RRKeyWord,Value):
request.set_action_name('UpdateDomainRecord')
request.add_query_param('RecordId', RecordId)
request.add_query_param('RR', RRKeyWord)
request.add_query_param('Type', 'A')
request.add_query_param('Value', Value)
response = client.do_action_with_exception(request)

if __name__ == "__main__":
getRecordId(RRKeyWord)
UpdateDomainRecord(RRKeyWord,Value)

这个脚本比较粗糙,可以改进的地方如下:

  1. 判断输入的域名和IP是否符合格式的规范;
  2. 判断输入的域名是否存在;
  3. 如果添加错误,对应的报错;
  4. 搭配爬虫页面脚本使用,如果爬虫页面脚本出现了异常,那么直接启动这个脚本,并且发送微信/邮件通知!

效果展示

整个脚本启动后效果如下:
akb48

参考资料

https://help.aliyun.com/document_detail/29776.html?spm=a2c4g.11186623.2.37.d31b31dfNqojPT
https://help.aliyun.com/document_detail/44657.html?spm=a2c4g.11186623.6.579.4d1d7cd208aSgl

-------------This article is over!Thanks for reading!-------------
感谢您请我喝咖啡!(o´ω`o)
0%