Skip to content

Instantly share code, notes, and snippets.

@sihil
Created December 10, 2020 13:05
Show Gist options
  • Save sihil/e62a6bf89bb9e848a4599d9f746f3a58 to your computer and use it in GitHub Desktop.
Save sihil/e62a6bf89bb9e848a4599d9f746f3a58 to your computer and use it in GitHub Desktop.
Ammonite script to delete a Route53 zone (since you have to delete all the records first 😭)
import $ivy.`software.amazon.awssdk:route53:2.15.42`
import software.amazon.awssdk.services.route53.{Route53Client, Route53ClientBuilder}
import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider
import software.amazon.awssdk.regions.Region
import software.amazon.awssdk.services.route53.model.{Change, ChangeAction, ChangeBatch, ChangeResourceRecordSetsRequest, DeleteHostedZoneRequest, HostedZone, ListHostedZonesRequest, ListResourceRecordSetsRequest}
import scala.collection.JavaConverters._
@main
def main(zoneId: String, profile: String) = {
val credentialsProvider = ProfileCredentialsProvider.builder().profileName(profile).build()
val awsRegion = Region.AWS_GLOBAL
val r53 = Route53Client.builder.credentialsProvider(credentialsProvider).region(awsRegion).build()
System.err.println(s"Getting records for $zoneId in $profile")
val maybeZone = r53.listHostedZonesPaginator().hostedZones().iterator().asScala.toList.find(_.id == zoneId)
maybeZone match {
case None =>
System.err.println(s"Zone with ID $zoneId not found")
System.exit(1)
case Some(zone) =>
deleteZone(r53, zone)
}
}
def deleteZone(route53Client: Route53Client, zone: HostedZone) {
val recordSetsResult = route53Client
.listResourceRecordSetsPaginator(ListResourceRecordSetsRequest.builder().hostedZoneId(zone.id).build)
val recordSets = recordSetsResult.resourceRecordSets().iterator().asScala.toList.sortBy(r => (r.name.count('.'.==), r.name))
val recordSetsToDelete = recordSets.filterNot { recordSet =>
recordSet.name == zone.name && Set("SOA", "NS").contains(recordSet.typeAsString)
}
val changes = recordSetsToDelete.map { record =>
Change.builder().resourceRecordSet(record).action(ChangeAction.DELETE).build()
}
System.err.println(s"Zone with ID ${zone.id} found for ${zone.name}")
System.err.println(s"Will delete ${changes.length} records sets and then the zone")
System.err.println("Really delete? y/n")
val answer = Console.in.readLine
if (answer == "y") {
if (changes.nonEmpty) {
val batch = ChangeBatch.builder().changes(changes:_*).build()
route53Client.changeResourceRecordSets(ChangeResourceRecordSetsRequest.builder.changeBatch(batch).hostedZoneId(zone.id).build())
}
route53Client.deleteHostedZone(DeleteHostedZoneRequest.builder.id(zone.id).build())
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment