@cdkx/aws-sns-subscriptions
Version:
AWS SNS extended subscriptions
88 lines • 11.8 kB
JavaScript
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