UNPKG

@cdkx/aws-sns-subscriptions

Version:

AWS SNS extended subscriptions

88 lines 11.8 kB
var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; (function (factory) { if (typeof module === "object" && typeof module.exports === "object") { var v = factory(require, exports); if (v !== undefined) module.exports = v; } else if (typeof define === "function" && define.amd) { define("@cdkx/aws-sns-subscriptions/subscriptions/slack-subscription", ["require", "exports", "@aws-cdk/aws-iam", "@aws-cdk/aws-lambda", "@aws-cdk/aws-lambda-nodejs", "@aws-cdk/aws-sns", "@aws-cdk/aws-ssm", "@aws-cdk/core", "change-case", "path", "fs"], factory); } })(function (require, exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SlackSubscription = void 0; const aws_iam_1 = require("@aws-cdk/aws-iam"); const aws_lambda_1 = require("@aws-cdk/aws-lambda"); const aws_lambda_nodejs_1 = require("@aws-cdk/aws-lambda-nodejs"); const aws_sns_1 = require("@aws-cdk/aws-sns"); const aws_ssm_1 = require("@aws-cdk/aws-ssm"); const core_1 = require("@aws-cdk/core"); const change_case_1 = require("change-case"); const path_1 = __importDefault(require("path")); const fs_1 = __importDefault(require("fs")); /** * @summary Configures required resources to enable sns -> slack notifications. * Supplied Auth token must have at least "chat:write:bot" scope. When channel id is not provided, * additional "channels:read", "groups:read", "im:read", "mpim:read" scopes are required. * @see https://api.slack.com/scopes * */ class SlackSubscription { constructor(props) { this.props = props; } bind(topic) { var _a; const scope = this._resolveScopeFromTopic(topic); const configParam = new aws_ssm_1.StringParameter(scope, change_case_1.pascalCase(`${this.props.channelName}-ConfigParameter`), { stringValue: JSON.stringify({ channelId: (_a = this.props.channelId) !== null && _a !== void 0 ? _a : '', channelName: this.props.channelName, channelType: 'public_channel', authToken: '', }), description: 'Slack configuration parameter', }); const slackHandler = new aws_lambda_nodejs_1.NodejsFunction(scope, 'Handler', { runtime: aws_lambda_1.Runtime.NODEJS_12_X, // slightly increase duration in case we need to \ // scan all slack channels to find the one we are looking for timeout: core_1.Duration.minutes(3), entry: this._getHandlerEntryPath(path_1.default.resolve(__dirname, '../handlers/_entries/slack-subscription-handler')), description: 'Slack subscription Handler', environment: { CONFIG_PARAM: configParam.parameterName, }, }); // allow topic to invoke slack handler slackHandler.addPermission(`AllowInvoke:${core_1.Names.nodeUniqueId(topic.node)}`, { sourceArn: topic.topicArn, principal: new aws_iam_1.ServicePrincipal('sns.amazonaws.com'), }); configParam.grantRead(slackHandler); configParam.grantWrite(slackHandler); return { subscriberScope: slackHandler, subscriberId: topic.node.id, endpoint: slackHandler.functionArn, protocol: aws_sns_1.SubscriptionProtocol.LAMBDA, filterPolicy: this.props.filterPolicy, }; } _resolveScopeFromTopic(topic) { return topic.node.scope; } _getHandlerEntryPath(basePath) { let handlerPath = basePath + '.ts'; // if no ts file return js ref if (!fs_1.default.existsSync(handlerPath)) { handlerPath = basePath + '.js'; } return handlerPath; } } exports.SlackSubscription = SlackSubscription; }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhY2stc3Vic2NyaXB0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYXdzLXNucy1zdWJzY3JpcHRpb25zL3N1YnNjcmlwdGlvbnMvc2xhY2stc3Vic2NyaXB0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztJQUFBLDhDQUFvRDtJQUNwRCxvREFBOEM7SUFDOUMsa0VBQTREO0lBQzVELDhDQU0wQjtJQUMxQiw4Q0FBbUQ7SUFDbkQsd0NBQTJEO0lBQzNELDZDQUF5QztJQUN6QyxnREFBd0I7SUFDeEIsNENBQW9CO0lBNEJwQjs7Ozs7O09BTUc7SUFDSCxNQUFhLGlCQUFpQjtRQUM1QixZQUFvQixLQUE4QjtZQUE5QixVQUFLLEdBQUwsS0FBSyxDQUF5QjtRQUFHLENBQUM7UUFFdEQsSUFBSSxDQUFDLEtBQWE7O1lBQ2hCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUVqRCxNQUFNLFdBQVcsR0FBRyxJQUFJLHlCQUFlLENBQ3JDLEtBQUssRUFDTCx3QkFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLGtCQUFrQixDQUFDLEVBQ3ZEO2dCQUNFLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUMxQixTQUFTLEVBQUUsTUFBQSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsbUNBQUksRUFBRTtvQkFDckMsV0FBVyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVztvQkFDbkMsV0FBVyxFQUFFLGdCQUFnQjtvQkFDN0IsU0FBUyxFQUFFLEVBQUU7aUJBQ08sQ0FBQztnQkFDdkIsV0FBVyxFQUFFLCtCQUErQjthQUM3QyxDQUNGLENBQUM7WUFFRixNQUFNLFlBQVksR0FBRyxJQUFJLGtDQUFjLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRTtnQkFDeEQsT0FBTyxFQUFFLG9CQUFPLENBQUMsV0FBVztnQkFDNUIsa0RBQWtEO2dCQUNsRCw2REFBNkQ7Z0JBQzdELE9BQU8sRUFBRSxlQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDNUIsS0FBSyxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FDOUIsY0FBSSxDQUFDLE9BQU8sQ0FDVixTQUFTLEVBQ1QsaURBQWlELENBQ2xELENBQ0Y7Z0JBQ0QsV0FBVyxFQUFFLDRCQUE0QjtnQkFDekMsV0FBVyxFQUFFO29CQUNYLFlBQVksRUFBRSxXQUFXLENBQUMsYUFBYTtpQkFDeEM7YUFDRixDQUFDLENBQUM7WUFFSCxzQ0FBc0M7WUFDdEMsWUFBWSxDQUFDLGFBQWEsQ0FDeEIsZUFBZSxZQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUMvQztnQkFDRSxTQUFTLEVBQUUsS0FBSyxDQUFDLFFBQVE7Z0JBQ3pCLFNBQVMsRUFBRSxJQUFJLDBCQUFnQixDQUFDLG1CQUFtQixDQUFDO2FBQ3JELENBQ0YsQ0FBQztZQUVGLFdBQVcsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDcEMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUVyQyxPQUFPO2dCQUNMLGVBQWUsRUFBRSxZQUFZO2dCQUM3QixZQUFZLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUMzQixRQUFRLEVBQUUsWUFBWSxDQUFDLFdBQVc7Z0JBQ2xDLFFBQVEsRUFBRSw4QkFBb0IsQ0FBQyxNQUFNO2dCQUNyQyxZQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZO2FBQ3RDLENBQUM7UUFDSixDQUFDO1FBRU8sc0JBQXNCLENBQUMsS0FBYTtZQUMxQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBa0IsQ0FBQztRQUN2QyxDQUFDO1FBRU8sb0JBQW9CLENBQUMsUUFBZ0I7WUFDM0MsSUFBSSxXQUFXLEdBQUcsUUFBUSxHQUFHLEtBQUssQ0FBQztZQUNuQyw4QkFBOEI7WUFDOUIsSUFBSSxDQUFDLFlBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUU7Z0JBQy9CLFdBQVcsR0FBRyxRQUFRLEdBQUcsS0FBSyxDQUFDO2FBQ2hDO1lBQ0QsT0FBTyxXQUFXLENBQUM7UUFDckIsQ0FBQztLQUNGO0lBdEVELDhDQXNFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlcnZpY2VQcmluY2lwYWwgfSBmcm9tICdAYXdzLWNkay9hd3MtaWFtJztcbmltcG9ydCB7IFJ1bnRpbWUgfSBmcm9tICdAYXdzLWNkay9hd3MtbGFtYmRhJztcbmltcG9ydCB7IE5vZGVqc0Z1bmN0aW9uIH0gZnJvbSAnQGF3cy1jZGsvYXdzLWxhbWJkYS1ub2RlanMnO1xuaW1wb3J0IHtcbiAgSVRvcGljLFxuICBJVG9waWNTdWJzY3JpcHRpb24sXG4gIFN1YnNjcmlwdGlvblByb3RvY29sLFxuICBUb3BpY1N1YnNjcmlwdGlvbkNvbmZpZyxcbiAgU3Vic2NyaXB0aW9uRmlsdGVyLFxufSBmcm9tICdAYXdzLWNkay9hd3Mtc25zJztcbmltcG9ydCB7IFN0cmluZ1BhcmFtZXRlciB9IGZyb20gJ0Bhd3MtY2RrL2F3cy1zc20nO1xuaW1wb3J0IHsgQ29uc3RydWN0LCBEdXJhdGlvbiwgTmFtZXMgfSBmcm9tICdAYXdzLWNkay9jb3JlJztcbmltcG9ydCB7IHBhc2NhbENhc2UgfSBmcm9tICdjaGFuZ2UtY2FzZSc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNsYWNrQ29uZmlnUGFyYW0ge1xuICAvKipcbiAgICogQGRlZmF1bHQgY2hhbm5lbCBJZCB3aWxsIGJlIHJlc29sdmVkIGZyb20gZ2l2ZW4gY2hhbm5lbCBuYW1lXG4gICAqL1xuICBjaGFubmVsSWQ/OiBzdHJpbmc7XG4gIGNoYW5uZWxOYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBAZGVmYXVsdCBwdWJsaWNfY2hhbm5lbFxuICAgKi9cbiAgY2hhbm5lbFR5cGVzPzogc3RyaW5nO1xuICBhdXRoVG9rZW46IHN0cmluZztcbn1cblxuLyoqXG4gKiBAcGFyYW0gY2hhbm5lbE5hbWUgQ2hhbm5lbCB0byBzZW5kIG5vdGlmaWNhdGlvbiB0b1xuICogQHBhcmFtIGZpbHRlclBvbGljeSBPcHRpb25hbCBmaWx0ZXIgcG9saWN5IHRvIGFwcGx5IG9uIHNucyB0YXJnZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU2xhY2tTdWJzY3JpcHRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBAZGVmYXVsdCAtIGNoYW5uZWwgSWQgd2lsbCBiZSByZXNvbHZlZCBmcm9tIGdpdmVuIGNoYW5uZWwgbmFtZVxuICAgKi9cbiAgY2hhbm5lbElkPzogc3RyaW5nO1xuICBjaGFubmVsTmFtZTogc3RyaW5nO1xuICBmaWx0ZXJQb2xpY3k/OiB7IFtrZXk6IHN0cmluZ106IFN1YnNjcmlwdGlvbkZpbHRlciB9O1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgcmVxdWlyZWQgcmVzb3VyY2VzIHRvIGVuYWJsZSBzbnMgLT4gc2xhY2sgbm90aWZpY2F0aW9ucy5cbiAqIFN1cHBsaWVkIEF1dGggdG9rZW4gbXVzdCBoYXZlIGF0IGxlYXN0IFwiY2hhdDp3cml0ZTpib3RcIiBzY29wZS4gV2hlbiBjaGFubmVsIGlkIGlzIG5vdCBwcm92aWRlZCxcbiAqIGFkZGl0aW9uYWwgXCJjaGFubmVsczpyZWFkXCIsIFwiZ3JvdXBzOnJlYWRcIiwgXCJpbTpyZWFkXCIsIFwibXBpbTpyZWFkXCIgc2NvcGVzIGFyZSByZXF1aXJlZC5cbiAqIEBzZWUgaHR0cHM6Ly9hcGkuc2xhY2suY29tL3Njb3Blc1xuICpcbiAqL1xuZXhwb3J0IGNsYXNzIFNsYWNrU3Vic2NyaXB0aW9uIGltcGxlbWVudHMgSVRvcGljU3Vic2NyaXB0aW9uIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBwcm9wczogSVNsYWNrU3Vic2NyaXB0aW9uUHJvcHMpIHt9XG5cbiAgYmluZCh0b3BpYzogSVRvcGljKTogVG9waWNTdWJzY3JpcHRpb25Db25maWcge1xuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5fcmVzb2x2ZVNjb3BlRnJvbVRvcGljKHRvcGljKTtcblxuICAgIGNvbnN0IGNvbmZpZ1BhcmFtID0gbmV3IFN0cmluZ1BhcmFtZXRlcihcbiAgICAgIHNjb3BlLFxuICAgICAgcGFzY2FsQ2FzZShgJHt0aGlzLnByb3BzLmNoYW5uZWxOYW1lfS1Db25maWdQYXJhbWV0ZXJgKSxcbiAgICAgIHtcbiAgICAgICAgc3RyaW5nVmFsdWU6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBjaGFubmVsSWQ6IHRoaXMucHJvcHMuY2hhbm5lbElkID8/ICcnLFxuICAgICAgICAgIGNoYW5uZWxOYW1lOiB0aGlzLnByb3BzLmNoYW5uZWxOYW1lLFxuICAgICAgICAgIGNoYW5uZWxUeXBlOiAncHVibGljX2NoYW5uZWwnLFxuICAgICAgICAgIGF1dGhUb2tlbjogJycsXG4gICAgICAgIH0gYXMgSVNsYWNrQ29uZmlnUGFyYW0pLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1NsYWNrIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyJyxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uc3Qgc2xhY2tIYW5kbGVyID0gbmV3IE5vZGVqc0Z1bmN0aW9uKHNjb3BlLCAnSGFuZGxlcicsIHtcbiAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzEyX1gsXG4gICAgICAvLyBzbGlnaHRseSBpbmNyZWFzZSBkdXJhdGlvbiBpbiBjYXNlIHdlIG5lZWQgdG8gXFxcbiAgICAgIC8vIHNjYW4gYWxsIHNsYWNrIGNoYW5uZWxzIHRvIGZpbmQgdGhlIG9uZSB3ZSBhcmUgbG9va2luZyBmb3JcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoMyksXG4gICAgICBlbnRyeTogdGhpcy5fZ2V0SGFuZGxlckVudHJ5UGF0aChcbiAgICAgICAgcGF0aC5yZXNvbHZlKFxuICAgICAgICAgIF9fZGlybmFtZSxcbiAgICAgICAgICAnLi4vaGFuZGxlcnMvX2VudHJpZXMvc2xhY2stc3Vic2NyaXB0aW9uLWhhbmRsZXInXG4gICAgICAgIClcbiAgICAgICksXG4gICAgICBkZXNjcmlwdGlvbjogJ1NsYWNrIHN1YnNjcmlwdGlvbiBIYW5kbGVyJyxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIENPTkZJR19QQVJBTTogY29uZmlnUGFyYW0ucGFyYW1ldGVyTmFtZSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBhbGxvdyB0b3BpYyB0byBpbnZva2Ugc2xhY2sgaGFuZGxlclxuICAgIHNsYWNrSGFuZGxlci5hZGRQZXJtaXNzaW9uKFxuICAgICAgYEFsbG93SW52b2tlOiR7TmFtZXMubm9kZVVuaXF1ZUlkKHRvcGljLm5vZGUpfWAsXG4gICAgICB7XG4gICAgICAgIHNvdXJjZUFybjogdG9waWMudG9waWNBcm4sXG4gICAgICAgIHByaW5jaXBhbDogbmV3IFNlcnZpY2VQcmluY2lwYWwoJ3Nucy5hbWF6b25hd3MuY29tJyksXG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbmZpZ1BhcmFtLmdyYW50UmVhZChzbGFja0hhbmRsZXIpO1xuICAgIGNvbmZpZ1BhcmFtLmdyYW50V3JpdGUoc2xhY2tIYW5kbGVyKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWJzY3JpYmVyU2NvcGU6IHNsYWNrSGFuZGxlcixcbiAgICAgIHN1YnNjcmliZXJJZDogdG9waWMubm9kZS5pZCxcbiAgICAgIGVuZHBvaW50OiBzbGFja0hhbmRsZXIuZnVuY3Rpb25Bcm4sXG4gICAgICBwcm90b2NvbDogU3Vic2NyaXB0aW9uUHJvdG9jb2wuTEFNQkRBLFxuICAgICAgZmlsdGVyUG9saWN5OiB0aGlzLnByb3BzLmZpbHRlclBvbGljeSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVzb2x2ZVNjb3BlRnJvbVRvcGljKHRvcGljOiBJVG9waWMpOiBDb25zdHJ1Y3Qge1xuICAgIHJldHVybiB0b3BpYy5ub2RlLnNjb3BlIGFzIENvbnN0cnVjdDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldEhhbmRsZXJFbnRyeVBhdGgoYmFzZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGhhbmRsZXJQYXRoID0gYmFzZVBhdGggKyAnLnRzJztcbiAgICAvLyBpZiBubyB0cyBmaWxlIHJldHVybiBqcyByZWZcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoaGFuZGxlclBhdGgpKSB7XG4gICAgICBoYW5kbGVyUGF0aCA9IGJhc2VQYXRoICsgJy5qcyc7XG4gICAgfVxuICAgIHJldHVybiBoYW5kbGVyUGF0aDtcbiAgfVxufVxuIl19