summaryrefslogtreecommitdiff
path: root/src/bin
diff options
context:
space:
mode:
authorOwen Jacobson <owen@grimoire.ca>2023-10-17 21:17:55 -0400
committerOwen Jacobson <owen@grimoire.ca>2023-10-17 22:32:21 -0400
commit288205e302d9f6afa06b8602184e983d2080a5b6 (patch)
treedfb307e8f3cb82d280e5a0392f11318194e09ef1 /src/bin
CLI tool for updating Route53 DNS for an ASG.
Diffstat (limited to 'src/bin')
-rw-r--r--src/bin/aws-autoscaling-dns/main.rs68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/bin/aws-autoscaling-dns/main.rs b/src/bin/aws-autoscaling-dns/main.rs
new file mode 100644
index 0000000..739f0c8
--- /dev/null
+++ b/src/bin/aws-autoscaling-dns/main.rs
@@ -0,0 +1,68 @@
+use std::fmt::Debug;
+
+use clap::Parser;
+use trust_dns_proto::rr::Name;
+
+use aws_autoscaling_dns::apply::ApplyMode;
+use aws_autoscaling_dns::aws_context::AwsContext;
+use aws_autoscaling_dns::converge::named_asg_changes;
+use aws_autoscaling_dns::result::Result;
+
+/// Synchronize a DNS entry with an autoscaling group's running instances.
+///
+/// The given DNS name's A and AAAA records in Route53 will be rewritten to exactly
+/// match the list of pending and in-service EC2 instances in the specified
+/// autoscaling group. Records of other types (including CNAMEs) will not be
+/// modified, so this can be used alongside DNS ACME verification, SPF, and other
+/// DNS applications.
+#[derive(Parser, Debug)]
+struct Args {
+ /// The name of the autoscaling group to synchronize.
+ #[arg(long)]
+ autoscaling_group: String,
+
+ /// The DNS domain name to synchronize. The most specific Route53 zone that
+ /// contains this name will be modified.
+ #[arg(long)]
+ dns_name: Name,
+
+ /// The TTL (in seconds) for newly-created records.
+ #[arg(long, default_value_t = 300)]
+ dns_ttl: i64,
+
+ /// Print the affected zone ID and pending changes, without applying them (default).
+ #[arg(long, conflicts_with = "apply")]
+ dry_run: bool,
+
+ /// Apply the changes to Route53.
+ #[arg(long)]
+ apply: bool,
+}
+
+#[tokio::main]
+async fn main() -> Result<()> {
+ let args = Args::parse();
+ let name = args.autoscaling_group;
+
+ let aws_context = AwsContext::from_env().await;
+
+ let apply_mode = if args.dry_run {
+ ApplyMode::DryRun
+ } else if args.apply {
+ ApplyMode::Apply
+ } else {
+ ApplyMode::DryRun
+ };
+
+ let changes = named_asg_changes(&aws_context, &name, &args.dns_name, args.dns_ttl).await?;
+ apply_mode
+ .apply(
+ &aws_context,
+ &changes.zone_id,
+ changes.remove,
+ changes.insert,
+ )
+ .await?;
+
+ Ok(())
+}