Created
December 10, 2020 13:05
-
-
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 ðŸ˜)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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