2017-01-12 6 views
1

Я пытаюсь использовать boto3 для создания новой записи DNS, однако, похоже, я возвращаю довольно неоднозначную ошибку. Я играл с некоторыми из параметров:boto3 python change_resource_record_sets

https://boto3.readthedocs.io/en/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 

Мой код:

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) 

ответ

0

ResourceRecordset неполно, вам также необходимо указать:

'ResourceRecords': [{'Value': value}] 

(добавить после ТТЛ)

Если вы не «Я делаю это, вы в основном пытаетесь создать запись без адресата. Я также предлагаю вам работать с переменными в 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()