discord-bot-cdk-construct
Version:
A quick CDK Construct for creating a serverless Discord bot in AWS!
102 lines • 12.6 kB
JavaScript
"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==