2015-10-14 7 views
1

Я хочу развернуть экземпляр ec2, а затем завершить его и убедиться, что хранилище EBS также удалено после завершения экземпляра, поэтому мне нужно установить флаг DeleteOnTermination , Я попытался это с помощью Boto:Как включить DeleteOnTermination для экземпляра ec2, спрятанного от boto

conn = boto.ec2.connect_to_region('us-east',\ 
    aws_access_key_id=os.getenv('aws_access_key_id'),\ 
    aws_secret_access_key=os.getenv('aws_secret_access_key')) 

groups = conn.get_all_security_groups(filters={'group-name': ['xxx']}) 

reservation = conn.run_instances(
    ami, 
    key_name=os.getenv('key_name'), 
    instance_type=instance_type, 
    security_groups=groups) 

tag = os.getenv('BUILD_NUMBER', None) 
instance = reservation.instances[0] 
# Note: setting boto.ec2.blockdevicemapping.BlockDeviceType().delete_on_termination = True 
# does not help. 
instance.modify_attribute('blockDeviceMapping', ['/dev/sda1=1']) 

Последняя строка кода выше является трюк, который я использовал. Он работал в некоторых случаях, но для экземпляра, который я хочу использовать, я получаю эту ошибку:

Traceback (most recent call last): 
    File "ec2_api.py", line 173, in <module> 
    instance_id, ip_address = spinup_instance(params.ami, params.type) 
    File "ec2_api.py", line 83, in spinup_instance 
    instance.modify_attribute('blockDeviceMapping', ['/dev/sda1=1']) 
    File "/home/x/python2.7/site-packages/boto/ec2/instance.py", line 557, in modify_attribute 
    dry_run=dry_run 
    File "/home/x/python2.7/site-packages/boto/ec2/connection.py", line 1274, in modify_instance_attribute 
    return self.get_status('ModifyInstanceAttribute', params, verb='POST') 
    File "/home/x/python2.7/site-packages/boto/connection.py", line 1227, in get_status 
    raise self.ResponseError(response.status, response.reason, body) 
boto.exception.EC2ResponseError: EC2ResponseError: 400 Bad Request 
<?xml version="1.0" encoding="UTF-8"?> 
<Response><Errors><Error><Code>InvalidInstanceAttributeValue</Code><Message>No device is currently mapped at /dev/sda1</Message></Error></Errors><RequestID>xxx</RequestID></Response> 

Любые идеи, как добиться того, что я описал.

Update: Я побежал:

conn.get_instance_attribute(instance_id=instance.id, attribute='blockDeviceMapping')['blockDeviceMapping'] 
{u'/dev/sda1': <boto.ec2.blockdevicemapping.BlockDeviceType object at 0x2a62190>} 

так блочное устройство правильно.

+0

Похоже блочное устройство не на/DEV/sda1, что это показывает, когда список из сопоставления блоков устройств? – AChampion

+0

@AChampion Я проверил как обновлено выше. Блочное устройство является правильным. – max

ответ

0

Я получил его, и хотел бы поделиться:

from boto.ec2.blockdevicemapping import BlockDeviceType, BlockDeviceMapping 

def set_ebs_termination(conn, instance_id, attempts=15): 
    """ 
    @conn: ec2 connection 
    @instance_id: string 
    """ 
    for iter in range(attempts): 
     block = conn.get_instance_attribute(instance_id=instance_id,\ 
      attribute='blockDeviceMapping')['blockDeviceMapping'] 

     if '/dev/sda1' in block and\ 
      (block['/dev/sda1']).status == 'attached': 
      break 
     logging.info('Waiting for the EBS to get attached.') 
     time.sleep(30) 

    if (block['/dev/sda1']).status != 'attached': 
     raise Exception('The EBS was not attached'\ 
      'after {} iterations.'.format(attempts)) 
    logging.info('Setting the block device termination.') 
    bdm = BlockDeviceMapping() 
    bdm['/dev/sda1'] = BlockDeviceType(delete_on_termination=True) 
    conn.modify_instance_attribute(instance_id, "BlockDeviceMapping", bdm) 
Смежные вопросы