Skip to content
Snippets Groups Projects
Commit 31f48e5a authored by Nicholas Chammas's avatar Nicholas Chammas Committed by Shivaram Venkataraman
Browse files

[SPARK-8576] Add spark-ec2 options to set IAM roles and instance-initiated shutdown behavior

Both of these options are useful when spark-ec2 is being used as part of an automated pipeline and the engineers want to minimize the need to pass around AWS keys for access to things like S3 (keys are replaced by the IAM role) and to be able to launch a cluster that can terminate itself cleanly.

Author: Nicholas Chammas <nicholas.chammas@gmail.com>

Closes #6962 from nchammas/additional-ec2-options and squashes the following commits:

fcf252e [Nicholas Chammas] PEP8 fixes
efba9ee [Nicholas Chammas] add help for --instance-initiated-shutdown-behavior
598aecf [Nicholas Chammas] option to launch instances into IAM role
2743632 [Nicholas Chammas] add option for instance initiated shutdown
parent bba6699d
No related branches found
No related tags found
No related merge requests found
...@@ -306,6 +306,13 @@ def parse_args(): ...@@ -306,6 +306,13 @@ def parse_args():
"--private-ips", action="store_true", default=False, "--private-ips", action="store_true", default=False,
help="Use private IPs for instances rather than public if VPC/subnet " + help="Use private IPs for instances rather than public if VPC/subnet " +
"requires that.") "requires that.")
parser.add_option(
"--instance-initiated-shutdown-behavior", default="stop",
choices=["stop", "terminate"],
help="Whether instances should terminate when shut down or just stop")
parser.add_option(
"--instance-profile-name", default=None,
help="IAM profile name to launch instances under")
(opts, args) = parser.parse_args() (opts, args) = parser.parse_args()
if len(args) != 2: if len(args) != 2:
...@@ -602,7 +609,8 @@ def launch_cluster(conn, opts, cluster_name): ...@@ -602,7 +609,8 @@ def launch_cluster(conn, opts, cluster_name):
block_device_map=block_map, block_device_map=block_map,
subnet_id=opts.subnet_id, subnet_id=opts.subnet_id,
placement_group=opts.placement_group, placement_group=opts.placement_group,
user_data=user_data_content) user_data=user_data_content,
instance_profile_name=opts.instance_profile_name)
my_req_ids += [req.id for req in slave_reqs] my_req_ids += [req.id for req in slave_reqs]
i += 1 i += 1
...@@ -647,16 +655,19 @@ def launch_cluster(conn, opts, cluster_name): ...@@ -647,16 +655,19 @@ def launch_cluster(conn, opts, cluster_name):
for zone in zones: for zone in zones:
num_slaves_this_zone = get_partition(opts.slaves, num_zones, i) num_slaves_this_zone = get_partition(opts.slaves, num_zones, i)
if num_slaves_this_zone > 0: if num_slaves_this_zone > 0:
slave_res = image.run(key_name=opts.key_pair, slave_res = image.run(
security_group_ids=[slave_group.id] + additional_group_ids, key_name=opts.key_pair,
instance_type=opts.instance_type, security_group_ids=[slave_group.id] + additional_group_ids,
placement=zone, instance_type=opts.instance_type,
min_count=num_slaves_this_zone, placement=zone,
max_count=num_slaves_this_zone, min_count=num_slaves_this_zone,
block_device_map=block_map, max_count=num_slaves_this_zone,
subnet_id=opts.subnet_id, block_device_map=block_map,
placement_group=opts.placement_group, subnet_id=opts.subnet_id,
user_data=user_data_content) placement_group=opts.placement_group,
user_data=user_data_content,
instance_initiated_shutdown_behavior=opts.instance_initiated_shutdown_behavior,
instance_profile_name=opts.instance_profile_name)
slave_nodes += slave_res.instances slave_nodes += slave_res.instances
print("Launched {s} slave{plural_s} in {z}, regid = {r}".format( print("Launched {s} slave{plural_s} in {z}, regid = {r}".format(
s=num_slaves_this_zone, s=num_slaves_this_zone,
...@@ -678,16 +689,19 @@ def launch_cluster(conn, opts, cluster_name): ...@@ -678,16 +689,19 @@ def launch_cluster(conn, opts, cluster_name):
master_type = opts.instance_type master_type = opts.instance_type
if opts.zone == 'all': if opts.zone == 'all':
opts.zone = random.choice(conn.get_all_zones()).name opts.zone = random.choice(conn.get_all_zones()).name
master_res = image.run(key_name=opts.key_pair, master_res = image.run(
security_group_ids=[master_group.id] + additional_group_ids, key_name=opts.key_pair,
instance_type=master_type, security_group_ids=[master_group.id] + additional_group_ids,
placement=opts.zone, instance_type=master_type,
min_count=1, placement=opts.zone,
max_count=1, min_count=1,
block_device_map=block_map, max_count=1,
subnet_id=opts.subnet_id, block_device_map=block_map,
placement_group=opts.placement_group, subnet_id=opts.subnet_id,
user_data=user_data_content) placement_group=opts.placement_group,
user_data=user_data_content,
instance_initiated_shutdown_behavior=opts.instance_initiated_shutdown_behavior,
instance_profile_name=opts.instance_profile_name)
master_nodes = master_res.instances master_nodes = master_res.instances
print("Launched master in %s, regid = %s" % (zone, master_res.id)) print("Launched master in %s, regid = %s" % (zone, master_res.id))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment