Created
December 13, 2016 23:18
-
-
Save jasonrdsouza/089fb72f9eed6448da11a337c93cdf0f to your computer and use it in GitHub Desktop.
Helper script to quickly restart all of the instances of an app running in AWS under a load balancer
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
''' | |
Helper script to quickly restart all of the instances of a specific app | |
Assumes lots of things about the setup of the app (load balancer, ssh access, supervisor, etc.) | |
''' | |
import boto3 | |
import subprocess | |
import argparse | |
def load_balancer_instances(name): | |
current_elb = elb.describe_load_balancers(LoadBalancerNames=[name]) | |
return [i['InstanceId'] for i in current_elb['LoadBalancerDescriptions'][0]['Instances']] | |
def private_ip(instance_id): | |
return ec2.Instance(instance_id).private_ip_address | |
# Expects that the service is managed by supervisor | |
def restart_service(service_name, ip_address): | |
subprocess.run(["ssh", ip_address, "supervisorctl", "restart", servicename]) | |
def main(service_name, load_balancer_name): | |
print("Restarting {} service via {} load balancer".format(service_name, load_balancer_name)) | |
instance_ids = load_balancer_instances(load_balancer_name) | |
print("Found the following associated instances: {}".format(instance_ids)) | |
ips = [private_ip(i) for i in instance_ids] | |
for ip in ips: | |
print("Restarting {} box with IP {}".format(service_name, ip)) | |
restart_service(service_name, ip) | |
if __name__ == "__main__": | |
parser = argparse.ArgumentParser(description='Restarts services by sshing into all of their instances and performing a supervisor restart') | |
parser.add_argument('--aws-profile', help='AWS profile to use to perform the request', type=str, default='default') | |
parser.add_argument('--service', help='Service name (used by supervisor)', type=str, required=True) | |
parser.add_argument('--load-balancer', help="Which load balancer's instances should be restarted", type=str, required=True) | |
args = parser.parse_args() | |
session = boto3.Session(profile_name=args.aws_profile) | |
elb = session.client('elb') | |
ec2 = session.resource('ec2') | |
main(args.service, args.load_balancer) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment