@linkedmink/node-route53-dynamic-dns
Version:
Background process that updates AWS Route 53 DNS address records whenever the public IP of the hosting environment changes
46 lines (36 loc) • 1.78 kB
text/typescript
import chalk from "chalk";
import { Command } from "commander";
import { ConfigKey } from "../constants/config.mjs";
import { PACKAGE_VERSION } from "../constants/version.mjs";
import { EnvironmentConfig } from "../environment/environment-config.mjs";
import { initializeLogging } from "../environment/logger.mjs";
import { createRoute53PolicyForZones } from "../functions/aws-iam-policy.mjs";
import { validateNormalizeDnsRecord } from "../functions/validate.mjs";
import { Route53UpdateClient } from "../services/route53-update-client.mjs";
import { DnsZoneRecordClient } from "../types/dns-zone-record-client.mjs";
/**
* @todo Add subcommands to write IAM policy to file or create user via AWS SDK
*/
export default (config: EnvironmentConfig) => {
const main = async () => {
const logger = initializeLogging(config);
const route53Client: DnsZoneRecordClient = new Route53UpdateClient();
logger.verbose("Get accessible DNS zone's");
const inputHostnames = config.getJson<string[]>(ConfigKey.HostnamesToUpdate);
const dnsRecords = inputHostnames.map(validateNormalizeDnsRecord);
const zoneIds = await route53Client.getZonesForDnsRecords(dnsRecords);
if (zoneIds.size <= 0) {
throw new Error(`No zones were found matching the input record: ${dnsRecords.toString()}`);
}
logger.verbose(
`Found zone ID's matching hostnames: ${JSON.stringify(Array.from(zoneIds), null, 2)}`
);
const policyObject = createRoute53PolicyForZones(zoneIds);
console.log(chalk.underline.green("Output JSON:"));
console.log(JSON.stringify(policyObject, null, 2));
};
return new Command("iam-policy")
.version(PACKAGE_VERSION)
.description("Generates an IAM policy for the configured hosted zones")
.action(main);
};