tezda-ip-whitelist-cli
Version:
CLI tool to update IP whitelist via AWS Lambda
112 lines (93 loc) • 3.25 kB
text/typescript
import { Command } from 'commander';
import { resolve as dnsResolve } from 'dns/promises';
import { createLambdaClient, invokeLambda, InvokePayload, LambdaResponse } from './invoke';
import { STSClient, GetCallerIdentityCommand } from '@aws-sdk/client-sts';
/**
* Parses and retrieves command-line arguments.
*/
const program = new Command();
program
.name('ip-whitelist-cli')
.description('CLI tool to update IP whitelist via AWS Lambda')
.version('1.0.0')
.option('-p, --profile <profile>', 'AWS profile to use')
.option('-r, --region <region>', 'AWS region', 'us-east-1')
.parse(process.argv);
const options = program.opts();
/**
* Retrieves the current caller's identity using AWS STS.
*
* @param stsClient - An instance of STSClient.
* @returns The caller's identity.
*/
const getCallerIdentity = async (stsClient: STSClient) => {
const command = new GetCallerIdentityCommand({});
try {
const response = await stsClient.send(command);
return response;
} catch (error: any) {
console.error('Error fetching caller identity:', error.message || error);
throw error;
}
};
/**
* The main function orchestrating the CLI tool's operations.
*/
const main = async () => {
const { profile, region } = options;
const lambdaClient = createLambdaClient(region, profile);
const stsClient = new STSClient({
region,
credentials: profile ? undefined : undefined,
});
let callerIdentity;
try {
callerIdentity = await getCallerIdentity(stsClient);
const { UserId, Account, Arn } = callerIdentity;
console.log(`Caller Identity - UserId: ${UserId}, Account: ${Account}, Arn: ${Arn}`);
} catch (error) {
process.exit(1);
}
const arnParts = callerIdentity.Arn?.split('/') || [];
const usernameWithDomain = arnParts[arnParts.length - 1];
if (!usernameWithDomain) {
console.error('Unable to extract username from ARN.');
process.exit(1);
}
if (!usernameWithDomain.endsWith('@tezda.com') || !usernameWithDomain.endsWith('@ozb.com')) {
console.error('Error: Username must end with @tezda.com or @ozb.com');
process.exit(1);
}
const [userPrefix] = usernameWithDomain.split('@');
if (!userPrefix) {
console.error('Error extracting username prefix.');
process.exit(1);
}
const constructedHostname = `${userPrefix}-tezda.ddns.net`;
console.log(`Constructed hostname: ${constructedHostname}`);
let ipAddress: string;
try {
const addresses = await dnsResolve(constructedHostname);
if (addresses.length === 0) {
throw new Error(`No IP addresses found for hostname: ${constructedHostname}`);
}
ipAddress = addresses[0];
console.log(`Resolved IP address for ${constructedHostname}: ${ipAddress}`);
} catch (error: any) {
console.error('Error resolving hostname:', error.message || error);
process.exit(1);
}
const payload: InvokePayload = {
ipAddress,
tag: usernameWithDomain,
};
const lambdaFunctionName = 'tezda-ip-whitelist-cli-dev-updateIp';
try {
await invokeLambda(lambdaClient, lambdaFunctionName, payload);
} catch (error: any) {
console.error('Failed to invoke Lambda function:', error.message || error);
process.exit(1);
}
};
main();