forked from abdul/ec2-spot-instance-launcher
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathec2_funcs.py
119 lines (101 loc) · 4.26 KB
/
ec2_funcs.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
from boto.ec2.connection import EC2Connection
from time import sleep
import subprocess
import ConfigParser, os, socket
import sys
config = ConfigParser.ConfigParser()
config.read('spot-ec2-proxifier.conf')
def create_client():
client = EC2Connection(config.get('IAM', 'access'), config.get('IAM', 'secret'))
regions = client.get_all_regions()
for r in regions:
if r.name == config.get('EC2', 'region'):
client = EC2Connection(config.get('IAM', 'access'), config.get('IAM', 'secret'), region = r)
return client
return None
def get_existing_instance(client):
instances = client.get_all_instances(filters = { 'tag-value': config.get('EC2', 'tag') })
if len(instances) > 0:
return instances[0].instances[0]
else:
return None
def get_spot_price(client):
print 'Getting spot price'
price_history = client.get_spot_price_history(instance_type = config.get('EC2', 'type'), product_description = 'Linux/UNIX', availability_zone=config.get('EC2', 'zone'))
return price_history[0].price
def provision_instance(client):
# with open(config.get('EC2', 'user_data_file'), 'r') as myfile:
# user_data=myfile.read()
req = client.request_spot_instances(
price = config.get('EC2', 'max_bid'),
image_id = config.get('EC2', 'AMI'),
instance_type = config.get('EC2', 'type'),
key_name = config.get('EC2', 'key_pair'),
security_group_ids = [config.get('EC2', 'security_group')],
placement = config.get('EC2', 'zone'),
# user_data=user_data,
)[0]
print 'Spot request created, status: ' + req.state
print 'Waiting for spot provisioning',
while True:
current_req = client.get_all_spot_instance_requests([req.id])[0]
if current_req.state == 'active':
instance = client.get_all_instances([current_req.instance_id])[0].instances[0]
instance.add_tag('Name', config.get('EC2', 'tag'))
print 'done.'
return instance
print '.',
sys.stdout.flush()
sleep(5)
def destroy_instance(client, inst):
try:
print 'Terminating', str(inst.id), '...',
client.terminate_instances(instance_ids = [inst.id])
print 'done.'
inst.remove_tag('Name', config.get('EC2', 'tag'))
except:
print 'Failed to terminate:', sys.exc_info()[0]
def attach_volume(client, inst):
try:
client.attach_volume(config.get('EBS', 'vol_id'), inst.id, config.get('EBS', 'dev'))
print 'Volume attached!'
except Exception as e:
print 'Could not attach volume: %e'%e
def wait_for_up(client):
print 'Waiting for instance to start running'
while True:
inst = get_existing_instance(client)
if inst.state == u'running':
print 'done.'
attach_volume(client,inst)
break
print '.',
sys.stdout.flush()
sleep(5)
print 'Checking connectivity'
while True:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
if inst.ip_address is None:
inst = get_existing_instance(client)
try:
if inst.ip_address is None:
print 'IP not assigned yet ...',
else:
s.connect((inst.ip_address, 22))
s.shutdown(2)
print 'Server is up!'
print 'instance id = %s, IP = %s'%(inst.id,inst.ip_address),
with open('current_instance_ip_address', 'w') as ipfile:
ipfile.write('ec2 %s\n'%inst.ip_address)
with open('current_instance_id', 'w') as ipfile:
ipfile.write('%s\n'%inst.id)
# mount the volume to home and run setup script
with open(config.get('EC2', 'user_data_file'), 'r') as myfile:
user_data=myfile.read()
ret = subprocess.call(["ssh", "-o", "StrictHostKeyChecking no", "ubuntu@%s"%inst.ip_address, user_data]);
print 'Volume mounted!' if ret == 0 else 'Volume could not be mounted correctly'
break
except:
print '.',
sys.stdout.flush()
sleep(5)