首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用boto更改AWS Route53注册域的名称服务器?

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

Stack Overflow用户
提问于 2015-02-26 19:01:47
回答 2查看 899关注 0票数 2

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

代码语言:javascript
复制
boto.exception.JSONResponseError: JSONResponseError: 400 Bad Request
{u'Message': u'Expected null', u'__type': u'SerializationException'}

即使我使用的是API 如文件所示,也要传递一个字符串列表,例如

代码语言:javascript
复制
['ns-705.awsdns-21.net', 'ns-1401.awsdns-24.org', 'ns-1107.awsdns-11.co.uk', 'ns-242.awsdns-75.com']

作为第二个论点。

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

代码语言:javascript
复制
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
代码语言:javascript
复制
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'}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-26 20:20:20

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

代码语言:javascript
复制
[{"Name": "ns1.example.com"}, {"Name": "ns2.example.com"}]

还有一个名为GlueIps的可选键。听起来这对你的案子来说并不是必要的,但是你可以找到更多的信息,这里

票数 3
EN

Stack Overflow用户

发布于 2015-06-15 18:48:52

我只是亲自经历了这件事,下面是我所做的(基于上面的例子)..顺便说一句,这是基于Boto v2,fyi:

下一行:

代码语言:javascript
复制
nameservers = hz.get_nameservers()

实际上返回NSs的列表,如:

代码语言:javascript
复制
[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)时,您必须传入一个键值为"Name“的JSON列表,例如:

代码语言:javascript
复制
[{u'Name': u'ns-1515.awsdns-61.org'}, {u'Name': u'ns-576.awsdns-08.net'}]

要进行转换,您可以这样做

代码语言:javascript
复制
ns = [dict(Name=pn) for pn in nameservers]

然后您可以更新NS记录:

代码语言:javascript
复制
registered_domains.update_domain_nameservers(domain, ns)

希望这能有所帮助!

对不起,我是从两个帐户张贴-固定!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28750641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档