Skip to content

Instantly share code, notes, and snippets.

@Rohja
Last active February 1, 2018 13:07
Show Gist options
  • Save Rohja/f8c58ee0d9fabd9eea08cee7f752122e to your computer and use it in GitHub Desktop.
Save Rohja/f8c58ee0d9fabd9eea08cee7f752122e to your computer and use it in GitHub Desktop.
Create DNS Record in zone on new EC2 Instance creation
#
# ------------------------------------------------------------------------------
# "THE BEER-WARE LICENSE" (Revision 42):
# <rohja@rohja.com> wrote this file. As long as you retain this notice you can
# do whatever you want with this stuff. If we meet some day, and you think this
# stuff is worth it, you can buy me a beer in return. Paul "Rohja" Lesellier
# ------------------------------------------------------------------------------
#
import json
import boto3
compute = boto3.client('ec2')
route53 = boto3.client('route53')
def manipulate_record(action, zone, name, dest):
payload = {
'Comment': '{action} record for {name}'.format(action=action, name=name),
'Changes': [
{
'Action': action,
'ResourceRecordSet': {
'Name': name,
'Type': 'A',
'TTL': 0,
'ResourceRecords': [{'Value': x} for x in dest]
}
},
]
}
response = route53.change_resource_record_sets(HostedZoneId=zone,
ChangeBatch=payload)
def add_record(zone_id, name, dest):
print("Add:", name, dest)
manipulate_record("CREATE", zone_id, name, [dest,])
def delete_record(zone_id, name, dest):
print("Delete:", name, dest)
manipulate_record("DELETE", zone_id, name, [dest,])
def update_record(zone_id, name, dest):
print("Update:", name, dest)
manipulate_record("UPSERT", zone_id, name, dest)
def strip_ip_record(zone_id, record_name, value):
print("RecordName:", record_name)
record = route53.list_resource_record_sets(
HostedZoneId=zone_id,
StartRecordName=record_name,
StartRecordType='A'
)
_value = [x[u'Value'] for x in record['ResourceRecordSets'][0]['ResourceRecords'] if x[u'Value'] != value]
print("StripRecord:", _value)
if not len(_value):
print("Delete")
delete_record(zone_id, record_name, value)
else:
print("Update")
update_record(zone_id, record_name, _value)
def append_ip_record(zone_id, record_name, value):
print("RecordName:", record_name)
record = route53.list_resource_record_sets(
HostedZoneId=zone_id,
StartRecordName=record_name,
StartRecordType='A'
)
print("AppendRecord:", value)
if not len(record['ResourceRecordSets']):
print("Add Record:", value)
add_record(zone_id, record_name, value)
else:
_value = [x[u'Value'] for x in record['ResourceRecordSets'][0]['ResourceRecords']]
_value.append(value)
_value = list(set(_value))
print("Edit Record:", _value)
update_record(zone_id, record_name, _value)
def handler(event, context):
print("Received Event: " + json.dumps(event, indent=2))
if event["detail"]["Description"].startswith("Launching a new EC2 instance"):
instance_status = "start"
else:
instance_status = "stop"
account_id = event["account"]
region = event["region"]
asg_name = event["detail"]["AutoScalingGroupName"]
instance_id = event["detail"]["EC2InstanceId"]
instance_arn = "arn:aws:ec2:{region}:{account_id}:instance/{instance_id}".format(region=region,
account_id=account_id,
instance_id=instance_id)
record_name = "{instance_id}.{asg_name}.{region}.lan.".format(instance_id=instance_id,
asg_name=asg_name,
region=region)
all_record_name = "all.{asg_name}.{region}.lan".format(asg_name=asg_name,
region=region)
#============================
zone_id = route53.list_hosted_zones_by_name(DNSName="{region}.lan".format(region=region))['HostedZones'][0]['Id']
print("ZoneID:", zone_id)
#============================
if instance_status == "start":
instance_ip = compute.describe_instances(InstanceIds=[instance_id])["Reservations"][0]["Instances"][0]["PrivateIpAddress"]
print(instance_ip)
add_record(zone_id, record_name, instance_ip)
append_ip_record(zone_id, all_record_name, instance_ip)
else:
record = route53.list_resource_record_sets(
HostedZoneId=zone_id,
StartRecordName=record_name,
StartRecordType='A'
)
value = record['ResourceRecordSets'][0]['ResourceRecords'][0][u'Value']
print(value)
strip_ip_record(zone_id, all_record_name, value)
delete_record(zone_id, record_name, value)
return "OK"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment