Skip to content

Instantly share code, notes, and snippets.

@sgk
Last active December 17, 2015 22:59
Show Gist options
  • Save sgk/5686239 to your computer and use it in GitHub Desktop.
Save sgk/5686239 to your computer and use it in GitHub Desktop.
Linux startup script to update Route53 zone entry using the EC2 dynamically allocated IP address.
#!/usr/bin/python
### BEGIN INIT INFO
# Provides: update53
# Required-Start: $network $local_fs
# Required-Stop:
# Should-Start:
# Should-Stop:
# X-Start-Before: couchbase-server
# X-Stop-After: couchbase-server
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Update Route53
# Description: Update Route53 zone to reflect IP address.
### END INIT INFO
import boto
import boto.ec2
import boto.route53.record
import requests
region = 'ap-northeast-1'
access_key = 'XXXXXXXXXXXXXXXXXXXX'
secret_access_key = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
route53_zone_id = 'XXXXXXXXXXXXXX'
domain = 'example.com.' # last '.' required.
subdomain_public = 'ec2'
subdomain_local = 'ec2local'
def getname(instanceid):
conn = boto.ec2.connect_to_region(region, aws_access_key_id=access_key, aws_secret_access_key=secret_access_key)
return conn.get_all_instances(instanceid)[0].instances[0].tags['Name']
def getinstanceid():
return requests.get('http://169.254.169.254/latest/meta-data/instance-id').content
def getlocalip():
return requests.get('http://169.254.169.254/latest/meta-data/local-ipv4').content
def getpublicip():
return requests.get('http://169.254.169.254/latest/meta-data/public-ipv4').content
def route53_delete(name):
name = name + '.' + domain
print 'Route53 Delete %s' % name
conn = boto.connect_route53(access_key, secret_access_key)
changes = boto.route53.record.ResourceRecordSets(conn, route53_zone_id)
for rr in conn.get_all_rrsets(route53_zone_id, 'A', name, maxitems=10):
if rr.name != name or rr.type != 'A':
continue
change = changes.add_change('DELETE', name, 'A')
for ip in rr.resource_records:
change.add_value(ip)
changes.commit()
def route53_update(name, ipaddr):
name = name + '.' + domain
print 'Route53 Update %s %s' % (name, ipaddr)
conn = boto.connect_route53(access_key, secret_access_key)
changes = boto.route53.record.ResourceRecordSets(conn, route53_zone_id)
for rr in conn.get_all_rrsets(route53_zone_id, 'A', name, maxitems=10):
if rr.name != name or rr.type != 'A':
continue
change = changes.add_change('DELETE', name, 'A')
for ip in rr.resource_records:
change.add_value(ip)
change = changes.add_change('CREATE', name, 'A')
for ip in ipaddr.split(','):
change.add_value(ip)
changes.commit()
return name[:-1] # remove last '.'
def sethostname(fname, hostname):
with open(fname, 'w') as fp:
fp.write(hostname)
def create_hosts(entries):
template = '''127.0.0.1 localhost
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
# Added by /etc/init.d/update53
'''
with open('/etc/hosts', 'w') as fp:
fp.write(template)
for name, ipaddr in entries:
fp.write('%s %s\n' % (ipaddr, name))
def main():
import sys
import os
if len(sys.argv) == 1:
name = getname(getinstanceid())
publicip = getpublicip()
localip = getlocalip()
print 'EC2 instance name=%s public=%s local=%s' % (name, publicip, localip)
elif len(sys.argv) == 2:
name = getname(getinstanceid())
publicip = getpublicip()
localip = getlocalip()
if sys.argv[1] == 'start':
publichost = route53_update(name + '.' + subdomain_public, publicip)
localhost = route53_update(name + '.' + subdomain_local, localip)
sethostname('/etc/hostname', name)
sethostname('/opt/couchbase/var/lib/couchbase/ip_start', localhost)
os.system('hostname "%s"' % name)
create_hosts([
(localhost + ' ' + name, localip),
])
elif sys.argv[1] == 'stop':
route53_delete(name + '.' + subdomain_public)
route53_delete(name + '.' + subdomain_local)
else:
print 'Usage: %s {start|stop}' % sys.argv[0].split('/')[-1]
sys.exit(1)
if __name__ == '__main__':
main()
#!/usr/bin/python
### BEGIN INIT INFO
# Provides: update53
# Required-Start: $network $local_fs
# Required-Stop:
# Should-Start:
# Should-Stop:
# X-Start-Before:
# X-Stop-After:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Update Route53
# Description: Update Route53 zone to reflect IP address.
### END INIT INFO
import boto
import boto.ec2
import boto.route53.record
import requests
region = 'ap-northeast-1'
access_key = 'XXXXXXXXXXXXXXXXXXXX'
secret_access_key = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
route53_zone_id = 'XXXXXXXXXXXXXX'
domain = 'example.com.' # last '.' required.
subdomain_public = 'ec2'
subdomain_local = 'ec2local'
def getname(instanceid):
conn = boto.ec2.connect_to_region(region, aws_access_key_id=access_key, aws_secret_access_key=secret_access_key)
return conn.get_all_instances(instanceid)[0].instances[0].tags['Name']
def getinstanceid():
return requests.get('http://169.254.169.254/latest/meta-data/instance-id').content
def getlocalip():
return requests.get('http://169.254.169.254/latest/meta-data/local-ipv4').content
def getpublicip():
return requests.get('http://169.254.169.254/latest/meta-data/public-ipv4').content
def route53_delete(name):
name = name + '.' + domain
print 'Route53 Delete %s' % name
conn = boto.connect_route53(access_key, secret_access_key)
changes = boto.route53.record.ResourceRecordSets(conn, route53_zone_id)
for rr in conn.get_all_rrsets(route53_zone_id, 'A', name, maxitems=10):
if rr.name != name or rr.type != 'A':
continue
change = changes.add_change('DELETE', name, 'A')
for ip in rr.resource_records:
change.add_value(ip)
changes.commit()
def route53_update(name, ipaddr):
name = name + '.' + domain
print 'Route53 Update %s %s' % (name, ipaddr)
conn = boto.connect_route53(access_key, secret_access_key)
changes = boto.route53.record.ResourceRecordSets(conn, route53_zone_id)
for rr in conn.get_all_rrsets(route53_zone_id, 'A', name, maxitems=10):
if rr.name != name or rr.type != 'A':
continue
change = changes.add_change('DELETE', name, 'A')
for ip in rr.resource_records:
change.add_value(ip)
change = changes.add_change('CREATE', name, 'A')
for ip in ipaddr.split(','):
change.add_value(ip)
changes.commit()
def main():
import sys
if len(sys.argv) == 1:
name = getname(getinstanceid())
publicip = getpublicip()
localip = getlocalip()
print 'EC2 instance name=%s public=%s local=%s' % (name, publicip, localip)
elif len(sys.argv) == 2:
name = getname(getinstanceid())
publicip = getpublicip()
localip = getlocalip()
if sys.argv[1] == 'start':
route53_update(name + '.' + subdomain_public, publicip)
route53_update(name + '.' + subdomain_local, localip)
elif sys.argv[1] == 'stop':
route53_delete(name + '.' + subdomain_public)
route53_delete(name + '.' + subdomain_local)
else:
print 'Usage: %s {start|stop}' % sys.argv[0].split('/')[-1]
sys.exit(1)
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment