autoDNS via Lambda

Ik heb van die machientjes in AWS die ik slechts sporadisch nodig heb, dus staan ze meer uit dan aan. Nadeel is dat ze iedere keer een ander IP adres krijgen om naar te connecten en da’s in sommige gevallen niet handig. Ik kan er natuurlijk een vast Elastic IP aan koppelen, maar dat kost bijna 4 dollar per per systeem per maand zolang het systeem niet gebruikt wordt. Zonde van het geld.

Dus ging ik op zoek naar iets snuggers om volautomatisch ‘ergens’ het nieuwe publieke IP adres te dumpen om eventueel iets te kunnen scripten, maar wat blijkt? Het kan nog veel simpeler…

Er was eens een Japanner, Aiden Kihyun Kim genaamd en die heeft iets briljants bedacht: Update-Route53-Record-to-Ec2-PublicIp-Python3, ook te vinden in de AWS Function repo. De naam is wat minder fabuleus, maar voor de rest is het best snugger. Op basis van een tag en eventueel een CloudWatch rule maakt het script volautomatisch een CNAME Record aan in Route53. En bij iedere boot, wordt datzelfde record bijgewerkt.

Iets meer detail

  • Tag een EC2 instance met Route53FQDN en als key een FQDN.
  • Een CloudWatch rule houdt in de gaten of EC2 instances gestart worden, specifiek of alle. Wanneer de een getagde instance gestart wordt, triggert deze rule de Lambda function
  • Function: een mooi python3 script goed gevuld met commentaar. Ready to use, geen aanpassingen nodig. Wanneer het script draait, gaat het op zoek naar een speciale tag van het desbetreffende systeem en past of maakt een CNAME record in Route53 aan.
  • Hiervoor is uiteraard 1 zone (domein) in Route53 nodig. De records hebben een TTL van 60 seconden, dus de wijzigingen zouden vlot de wereld over moeten gaan.

Et voila: iedere keer als een van m’n instances gestart wordt, kan ik in vrijwel meteen gebruik maken van het FQDN met aangepaste target IP adres. Vanaf nu kan ik dus linken naar een DNS naam ipv IP.

Een klein dingetje…

En dat is de naam van het script en de CloudWatch rule die aangemaakt wordt. Die is allesbehalve pakkend ook veel te lang. Zodra je specifieke instances aan de CloudWatch rule wil toevoegen, kan deze niet opgeslagen worden omdat een eventname niet meer dan 100 karakters krijgen. Zelf een rule maken met een kortere naam is de oplossing :)