boto3 python change_resource_record_sets

dar*_*nea 3 python amazon-ec2 boto3

我正在尝试使用boto3创建新的DNS记录,但是我似乎正在找回一个非常模棱两可的错误。我玩过以下一些参数:

https://boto3.readthedocs.io/zh-CN/develop/reference/services/route53.html#Route53.Client.change_resource_record_sets

我已经搜索了此示例,但找不到任何示例。

    [12/01/2017 09:57:12] [INFO]: get_zone_data found zone [{u'ResourceRecordSetCount': 11, u'CallerReference': 
    '6A78SD-88E9-11F7-B1C6-A8S7DAS8D7',
     u'Config': {u'PrivateZone': False}, u'Id': '/hostedzone/ASD678ASD78', u'Name': 'test.mydomain.com.'}]
    Traceback (most recent call last):
      File "example.py", line 6, in <module>
        dns.add(name='hurried.me')
      File "scale/scale/net/dns.py", line 99, in add
client.change_resource_record_sets(**params)
      File "/usr/local/lib/python2.7/site-packages/botocore/client.py", line 251, in _api_call
        return self._make_api_call(operation_name, kwargs)
      File "/usr/local/lib/python2.7/site-packages/botocore/client.py", line 537, in _make_api_call
        raise ClientError(parsed_response, operation_name)
    botocore.exceptions.ClientError: An error occurred (InvalidInput) when calling the ChangeResourceRecordSets operation: Invalid request
Run Code Online (Sandbox Code Playgroud)

我的代码:

    def add(self, name=None,
            type='A',
            location='172.32.0.1',
            weight=10,
            ttl=10,
            private=False,
            ):

    zone = self.get_zone_data(name, private)
                        #'Weight': weight,

    params = {
        'HostedZoneId': 'C0P6YPA54A',
        'ChangeBatch': {
            'Changes': [{
                'Action': 'CREATE',
                    'ResourceRecordSet': {
                        'Name': 'test.mydomain.com',
                        'Type': 'A',
                        'TTL': 300,
                    }
                },]
        }
    }

    client = self.session.client('route53')
    client.change_resource_record_sets(**params)
Run Code Online (Sandbox Code Playgroud)

小智 5

ResourceRecordset不完整,您还需要指定:

'ResourceRecords': [{'Value': value}] 
Run Code Online (Sandbox Code Playgroud)

(在ttl之后添加)

如果您不这样做,则基本上是在尝试创建没有目的地的记录。我还建议您使用ResourceRecordset中的变量,以使其更易于用于各种操作!

我目前这样做:

import boto3
import argparse


client = boto3.client('route53')

TYPE = ['CNAME',
        'A']

ACTION = ['CREATE',
          'DELETE',
          'UPSERT']

def add_cname_record(Name, value, action, type, ttl):
    try:
        response = client.change_resource_record_sets(
        HostedZoneId='<HOSTEDZONE>',
        ChangeBatch= {
                        'Comment': 'add %s -> %s' % (Name, value),
                        'Changes': [
                            {
                             'Action': action,
                             'ResourceRecordSet': {
                                 'Name': Name,
                                 'Type': type,
                                 'TTL': ttl,
                                 'ResourceRecords': [{'Value': value}]
                            }
                        }]
        })
    except Exception as e:
        print(e)

def main():
    parser = argparse.ArgumentParser(description='Create DNS records on R53')

    parser.add_argument('-N', '--Name', required=True, type=str)
    parser.add_argument('-T', '--Type', choices=TYPE, required=True, type=str)
    parser.add_argument('-v', '--value', required=True)
    parser.add_argument('-a', '--action', choices=ACTION, required=True)
    parser.add_argument('-t', '--ttl', default=300, type=int)

    args = parser.parse_args()

    add_cname_record(args.Name, args.value, args.action, args.Type, args.ttl)

if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)