UNPKG

@sudolabs-io/aws-ssm-cli

Version:

Command line tool for AWS Systems Manager Parameter Store

100 lines (99 loc) 4.4 kB
"use strict"; 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;