@sudolabs-io/aws-ssm-cli
Version:
Command line tool for AWS Systems Manager Parameter Store
100 lines (99 loc) • 4.4 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.pushParameters = void 0;
const lodash_1 = __importDefault(require("lodash"));
const client_ssm_1 = require("@aws-sdk/client-ssm");
const dotenv_1 = require("./dotenv");
const client_1 = require("./client");
const pull_1 = require("./pull");
function analyze({ client, prefix, file }) {
return __awaiter(this, void 0, void 0, function* () {
const parsedParameters = (0, dotenv_1.parseDotenv)(file);
const remoteParameters = yield (0, pull_1.pullParameters)({ client, prefix });
let skipped = 0;
let updated = 0;
let created = 0;
const parametersToUpdate = lodash_1.default.reduce(parsedParameters, (toUpdate, value, name) => {
if (lodash_1.default.has(remoteParameters, name)) {
if (remoteParameters[name] === value) {
skipped++;
}
else {
updated++;
toUpdate[name] = value;
}
}
else {
created++;
toUpdate[name] = value;
}
return toUpdate;
}, {});
return {
total: lodash_1.default.size(parsedParameters),
skipped,
updated,
created,
parameters: parametersToUpdate,
};
});
}
function printStat({ total, skipped, updated, created }) {
var _a;
const padSize = (_a = lodash_1.default.max([skipped, updated, created])) === null || _a === void 0 ? void 0 : _a.toString().length;
const padStart = (n) => lodash_1.default.padStart(n.toString(), padSize);
console.log([
`Total ${total} of parameters:`,
` ${padStart(skipped)} up-to-date`,
`~ ${padStart(updated)} updated`,
`+ ${padStart(created)} created`,
].join('\n'));
}
/**
* Parameters are sent one by one with 1 second delay after each 10 requests to avoid `ThrottlingException: Rate exceeded`.
* See docs:
* https://aws.amazon.com/premiumsupport/knowledge-center/ssm-parameter-store-rate-exceeded/
* https://docs.aws.amazon.com/general/latest/gr/ssm.html#limits_ssm
*/
function pushParameters(_a) {
var { prefix, file } = _a, config = __rest(_a, ["prefix", "file"]);
return __awaiter(this, void 0, void 0, function* () {
const client = (0, client_1.createClient)(config);
const _b = yield analyze({ client, prefix, file }), { parameters } = _b, stat = __rest(_b, ["parameters"]);
(0, client_1.addThrottleMiddleware)(client, { batchSize: 10, wait: 1000 });
const putCommands = lodash_1.default.map(parameters, (value, name) => new client_ssm_1.PutParameterCommand({
Type: client_ssm_1.ParameterType.STRING,
Overwrite: true,
Name: `${prefix}${name}`,
Value: value,
}));
for (const putCommand of putCommands) {
yield client.send(putCommand);
}
printStat(stat);
});
}
exports.pushParameters = pushParameters;