UNPKG

discord-bot-cdk-construct

Version:

A quick CDK Construct for creating a serverless Discord bot in AWS!

102 lines 12.6 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.DiscordBotConstruct = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_cdk_lib_1 = require("aws-cdk-lib"); const aws_lambda_1 = require("aws-cdk-lib/aws-lambda"); const aws_apigateway_1 = require("aws-cdk-lib/aws-apigateway"); const aws_lambda_nodejs_1 = require("aws-cdk-lib/aws-lambda-nodejs"); const aws_secretsmanager_1 = require("aws-cdk-lib/aws-secretsmanager"); const constructs_1 = require("constructs"); const path = require("path"); /** * A CDK Construct for setting up a serverless Discord bot. */ class DiscordBotConstruct extends constructs_1.Construct { /** * The constructor for building the stack. * @param {Construct} scope The Construct scope to create the Construct in. * @param {string} id The ID of the Construct to use. * @param {IDiscordBotConstructProps} props The properties to configure the Construct. */ constructor(scope, id, props) { super(scope, id); // Create our Secrets for our Discord APIs. this.discordAPISecrets = new aws_secretsmanager_1.Secret(this, 'discord-bot-api-key'); // Create the Lambda for handling Interactions from our Discord bot. const discordBotLambda = new aws_lambda_nodejs_1.NodejsFunction(this, 'discord-bot-lambda', { runtime: aws_lambda_1.Runtime.NODEJS_18_X, entry: path.join(__dirname, '../functions/DiscordBotFunction.js'), handler: 'handler', environment: { DISCORD_BOT_API_KEY_NAME: this.discordAPISecrets.secretName, COMMAND_LAMBDA_ARN: props.commandsLambdaFunction.functionArn, }, timeout: aws_cdk_lib_1.Duration.seconds(3), }); props.commandsLambdaFunction.addEnvironment('DISCORD_BOT_API_KEY_NAME', this.discordAPISecrets.secretName); this.discordAPISecrets.grantRead(discordBotLambda); this.discordAPISecrets.grantRead(props.commandsLambdaFunction); props.commandsLambdaFunction.grantInvoke(discordBotLambda); // Create our API Gateway const discordBotAPI = new aws_apigateway_1.RestApi(this, 'discord-bot-api', { defaultCorsPreflightOptions: { allowOrigins: aws_apigateway_1.Cors.ALL_ORIGINS, }, }); const discordBotAPIValidator = new aws_apigateway_1.RequestValidator(this, 'discord-bot-api-validator', { restApi: discordBotAPI, validateRequestBody: true, validateRequestParameters: true, }); // User authentication endpoint configuration const discordBotEventItems = discordBotAPI.root.addResource('event', { defaultCorsPreflightOptions: { allowOrigins: [ '*', ], }, }); // Transform our requests and responses as appropriate. const discordBotIntegration = new aws_apigateway_1.LambdaIntegration(discordBotLambda, { proxy: false, requestTemplates: { 'application/json': '{\r\n\ "timestamp": "$input.params(\'x-signature-timestamp\')",\r\n\ "signature": "$input.params(\'x-signature-ed25519\')",\r\n\ "jsonBody" : $input.json(\'$\')\r\n\ }', }, integrationResponses: [ { statusCode: '200', }, { statusCode: '401', selectionPattern: '.*[UNAUTHORIZED].*', responseTemplates: { 'application/json': 'invalid request signature', }, }, ], }); // Add a POST method for the Discord APIs. discordBotEventItems.addMethod('POST', discordBotIntegration, { apiKeyRequired: false, requestValidator: discordBotAPIValidator, methodResponses: [ { statusCode: '200', }, { statusCode: '401', }, ], }); } } exports.DiscordBotConstruct = DiscordBotConstruct; _a = JSII_RTTI_SYMBOL_1; DiscordBotConstruct[_a] = { fqn: "discord-bot-cdk-construct.DiscordBotConstruct", version: "0.3.5" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGlzY29yZEJvdENvbnN0cnVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25zdHJ1Y3RzL0Rpc2NvcmRCb3RDb25zdHJ1Y3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBcUM7QUFDckMsdURBQXlEO0FBQ3pELCtEQUE4RjtBQUM5RixxRUFBNkQ7QUFDN0QsdUVBQXNEO0FBQ3RELDJDQUFxQztBQUNyQyw2QkFBNkI7QUFVN0I7O0dBRUc7QUFDSCxNQUFhLG1CQUFvQixTQUFRLHNCQUFTO0lBTWhEOzs7OztPQUtHO0lBQ0gsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFnQztRQUN4RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLDJDQUEyQztRQUMzQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSwyQkFBTSxDQUFDLElBQUksRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBRWpFLG9FQUFvRTtRQUNwRSxNQUFNLGdCQUFnQixHQUFHLElBQUksa0NBQWMsQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLEVBQUU7WUFDdEUsT0FBTyxFQUFFLG9CQUFPLENBQUMsV0FBVztZQUM1QixLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsb0NBQW9DLENBQUM7WUFDakUsT0FBTyxFQUFFLFNBQVM7WUFDbEIsV0FBVyxFQUFFO2dCQUNYLHdCQUF3QixFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVO2dCQUMzRCxrQkFBa0IsRUFBRSxLQUFLLENBQUMsc0JBQXNCLENBQUMsV0FBVzthQUM3RDtZQUNELE9BQU8sRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDN0IsQ0FBQyxDQUFDO1FBQ0gsS0FBSyxDQUFDLHNCQUFzQixDQUFDLGNBQWMsQ0FDdkMsMEJBQTBCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRW5FLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQy9ELEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUUzRCx5QkFBeUI7UUFDekIsTUFBTSxhQUFhLEdBQUcsSUFBSSx3QkFBTyxDQUFDLElBQUksRUFBRSxpQkFBaUIsRUFBRTtZQUN6RCwyQkFBMkIsRUFBRTtnQkFDM0IsWUFBWSxFQUFFLHFCQUFJLENBQUMsV0FBVzthQUMvQjtTQUNGLENBQUMsQ0FBQztRQUNILE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxpQ0FBZ0IsQ0FBQyxJQUFJLEVBQUUsMkJBQTJCLEVBQUU7WUFDckYsT0FBTyxFQUFFLGFBQWE7WUFDdEIsbUJBQW1CLEVBQUUsSUFBSTtZQUN6Qix5QkFBeUIsRUFBRSxJQUFJO1NBQ2hDLENBQUMsQ0FBQztRQUVILDZDQUE2QztRQUM3QyxNQUFNLG9CQUFvQixHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRTtZQUNuRSwyQkFBMkIsRUFBRTtnQkFDM0IsWUFBWSxFQUFFO29CQUNaLEdBQUc7aUJBQ0o7YUFDRjtTQUNGLENBQUMsQ0FBQztRQUVILHVEQUF1RDtRQUN2RCxNQUFNLHFCQUFxQixHQUFzQixJQUFJLGtDQUFpQixDQUFDLGdCQUFnQixFQUFFO1lBQ3ZGLEtBQUssRUFBRSxLQUFLO1lBQ1osZ0JBQWdCLEVBQUU7Z0JBQ2hCLGtCQUFrQixFQUFFOzs7O2NBSWQ7YUFDUDtZQUNELG9CQUFvQixFQUFFO2dCQUNwQjtvQkFDRSxVQUFVLEVBQUUsS0FBSztpQkFDbEI7Z0JBQ0Q7b0JBQ0UsVUFBVSxFQUFFLEtBQUs7b0JBQ2pCLGdCQUFnQixFQUFFLG9CQUFvQjtvQkFDdEMsaUJBQWlCLEVBQUU7d0JBQ2pCLGtCQUFrQixFQUFFLDJCQUEyQjtxQkFDaEQ7aUJBQ0Y7YUFDRjtTQUNGLENBQUMsQ0FBQztRQUVILDBDQUEwQztRQUMxQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLHFCQUFxQixFQUFFO1lBQzVELGNBQWMsRUFBRSxLQUFLO1lBQ3JCLGdCQUFnQixFQUFFLHNCQUFzQjtZQUN4QyxlQUFlLEVBQUU7Z0JBQ2Y7b0JBQ0UsVUFBVSxFQUFFLEtBQUs7aUJBQ2xCO2dCQUNEO29CQUNFLFVBQVUsRUFBRSxLQUFLO2lCQUNsQjthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUE5Rkgsa0RBK0ZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEdXJhdGlvbn0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHtGdW5jdGlvbiwgUnVudGltZX0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQge0NvcnMsIExhbWJkYUludGVncmF0aW9uLCBSZXF1ZXN0VmFsaWRhdG9yLCBSZXN0QXBpfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheSc7XG5pbXBvcnQge05vZGVqc0Z1bmN0aW9ufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLW5vZGVqcyc7XG5pbXBvcnQge1NlY3JldH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyJztcbmltcG9ydCB7Q29uc3RydWN0fSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbi8qKlxuICogVGhlIHByb3BlcnRpZXMgcmVxdWlyZWQgZm9yIHRoZSBEaXNjb3JkIEJvdCBjb25zdHJ1Y3QuIFNwZWNpZmljYWxseVxuICogcmVxdWlyZXMgdGhlIExhbWJkYSBmdW5jdGlvbiB3aGVyZSBjb21tYW5kcyB3aWxsIGJlIHNlbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURpc2NvcmRCb3RDb25zdHJ1Y3RQcm9wcyB7XG4gIGNvbW1hbmRzTGFtYmRhRnVuY3Rpb246IEZ1bmN0aW9uO1xufVxuXG4vKipcbiAqIEEgQ0RLIENvbnN0cnVjdCBmb3Igc2V0dGluZyB1cCBhIHNlcnZlcmxlc3MgRGlzY29yZCBib3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBEaXNjb3JkQm90Q29uc3RydWN0IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFRoZSBTZWNyZXRzIGZvciBvdXIgRGlzY29yZCBBUElzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRpc2NvcmRBUElTZWNyZXRzOiBTZWNyZXQ7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25zdHJ1Y3RvciBmb3IgYnVpbGRpbmcgdGhlIHN0YWNrLlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdH0gc2NvcGUgVGhlIENvbnN0cnVjdCBzY29wZSB0byBjcmVhdGUgdGhlIENvbnN0cnVjdCBpbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgQ29uc3RydWN0IHRvIHVzZS5cbiAgICogQHBhcmFtIHtJRGlzY29yZEJvdENvbnN0cnVjdFByb3BzfSBwcm9wcyBUaGUgcHJvcGVydGllcyB0byBjb25maWd1cmUgdGhlIENvbnN0cnVjdC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJRGlzY29yZEJvdENvbnN0cnVjdFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIC8vIENyZWF0ZSBvdXIgU2VjcmV0cyBmb3Igb3VyIERpc2NvcmQgQVBJcy5cbiAgICB0aGlzLmRpc2NvcmRBUElTZWNyZXRzID0gbmV3IFNlY3JldCh0aGlzLCAnZGlzY29yZC1ib3QtYXBpLWtleScpO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBMYW1iZGEgZm9yIGhhbmRsaW5nIEludGVyYWN0aW9ucyBmcm9tIG91ciBEaXNjb3JkIGJvdC5cbiAgICBjb25zdCBkaXNjb3JkQm90TGFtYmRhID0gbmV3IE5vZGVqc0Z1bmN0aW9uKHRoaXMsICdkaXNjb3JkLWJvdC1sYW1iZGEnLCB7XG4gICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18xOF9YLFxuICAgICAgZW50cnk6IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi9mdW5jdGlvbnMvRGlzY29yZEJvdEZ1bmN0aW9uLmpzJyksXG4gICAgICBoYW5kbGVyOiAnaGFuZGxlcicsXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBESVNDT1JEX0JPVF9BUElfS0VZX05BTUU6IHRoaXMuZGlzY29yZEFQSVNlY3JldHMuc2VjcmV0TmFtZSxcbiAgICAgICAgQ09NTUFORF9MQU1CREFfQVJOOiBwcm9wcy5jb21tYW5kc0xhbWJkYUZ1bmN0aW9uLmZ1bmN0aW9uQXJuLFxuICAgICAgfSxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMyksXG4gICAgfSk7XG4gICAgcHJvcHMuY29tbWFuZHNMYW1iZGFGdW5jdGlvbi5hZGRFbnZpcm9ubWVudChcbiAgICAgICAgJ0RJU0NPUkRfQk9UX0FQSV9LRVlfTkFNRScsIHRoaXMuZGlzY29yZEFQSVNlY3JldHMuc2VjcmV0TmFtZSk7XG5cbiAgICB0aGlzLmRpc2NvcmRBUElTZWNyZXRzLmdyYW50UmVhZChkaXNjb3JkQm90TGFtYmRhKTtcbiAgICB0aGlzLmRpc2NvcmRBUElTZWNyZXRzLmdyYW50UmVhZChwcm9wcy5jb21tYW5kc0xhbWJkYUZ1bmN0aW9uKTtcbiAgICBwcm9wcy5jb21tYW5kc0xhbWJkYUZ1bmN0aW9uLmdyYW50SW52b2tlKGRpc2NvcmRCb3RMYW1iZGEpO1xuXG4gICAgLy8gQ3JlYXRlIG91ciBBUEkgR2F0ZXdheVxuICAgIGNvbnN0IGRpc2NvcmRCb3RBUEkgPSBuZXcgUmVzdEFwaSh0aGlzLCAnZGlzY29yZC1ib3QtYXBpJywge1xuICAgICAgZGVmYXVsdENvcnNQcmVmbGlnaHRPcHRpb25zOiB7XG4gICAgICAgIGFsbG93T3JpZ2luczogQ29ycy5BTExfT1JJR0lOUyxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgY29uc3QgZGlzY29yZEJvdEFQSVZhbGlkYXRvciA9IG5ldyBSZXF1ZXN0VmFsaWRhdG9yKHRoaXMsICdkaXNjb3JkLWJvdC1hcGktdmFsaWRhdG9yJywge1xuICAgICAgcmVzdEFwaTogZGlzY29yZEJvdEFQSSxcbiAgICAgIHZhbGlkYXRlUmVxdWVzdEJvZHk6IHRydWUsXG4gICAgICB2YWxpZGF0ZVJlcXVlc3RQYXJhbWV0ZXJzOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gVXNlciBhdXRoZW50aWNhdGlvbiBlbmRwb2ludCBjb25maWd1cmF0aW9uXG4gICAgY29uc3QgZGlzY29yZEJvdEV2ZW50SXRlbXMgPSBkaXNjb3JkQm90QVBJLnJvb3QuYWRkUmVzb3VyY2UoJ2V2ZW50Jywge1xuICAgICAgZGVmYXVsdENvcnNQcmVmbGlnaHRPcHRpb25zOiB7XG4gICAgICAgIGFsbG93T3JpZ2luczogW1xuICAgICAgICAgICcqJyxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBUcmFuc2Zvcm0gb3VyIHJlcXVlc3RzIGFuZCByZXNwb25zZXMgYXMgYXBwcm9wcmlhdGUuXG4gICAgY29uc3QgZGlzY29yZEJvdEludGVncmF0aW9uOiBMYW1iZGFJbnRlZ3JhdGlvbiA9IG5ldyBMYW1iZGFJbnRlZ3JhdGlvbihkaXNjb3JkQm90TGFtYmRhLCB7XG4gICAgICBwcm94eTogZmFsc2UsXG4gICAgICByZXF1ZXN0VGVtcGxhdGVzOiB7XG4gICAgICAgICdhcHBsaWNhdGlvbi9qc29uJzogJ3tcXHJcXG5cXFxuICAgICAgICAgICAgICBcInRpbWVzdGFtcFwiOiBcIiRpbnB1dC5wYXJhbXMoXFwneC1zaWduYXR1cmUtdGltZXN0YW1wXFwnKVwiLFxcclxcblxcXG4gICAgICAgICAgICAgIFwic2lnbmF0dXJlXCI6IFwiJGlucHV0LnBhcmFtcyhcXCd4LXNpZ25hdHVyZS1lZDI1NTE5XFwnKVwiLFxcclxcblxcXG4gICAgICAgICAgICAgIFwianNvbkJvZHlcIiA6ICRpbnB1dC5qc29uKFxcJyRcXCcpXFxyXFxuXFxcbiAgICAgICAgICAgIH0nLFxuICAgICAgfSxcbiAgICAgIGludGVncmF0aW9uUmVzcG9uc2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBzdGF0dXNDb2RlOiAnMjAwJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHN0YXR1c0NvZGU6ICc0MDEnLFxuICAgICAgICAgIHNlbGVjdGlvblBhdHRlcm46ICcuKltVTkFVVEhPUklaRURdLionLFxuICAgICAgICAgIHJlc3BvbnNlVGVtcGxhdGVzOiB7XG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbic6ICdpbnZhbGlkIHJlcXVlc3Qgc2lnbmF0dXJlJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIC8vIEFkZCBhIFBPU1QgbWV0aG9kIGZvciB0aGUgRGlzY29yZCBBUElzLlxuICAgIGRpc2NvcmRCb3RFdmVudEl0ZW1zLmFkZE1ldGhvZCgnUE9TVCcsIGRpc2NvcmRCb3RJbnRlZ3JhdGlvbiwge1xuICAgICAgYXBpS2V5UmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgcmVxdWVzdFZhbGlkYXRvcjogZGlzY29yZEJvdEFQSVZhbGlkYXRvcixcbiAgICAgIG1ldGhvZFJlc3BvbnNlczogW1xuICAgICAgICB7XG4gICAgICAgICAgc3RhdHVzQ29kZTogJzIwMCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzdGF0dXNDb2RlOiAnNDAxJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==