UNPKG

@matthewbonig/rds-tools

Version:

A construct for working with RDS SQL servers

101 lines 13 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.adhocHandler = exports.handler = exports.innerHandler = exports.getProvider = void 0; // eslint-disable-next-line @typescript-eslint/no-require-imports const AWS = require('aws-sdk'); // eslint-disable-next-line @typescript-eslint/no-require-imports const response = require('./cfn-response'); const getProvider = (props) => { const commonProps = { host: props.host, port: props.port, username: props.username, password: props.password, databaseName: props.databaseName, }; switch (props.engine) { case 'sqlserver': case 'sqlserver-se': case 'sqlserver-ex': case 'sqlserver-ee': case 'sqlserver-web': // eslint-disable-next-line @typescript-eslint/no-require-imports const { MsSqlProvider } = require('./mssql-provider'); return new MsSqlProvider(commonProps); case 'postgres': // eslint-disable-next-line @typescript-eslint/no-require-imports const { PostgresSqlProvider } = require('./postgres-provider'); return new PostgresSqlProvider(commonProps); case 'mysql': // eslint-disable-next-line @typescript-eslint/no-require-imports const { MySqlProvider } = require('./mysql-provider'); return new MySqlProvider(commonProps); default: throw new Error('Cannot determine the provider to use. Please submit an Issue.'); } }; exports.getProvider = getProvider; const innerHandler = async ({ script, databaseName }) => { const sm = new AWS.SecretsManager({}); const { SECRET_ARN: powerUserSecretArn, } = process.env; console.log('Getting secret...'); const { SecretString: powerUserSecretString } = await sm.getSecretValue({ SecretId: powerUserSecretArn }).promise(); if (!powerUserSecretString) { throw new Error('Could not determine the username and password. Make sure the provided Secret has a value and is an object with {username, password}'); } const { username, password, host, port, engine, } = JSON.parse(powerUserSecretString); const provider = (0, exports.getProvider)({ host, port, engine, username, password, databaseName, }); return provider.query(script); }; exports.innerHandler = innerHandler; /** * Handler for Custom Resources * * @param event * @param context */ const handler = async (event, context) => { console.log('event: ', JSON.stringify(event, null, 2)); try { if (event.RequestType === 'Delete') { await response.send(event, context, 'SUCCESS', null, event.PhysicalResourceId); return; } const { script, databaseName, } = event.ResourceProperties; const results = await (0, exports.innerHandler)({ script, databaseName }); await response.send(event, context, response.SUCCESS, null, null); return results; } catch (error) { // ... error checks console.log(error); await response.send(event, context, response.FAILED, { err: error }); } }; exports.handler = handler; /** * Handler for direct execution * * @param event {script: string, databaseName: string} * @example {script: 'SELECT 1', databaseName: 'mydatabase'} */ const adhocHandler = async (event) => { console.log('event:', JSON.stringify(event, null, 2)); if (!event.script) { throw new Error('Please provide a script to run. e.g. `SELECT 1`'); } if (!event.databaseName) { throw new Error('Please provide a databaseName. e.g. `mydatabase`'); } const results = await (0, exports.innerHandler)(event); return results.rows; }; exports.adhocHandler = adhocHandler; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaGFuZGxlcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0EsaUVBQWlFO0FBQ2pFLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUMvQixpRUFBaUU7QUFDakUsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFFcEMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxLQU8zQixFQUFhLEVBQUU7SUFDZCxNQUFNLFdBQVcsR0FBRztRQUNsQixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7UUFDaEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1FBQ2hCLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtRQUN4QixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7UUFDeEIsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO0tBQ2pDLENBQUM7SUFFRixRQUFRLEtBQUssQ0FBQyxNQUFNLEVBQUU7UUFDcEIsS0FBSyxXQUFXLENBQUM7UUFDakIsS0FBSyxjQUFjLENBQUM7UUFDcEIsS0FBSyxjQUFjLENBQUM7UUFDcEIsS0FBSyxjQUFjLENBQUM7UUFDcEIsS0FBSyxlQUFlO1lBQ2xCLGlFQUFpRTtZQUNqRSxNQUFNLEVBQUUsYUFBYSxFQUFFLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDdEQsT0FBTyxJQUFJLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN4QyxLQUFLLFVBQVU7WUFDYixpRUFBaUU7WUFDakUsTUFBTSxFQUFFLG1CQUFtQixFQUFFLEdBQUcsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDL0QsT0FBTyxJQUFJLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlDLEtBQUssT0FBTztZQUNWLGlFQUFpRTtZQUNqRSxNQUFNLEVBQUUsYUFBYSxFQUFFLEdBQUcsT0FBTyxD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SUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7UUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO0tBQ3BFO0lBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUU7UUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO0tBQ3JFO0lBQ0QsTUFBTSxPQUFPLEdBQVEsTUFBTSxJQUFBLG9CQUFZLEVBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0MsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDO0FBQ3RCLENBQUMsQ0FBQztBQVZXLFFBQUEsWUFBWSxnQkFVdkIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuaW1wb3J0IHsgSVByb3ZpZGVyIH0gZnJvbSAnLi9wcm92aWRlcic7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG5jb25zdCBBV1MgPSByZXF1aXJlKCdhd3Mtc2RrJyk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuY29uc3QgcmVzcG9uc2UgPSByZXF1aXJlKCcuL2Nmbi1yZXNwb25zZScpO1xuXG5leHBvcnQgY29uc3QgZ2V0UHJvdmlkZXIgPSAocHJvcHM6IHtcbiAgdXNlcm5hbWU6IHN0cmluZztcbiAgcGFzc3dvcmQ6IHN0cmluZztcbiAgaG9zdDogc3RyaW5nO1xuICBkYXRhYmFzZU5hbWU/OiBzdHJpbmc7XG4gIGVuZ2luZTogc3RyaW5nO1xuICBwb3J0Pzogc3RyaW5nO1xufSk6IElQcm92aWRlciA9PiB7XG4gIGNvbnN0IGNvbW1vblByb3BzID0ge1xuICAgIGhvc3Q6IHByb3BzLmhvc3QsXG4gICAgcG9ydDogcHJvcHMucG9ydCxcbiAgICB1c2VybmFtZTogcHJvcHMudXNlcm5hbWUsXG4gICAgcGFzc3dvcmQ6IHByb3BzLnBhc3N3b3JkLFxuICAgIGRhdGFiYXNlTmFtZTogcHJvcHMuZGF0YWJhc2VOYW1lLFxuICB9O1xuXG4gIHN3aXRjaCAocHJvcHMuZW5naW5lKSB7XG4gICAgY2FzZSAnc3Fsc2VydmVyJzpcbiAgICBjYXNlICdzcWxzZXJ2ZXItc2UnOlxuICAgIGNhc2UgJ3NxbHNlcnZlci1leCc6XG4gICAgY2FzZSAnc3Fsc2VydmVyLWVlJzpcbiAgICBjYXNlICdzcWxzZXJ2ZXItd2ViJzpcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgICBjb25zdCB7IE1zU3FsUHJvdmlkZXIgfSA9IHJlcXVpcmUoJy4vbXNzcWwtcHJvdmlkZXInKTtcbiAgICAgIHJldHVybiBuZXcgTXNTcWxQcm92aWRlcihjb21tb25Qcm9wcyk7XG4gICAgY2FzZSAncG9zdGdyZXMnOlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICAgIGNvbnN0IHsgUG9zdGdyZXNTcWxQcm92aWRlciB9ID0gcmVxdWlyZSgnLi9wb3N0Z3Jlcy1wcm92aWRlcicpO1xuICAgICAgcmV0dXJuIG5ldyBQb3N0Z3Jlc1NxbFByb3ZpZGVyKGNvbW1vblByb3BzKTtcbiAgICBjYXNlICdteXNxbCc6XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgICAgY29uc3QgeyBNeVNxbFByb3ZpZGVyIH0gPSByZXF1aXJlKCcuL215c3FsLXByb3ZpZGVyJyk7XG4gICAgICByZXR1cm4gbmV3IE15U3FsUHJvdmlkZXIoY29tbW9uUHJvcHMpO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBkZXRlcm1pbmUgdGhlIHByb3ZpZGVyIHRvIHVzZS4gUGxlYXNlIHN1Ym1pdCBhbiBJc3N1ZS4nKTtcblxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgaW5uZXJIYW5kbGVyID0gYXN5bmMgKHsgc2NyaXB0LCBkYXRhYmFzZU5hbWUgfTogeyBzY3JpcHQ6IHN0cmluZzsgZGF0YWJhc2VOYW1lOiBzdHJpbmcgfSkgPT4ge1xuXG4gIGNvbnN0IHNtID0gbmV3IEFXUy5TZWNyZXRzTWFuYWdlcih7fSk7XG4gIGNvbnN0IHtcbiAgICBTRUNSRVRfQVJOOiBwb3dlclVzZXJTZWNyZXRBcm4sXG4gIH0gPSBwcm9jZXNzLmVudjtcblxuICBjb25zb2xlLmxvZygnR2V0dGluZyBzZWNyZXQuLi4nKTtcbiAgY29uc3QgeyBTZWNyZXRTdHJpbmc6IHBvd2VyVXNlclNlY3JldFN0cmluZyB9ID0gYXdhaXQgc20uZ2V0U2VjcmV0VmFsdWUoeyBTZWNyZXRJZDogcG93ZXJVc2VyU2VjcmV0QXJuIH0pLnByb21pc2UoKTtcblxuICBpZiAoIXBvd2VyVXNlclNlY3JldFN0cmluZykge1xuICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGRldGVybWluZSB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLiBNYWtlIHN1cmUgdGhlIHByb3ZpZGVkIFNlY3JldCBoYXMgYSB2YWx1ZSBhbmQgaXMgYW4gb2JqZWN0IHdpdGgge3VzZXJuYW1lLCBwYXNzd29yZH0nKTtcbiAgfVxuICBjb25zdCB7XG4gICAgdXNlcm5hbWUsXG4gICAgcGFzc3dvcmQsXG4gICAgaG9zdCxcbiAgICBwb3J0LFxuICAgIGVuZ2luZSxcbiAgfSA9IEpTT04ucGFyc2UocG93ZXJVc2VyU2VjcmV0U3RyaW5nKTtcblxuXG4gIGNvbnN0IHByb3ZpZGVyID0gZ2V0UHJvdmlkZXIoe1xuICAgIGhvc3QsXG4gICAgcG9ydCxcbiAgICBlbmdpbmUsXG4gICAgdXNlcm5hbWUsXG4gICAgcGFzc3dvcmQsXG4gICAgZGF0YWJhc2VOYW1lLFxuICB9KTtcbiAgcmV0dXJuIHByb3ZpZGVyLnF1ZXJ5KHNjcmlwdCk7XG5cbn07XG4vKipcbiAqIEhhbmRsZXIgZm9yIEN1c3RvbSBSZXNvdXJjZXNcbiAqXG4gKiBAcGFyYW0gZXZlbnRcbiAqIEBwYXJhbSBjb250ZXh0XG4gKi9cbmV4cG9ydCBjb25zdCBoYW5kbGVyID0gYXN5bmMgKGV2ZW50OiBhbnksIGNvbnRleHQ6IGFueSkgPT4ge1xuICBjb25zb2xlLmxvZygnZXZlbnQ6ICcsIEpTT04uc3RyaW5naWZ5KGV2ZW50LCBudWxsLCAyKSk7XG4gIHRyeSB7XG4gICAgaWYgKGV2ZW50LlJlcXVlc3RUeXBlID09PSAnRGVsZXRlJykge1xuICAgICAgYXdhaXQgcmVzcG9uc2Uuc2VuZChldmVudCwgY29udGV4dCwgJ1NVQ0NFU1MnLCBudWxsLCBldmVudC5QaHlzaWNhbFJlc291cmNlSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBzY3JpcHQsXG4gICAgICBkYXRhYmFzZU5hbWUsXG4gICAgfSA9IGV2ZW50LlJlc291cmNlUHJvcGVydGllcztcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgaW5uZXJIYW5kbGVyKHsgc2NyaXB0LCBkYXRhYmFzZU5hbWUgfSk7XG4gICAgYXdhaXQgcmVzcG9uc2Uuc2VuZChldmVudCwgY29udGV4dCwgcmVzcG9uc2UuU1VDQ0VTUywgbnVsbCwgbnVsbCk7XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gLi4uIGVycm9yIGNoZWNrc1xuICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICBhd2FpdCByZXNwb25zZS5zZW5kKGV2ZW50LCBjb250ZXh0LCByZXNwb25zZS5GQUlMRUQsIHsgZXJyOiBlcnJvciB9KTtcbiAgfVxufTtcblxuLyoqXG4gKiBIYW5kbGVyIGZvciBkaXJlY3QgZXhlY3V0aW9uXG4gKlxuICogQHBhcmFtIGV2ZW50IHtzY3JpcHQ6IHN0cmluZywgZGF0YWJhc2VOYW1lOiBzdHJpbmd9XG4gKiBAZXhhbXBsZSB7c2NyaXB0OiAnU0VMRUNUIDEnLCBkYXRhYmFzZU5hbWU6ICdteWRhdGFiYXNlJ31cbiAqL1xuZXhwb3J0IGNvbnN0IGFkaG9jSGFuZGxlciA9IGFzeW5jIChldmVudDogYW55KSA9PiB7XG4gIGNvbnNvbGUubG9nKCdldmVudDonLCBKU09OLnN0cmluZ2lmeShldmVudCwgbnVsbCwgMikpO1xuICBpZiAoIWV2ZW50LnNjcmlwdCkge1xuICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHByb3ZpZGUgYSBzY3JpcHQgdG8gcnVuLiBlLmcuIGBTRUxFQ1QgMWAnKTtcbiAgfVxuICBpZiAoIWV2ZW50LmRhdGFiYXNlTmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHByb3ZpZGUgYSBkYXRhYmFzZU5hbWUuIGUuZy4gYG15ZGF0YWJhc2VgJyk7XG4gIH1cbiAgY29uc3QgcmVzdWx0czogYW55ID0gYXdhaXQgaW5uZXJIYW5kbGVyKGV2ZW50KTtcbiAgcmV0dXJuIHJlc3VsdHMucm93cztcbn07XG4iXX0=