-
Notifications
You must be signed in to change notification settings - Fork 63
Description
I am requesting spot instances that have an EBS snapshot attached that contains project files to render. I get a bad-parameters failure on the spot request with the following state: failed: Invalid device name /dev/sdf1 The output from the brenda-run command gives me my Snapshot ID, and what appears to be the device mapping:
Project EBS snapshot: [('snap-xxxxxxxx', '/dev/sdf1')]
Would the spot requests be failing because brenda (or boto) is device mapping to something AWS is saying is invalid? brenda is assigning block_device_map to bdm , and in brenda/aws.py, bdm is using boto.ec2.blockdevicemapping.BlockDeviceMapping()
from brenda/aws.py:
def blk_dev_map(opts, conf, itype, snapshots):
if not int(conf.get('NO_EBS', '0')):
bdm = boto.ec2.blockdevicemapping.BlockDeviceMapping()
snap = project_ebs_snapshot(conf)
snap_id = translate_snapshot_name(conf, snap, snapshots)
snap_description = []
if snap_id:
dev = utils.blkdev(0)
bdm[dev] = boto.ec2.blockdevicemapping.EBSBlockDeviceType(snapshot_id=snap_id, delete_on_termination=True)
snap_description.append((snap, snap_id, dev))
i = 0
for k in additional_ebs_iterator(conf):
i += 1
snap = parse_ebs_url(conf[k].split(',')[0])
snap_id = translate_snapshot_name(conf, snap, snapshots)
if snap_id:
dev = utils.blkdev(i)
bdm[dev] = boto.ec2.blockdevicemapping.EBSBlockDeviceType(snapshot_id=snap_id, delete_on_termination=True)
snap_description.append((snap, snap_id, dev))
istore_dev = add_instance_store(opts, conf, bdm, itype)
return bdm, snap_description, istore_dev
else:
return None, None, None
In the file used to start up the instances, brenda/run.py, bdm is given as the block_device_map
from brenda/run.py:
def spot(opts, conf):
ami_id = utils.get_opt(opts.ami, conf, 'AMI_ID', default=AMI_ID, must_exist=True)
price = utils.get_opt(opts.price, conf, 'BID_PRICE', must_exist=True)
reqtype = 'persistent' if opts.persistent else 'one-time'
itype = brenda_instance_type(opts, conf)
snapshots = aws.get_snapshots(conf)
bdm, snap_description, istore_dev = aws.blk_dev_map(opts, conf, itype, snapshots)
script = startup_script(opts, conf, istore_dev)
user_data = None
if not opts.idle:
user_data = script
ssh_key_name = conf.get("SSH_KEY_NAME", "brenda")
sec_groups = (conf.get("SECURITY_GROUP", "brenda"),)
run_args = {
'image_id' : ami_id,
'price' : price,
'type' : reqtype,
'count' : opts.n_instances,
'instance_type' : itype,
'user_data' : user_data,
'key_name' : ssh_key_name,
'security_groups' : sec_groups,
'block_device_map' : bdm,
}
print "----------------------------"
print "AMI ID:", ami_id
print "Max bid price", price
print "Request type:", reqtype
print "Instance type:", itype
print "Instance count:", opts.n_instances
if snap_description:
print "Project EBS snapshot:", snap_description
if istore_dev:
print "Instance store device:", istore_dev
print "SSH key name:", ssh_key_name
print "Security groups:", sec_groups
print_script(opts, conf, script)
aws.get_done(opts, conf) # sanity check on DONE var
if not opts.dry_run:
ec2 = aws.get_ec2_conn(conf)
reservation = ec2.request_spot_instances(**run_args)
print reservation
It seems similar to what's going on in this thread, but I'm not sure how to implement the solution in my case with brenda.
boto version: 2.49.0
Appreciate any help!