如何使用boto更改AWS Route53注册域的名称服务器?

时间:2015-02-26 19:01:48

标签: python amazon-web-services boto amazon-route53

我无法使用AWS boto API更改我的AWS Route53已注册域名的名称服务器。在下面的Python代码中,我得到了

boto.exception.JSONResponseError: JSONResponseError: 400 Bad Request
{u'Message': u'Expected null', u'__type': u'SerializationException'}

即使我使用API​​ as documented,也要传递一个字符串列表,例如

['ns-705.awsdns-21.net', 'ns-1401.awsdns-24.org', 'ns-1107.awsdns-11.co.uk', 'ns-242.awsdns-75.com']

作为第二个论点。

如何从Python更改名称服务器?


def createhz(domain=None, verbose=False):
    """Create a Hosted Zone for the specified domain and update nameservers for Route53 Registered Domain"""
    r53 = boto.route53.connection.Route53Connection()
    if r53.get_hosted_zone_by_name(domain + '.'):
        print('WARNING: Hosted Zone for {} already exists.'.format(domain))
        hz = r53.get_zone(domain + '.')
    else:
        if verbose:
            print('Creating Hosted Zone for {}.'.format(domain))
        hz = r53.create_zone(domain + '.')

    nameservers = hz.get_nameservers()
    if verbose:
        print('Hosted Zone has nameservers:')
        for ns in nameservers:
            print('  {}'.format(ns))

    registered_domains = boto.route53.domains.layer1.Route53DomainsConnection()

    try:
        registered_domains.get_domain_detail(domain)
        if verbose:
            print('Updating nameservers for Route53 Registered Domain.'.format(domain))
        # THE FOLLOWING LINE FAILS
        registered_domains.update_domain_nameservers(domain, nameservers)
    except Exception as e:
        if e.message == 'Domain not found.':
            print('WARNING: No Route53 Registered Domain for {}.'.format(domain))
            print('Set the nameservers at your domain registrar to:.'.format(domain))
            for ns in nameservers:
                print('  {}'.format(ns))
        else:
            raise e

    return

Traceback (most recent call last):
  File "manage.py", line 362, in <module>
    manager.run()
  File "/usr/local/lib/python2.7/site-packages/flask_script/__init__.py", line 412, in run
    result = self.handle(sys.argv[0], sys.argv[1:])
  File "/usr/local/lib/python2.7/site-packages/flask_script/__init__.py", line 383, in handle
    res = handle(*args, **config)
  File "/usr/local/lib/python2.7/site-packages/flask_script/commands.py", line 216, in __call__
    return self.run(*args, **kwargs)
  File "manage.py", line 336, in createhz
    raise e
boto.exception.JSONResponseError: JSONResponseError: 400 Bad Request
{u'Message': u'Expected null', u'__type': u'SerializationException'}

2 个答案:

答案 0 :(得分:2)

对Route53域功能的支持在boto中是非常新的,并且没有很好的文档记录。通过查看服务API,我发现update_domain_servers方法希望nameservers参数是表单的字典列表:

[{"Name": "ns1.example.com"}, {"Name": "ns2.example.com"}]

还有一个名为GlueIps的可选键。它听起来并不像您的情况所需,但您可以找到更多信息here

答案 1 :(得分:1)

我亲自经历了这一点,所以我在这里做了什么(根据你上面的例子)..顺便说一下,这是基于Boto v2,fyi:

以下行:

nameservers = hz.get_nameservers()

实际上会返回NS列表,例如:

[u'ns-1069.awsdns-05.org.', u'ns-1755.awsdns-27.co.uk.', u'ns-399.awsdns-49.com.', u'ns-816.awsdns-38.net.']

但是,当您想要运行registered_domains.update_domain_nameservers(domain, nameservers)时,您必须传入一个JSON列表,其键值为&#34; Name&#34;,例如:

[{u'Name': u'ns-1515.awsdns-61.org'}, {u'Name': u'ns-576.awsdns-08.net'}]

要进行转换,您可以执行以下操作

ns = [dict(Name=pn) for pn in nameservers]

然后你可以更新NS记录:

registered_domains.update_domain_nameservers(domain, ns)

希望这有帮助!

抱歉,我发布了2个帐号 - 已修复!

相关问题