alks
Version:
CLI for working with ALKS
103 lines (91 loc) • 3.24 kB
text/typescript
import clc from 'cli-color';
import commander from 'commander';
import { isEmpty, isUndefined } from 'underscore';
import { badAccountMessage } from '../badAccountMessage';
import { checkForUpdate } from '../checkForUpdate';
import { errorAndExit } from '../errorAndExit';
import { getAlks } from '../getAlks';
import { getAuth } from '../getAuth';
import { getAwsAccountFromString } from '../getAwsAccountFromString';
import { log } from '../log';
import { promptForAlksAccountAndRole } from '../promptForAlksAccountAndRole';
import { tryToExtractRole } from '../tryToExtractRole';
import { unpackTags } from '../unpackTags';
export async function handleAlksIamCreateLtk(options: commander.OptionValues) {
const nameDesc = 'alphanumeric including @+=._-';
const NAME_REGEX = /^[a-zA-Z0-9!@+=._-]+$/g;
const iamUsername = options.iamusername;
let alksAccount: string | undefined = options.account;
let alksRole: string | undefined = options.role;
const filterFaves = options.favorites || false;
const output = options.output || 'text';
const tags = options.tags ? unpackTags(options.tags) : undefined;
try {
log('validating iam user name: ' + iamUsername);
if (isEmpty(iamUsername)) {
errorAndExit('Please provide a username (-n)');
} else if (!NAME_REGEX.test(iamUsername)) {
errorAndExit(
'The username provided contains illegal characters. It must be ' +
nameDesc
);
}
if (!isUndefined(alksAccount) && isUndefined(alksRole)) {
log('trying to extract role from account');
alksRole = tryToExtractRole(alksAccount);
}
if (!alksAccount || !alksRole) {
({ alksAccount, alksRole } = await promptForAlksAccountAndRole({
iamOnly: true,
filterFavorites: filterFaves,
}));
}
const auth = await getAuth();
const alks = await getAlks({
...auth,
});
const awsAccount = await getAwsAccountFromString(alksAccount);
if (!awsAccount) {
throw new Error(badAccountMessage);
}
log('calling api to create ltk: ' + iamUsername);
const ltk = await alks.createAccessKeys({
account: awsAccount.id,
role: alksRole,
iamUserName: iamUsername,
tags,
});
if (output === 'json') {
const ltkData = {
accessKey: ltk.accessKey,
secretKey: ltk.secretKey,
iamUserName: iamUsername,
iamUserArn: ltk.iamUserArn,
};
console.log(JSON.stringify(ltkData, null, 4));
} else {
const ltkData = {
accessKey: ltk.accessKey,
secretKey: ltk.secretKey,
iamUserName: iamUsername,
iamUserArn: ltk.iamUserArn,
alksAccount: awsAccount.id,
alksRole,
};
console.log(
clc.white(
`LTK created for IAM User "${iamUsername}" was created with the ARN: `
) + clc.white.underline(ltkData.iamUserArn)
);
console.log(
clc.white('LTK Access Key: ') + clc.white.underline(ltkData.accessKey)
);
console.log(
clc.white('LTK Secret Key: ') + clc.white.underline(ltkData.secretKey)
);
}
await checkForUpdate();
} catch (err) {
errorAndExit((err as Error).message, err as Error);
}
}