From 288205e302d9f6afa06b8602184e983d2080a5b6 Mon Sep 17 00:00:00 2001 From: Owen Jacobson Date: Tue, 17 Oct 2023 21:17:55 -0400 Subject: CLI tool for updating Route53 DNS for an ASG. --- src/apply.rs | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 src/apply.rs (limited to 'src/apply.rs') diff --git a/src/apply.rs b/src/apply.rs new file mode 100644 index 0000000..86e92b4 --- /dev/null +++ b/src/apply.rs @@ -0,0 +1,87 @@ +use aws_sdk_route53::types::{Change, ChangeAction, ChangeBatch, ResourceRecordSet}; + +use crate::result::Result; +use crate::route53::Route53; + +pub enum ApplyMode { + DryRun, + Apply, +} + +impl ApplyMode { + pub async fn apply( + &self, + aws_context: &C, + zone_id: &str, + remove_records: R, + insert_records: I, + ) -> Result<()> + where + C: Route53, + R: IntoIterator, + I: IntoIterator, + { + match self { + ApplyMode::DryRun => dry_run(zone_id, remove_records, insert_records).await, + ApplyMode::Apply => apply(aws_context, zone_id, remove_records, insert_records).await, + } + } +} + +async fn dry_run(zone_id: &str, remove_records: R, insert_records: I) -> Result<()> +where + R: IntoIterator, + I: IntoIterator, +{ + let remove_records: Vec<_> = remove_records.into_iter().collect(); + let insert_records: Vec<_> = insert_records.into_iter().collect(); + + println!("ZONE: {}", zone_id); + println!("REMOVE: {:#?}", remove_records); + println!("INSERT: {:#?}", insert_records); + + Ok(()) +} + +async fn apply( + aws_context: &C, + zone_id: &str, + remove_records: R, + insert_records: I, +) -> Result<()> +where + C: Route53, + R: IntoIterator, + I: IntoIterator, +{ + let mut change_batch = ChangeBatch::builder(); + for remove_record in remove_records { + let change = Change::builder() + .action(ChangeAction::Delete) + .resource_record_set(remove_record) + .build(); + change_batch = change_batch.changes(change); + } + for insert_record in insert_records { + let change = Change::builder() + .action(ChangeAction::Create) + .resource_record_set(insert_record) + .build(); + change_batch = change_batch.changes(change); + } + let change_batch = change_batch.build(); + + if let Some(changes) = change_batch.changes() { + if !changes.is_empty() { + aws_context + .route53() + .change_resource_record_sets() + .hosted_zone_id(zone_id) + .change_batch(change_batch) + .send() + .await?; + } + } + + Ok(()) +} -- cgit v1.2.3