@aws-community/ephemeral
Version:
Ephemeral Stacks! A CDK Stack and Construct that will self-destruct after a specified time period.
89 lines • 11.8 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DestroyerStack = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_cdk_lib_1 = require("aws-cdk-lib");
const aws_dynamodb_1 = require("aws-cdk-lib/aws-dynamodb");
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
const aws_lambda_event_sources_1 = require("aws-cdk-lib/aws-lambda-event-sources");
const aws_lambda_nodejs_1 = require("aws-cdk-lib/aws-lambda-nodejs");
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
const aws_events_1 = require("aws-cdk-lib/aws-events");
const aws_events_targets_1 = require("aws-cdk-lib/aws-events-targets");
const aws_sns_1 = require("aws-cdk-lib/aws-sns");
const fs_1 = require("fs");
const path_1 = require("path");
class DestroyerStack extends aws_cdk_lib_1.Stack {
constructor(scope, id, props) {
super(scope, id, props);
const tableName = 'destroyer';
const table = new aws_dynamodb_1.Table(this, tableName, {
tableName,
partitionKey: {
name: 'pk',
type: aws_dynamodb_1.AttributeType.STRING,
},
billingMode: aws_dynamodb_1.BillingMode.PAY_PER_REQUEST,
removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY,
timeToLiveAttribute: 'ttl',
stream: aws_dynamodb_1.StreamViewType.NEW_AND_OLD_IMAGES,
});
const local = (0, fs_1.existsSync)((0, path_1.join)(__dirname, 'destroyer-stack.fn-cloudformation.ts'));
const cloudformationFn = new aws_lambda_nodejs_1.NodejsFunction(this, 'fn-cloudformation', {
runtime: aws_lambda_1.Runtime.NODEJS_18_X,
memorySize: 1024,
timeout: aws_cdk_lib_1.Duration.minutes(5),
entry: (0, path_1.join)(__dirname, local ? 'destroyer-stack.fn-cloudformation.ts' : 'destroyer-stack.fn-cloudformation.js'),
initialPolicy: [
new aws_iam_1.PolicyStatement({
effect: aws_iam_1.Effect.ALLOW,
actions: [
'cloudformation:Describe*',
'cloudformation:Get*',
'cloudformation:List*',
],
resources: ['*'],
}),
],
});
table.grantReadWriteData(cloudformationFn);
cloudformationFn.addEnvironment('DESTROY_TABLE_NAME', table.tableName);
new aws_events_1.Rule(this, 'cloudformation-rule', {
eventPattern: {
source: ['aws.cloudformation'],
detailType: ['CloudFormation Stack Status Change'],
},
targets: [new aws_events_targets_1.LambdaFunction(cloudformationFn)],
});
const destroyFn = new aws_lambda_nodejs_1.NodejsFunction(this, 'fn-destroyer', {
runtime: aws_lambda_1.Runtime.NODEJS_18_X,
memorySize: 1024,
timeout: aws_cdk_lib_1.Duration.minutes(5),
entry: (0, path_1.join)(__dirname, local ? 'destroyer-stack.fn-destroyer.ts' : 'destroyer-stack.fn-destroyer.js'),
});
destroyFn.addEventSource(new aws_lambda_event_sources_1.DynamoEventSource(table, {
startingPosition: aws_lambda_1.StartingPosition.LATEST,
}));
destroyFn.addToRolePolicy(new aws_iam_1.PolicyStatement({
actions: ['cloudformation:DeleteStack'],
resources: ['*'],
effect: aws_iam_1.Effect.ALLOW,
}));
const failTopic = new aws_sns_1.Topic(this, 'fail-topic');
new aws_events_1.Rule(this, 'delete-failed-rule', {
eventPattern: {
source: ['aws.cloudformation'],
detailType: ['CloudFormation Stack Status Change'],
detail: {
resourceStatus: ['DELETE_FAILED'],
},
},
targets: [new aws_events_targets_1.SnsTopic(failTopic)],
});
}
}
_a = JSII_RTTI_SYMBOL_1;
DestroyerStack[_a] = { fqn: "@aws-community/ephemeral.DestroyerStack", version: "2.1.0" };
exports.DestroyerStack = DestroyerStack;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzdHJveWVyLXN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Rlc3Ryb3llci1zdGFjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUF5RTtBQUN6RSwyREFHMEM7QUFFMUMsdURBQW1FO0FBQ25FLG1GQUF5RTtBQUN6RSxxRUFBK0Q7QUFDL0QsaURBQThEO0FBQzlELHVEQUE4QztBQUM5Qyx1RUFBMEU7QUFDMUUsaURBQTRDO0FBQzVDLDJCQUFnQztBQUNoQywrQkFBNEI7QUFFNUIsTUFBYSxjQUFlLFNBQVEsbUJBQUs7SUFDdkMsWUFBYSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFrQjtRQUMzRCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV4QixNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUM7UUFDOUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxvQkFBSyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUU7WUFDdkMsU0FBUztZQUNULFlBQVksRUFBRTtnQkFDWixJQUFJLEVBQUUsSUFBSTtnQkFDVixJQUFJLEVBQUUsNEJBQWEsQ0FBQyxNQUFNO2FBQzNCO1lBQ0QsV0FBVyxFQUFFLDBCQUFXLENBQUMsZUFBZTtZQUN4QyxhQUFhLEVBQUUsMkJBQWEsQ0FBQyxPQUFPO1lBQ3BDLG1CQUFtQixFQUFFLEtBQUs7WUFDMUIsTUFBTSxFQUFFLDZCQUFjLENBQUMsa0JBQWtCO1NBQzFDLENBQUMsQ0FBQztRQUVILE1BQU0sS0FBSyxHQUFHLElBQUEsZUFBVSxFQUFDLElBQUEsV0FBSSxFQUFDLFNBQVMsRUFBRSxzQ0FBc0MsQ0FBQyxDQUFDLENBQUM7UUFDbEYsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLGtDQUFjLENBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFO1lBQ3JFLE9BQU8sRUFBRSxvQkFBTyxDQUFDLFdBQVc7WUFDNUIsVUFBVSxFQUFFLElBQUk7WUFDaEIsT0FBTyxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUM1QixLQUFLLEVBQUUsSUFBQSxXQUFJLEVBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsc0NBQXNDLENBQUMsQ0FBQyxDQUFDLHNDQUFzQyxDQUFDO1lBQy9HLGFBQWEsRUFBRTtnQkFDYixJQUFJLHlCQUFlLENBQUM7b0JBQ2xCLE1BQU0sRUFBRSxnQkFBTSxDQUFDLEtBQUs7b0JBQ3BCLE9BQU8sRUFBRTt3QkFDUCwwQkFBMEI7d0JBQzFCLHFCQUFxQjt3QkFDckIsc0JBQXNCO3FCQUN2QjtvQkFDRCxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUM7aUJBQ2pCLENBQUM7YUFDSDtTQUNGLENBQUMsQ0FBQztRQUNILEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzNDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdkUsSUFBSSxpQkFBSSxDQUFDLElBQUksRUFBRSxxQkFBcUIsRUFBRTtZQUNwQyxZQUFZLEVBQUU7Z0JBQ1osTUFBTSxFQUFFLENBQUMsb0JBQW9CLENBQUM7Z0JBQzlCLFVBQVUsRUFBRSxDQUFDLG9DQUFvQyxDQUFDO2FBQ25EO1lBQ0QsT0FBTyxFQUFFLENBQUMsSUFBSSxtQ0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUM7U0FDaEQsQ0FBQyxDQUFDO1FBRUgsTUFBTSxTQUFTLEdBQUcsSUFBSSxrQ0FBYyxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUU7WUFDekQsT0FBTyxFQUFFLG9CQUFPLENBQUMsV0FBVztZQUM1QixVQUFVLEVBQUUsSUFBSTtZQUNoQixPQUFPLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQzVCLEtBQUssRUFBRSxJQUFBLFdBQUksRUFBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDLENBQUMsaUNBQWlDLENBQUM7U0FDdEcsQ0FBQyxDQUFDO1FBRUgsU0FBUyxDQUFDLGNBQWMsQ0FDdEIsSUFBSSw0Q0FBaUIsQ0FBQyxLQUFLLEVBQUU7WUFDM0IsZ0JBQWdCLEVBQUUsNkJBQWdCLENBQUMsTUFBTTtTQUMxQyxDQUFDLENBQ0gsQ0FBQztRQUNGLFNBQVMsQ0FBQyxlQUFlLENBQ3ZCLElBQUkseUJBQWUsQ0FBQztZQUNsQixPQUFPLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQztZQUN2QyxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUM7WUFDaEIsTUFBTSxFQUFFLGdCQUFNLENBQUMsS0FBSztTQUNyQixDQUFDLENBQ0gsQ0FBQztRQUVGLE1BQU0sU0FBUyxHQUFHLElBQUksZUFBSyxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNoRCxJQUFJLGlCQUFJLENBQUMsSUFBSSxFQUFFLG9CQUFvQixFQUFFO1lBQ25DLFlBQVksRUFBRTtnQkFDWixNQUFNLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQztnQkFDOUIsVUFBVSxFQUFFLENBQUMsb0NBQW9DLENBQUM7Z0JBQ2xELE1BQU0sRUFBRTtvQkFDTixjQUFjLEVBQUUsQ0FBQyxlQUFlLENBQUM7aUJBQ2xDO2FBQ0Y7WUFDRCxPQUFPLEVBQUUsQ0FBQyxJQUFJLDZCQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDbkMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7OztBQTVFVSx3Q0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IER1cmF0aW9uLCBSZW1vdmFsUG9saWN5LCBTdGFjaywgU3RhY2tQcm9wcyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IEF0dHJpYnV0ZVR5cGUsXG4gIEJpbGxpbmdNb2RlLFxuICBTdHJlYW1WaWV3VHlwZSxcbiAgVGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGInO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBSdW50aW1lLCBTdGFydGluZ1Bvc2l0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBEeW5hbW9FdmVudFNvdXJjZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEtZXZlbnQtc291cmNlcyc7XG5pbXBvcnQgeyBOb2RlanNGdW5jdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEtbm9kZWpzJztcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCwgRWZmZWN0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBSdWxlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cyc7XG5pbXBvcnQgeyBMYW1iZGFGdW5jdGlvbiwgU25zVG9waWMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZXZlbnRzLXRhcmdldHMnO1xuaW1wb3J0IHsgVG9waWMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc25zJztcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAncGF0aCc7XG5cbmV4cG9ydCBjbGFzcyBEZXN0cm95ZXJTdGFjayBleHRlbmRzIFN0YWNrIHtcbiAgY29uc3RydWN0b3IgKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogU3RhY2tQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgY29uc3QgdGFibGVOYW1lID0gJ2Rlc3Ryb3llcic7XG4gICAgY29uc3QgdGFibGUgPSBuZXcgVGFibGUodGhpcywgdGFibGVOYW1lLCB7XG4gICAgICB0YWJsZU5hbWUsXG4gICAgICBwYXJ0aXRpb25LZXk6IHtcbiAgICAgICAgbmFtZTogJ3BrJyxcbiAgICAgICAgdHlwZTogQXR0cmlidXRlVHlwZS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAgYmlsbGluZ01vZGU6IEJpbGxpbmdNb2RlLlBBWV9QRVJfUkVRVUVTVCxcbiAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgIHRpbWVUb0xpdmVBdHRyaWJ1dGU6ICd0dGwnLFxuICAgICAgc3RyZWFtOiBTdHJlYW1WaWV3VHlwZS5ORVdfQU5EX09MRF9JTUFHRVMsXG4gICAgfSk7XG5cbiAgICBjb25zdCBsb2NhbCA9IGV4aXN0c1N5bmMoam9pbihfX2Rpcm5hbWUsICdkZXN0cm95ZXItc3RhY2suZm4tY2xvdWRmb3JtYXRpb24udHMnKSk7XG4gICAgY29uc3QgY2xvdWRmb3JtYXRpb25GbiA9IG5ldyBOb2RlanNGdW5jdGlvbih0aGlzLCAnZm4tY2xvdWRmb3JtYXRpb24nLCB7XG4gICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18xOF9YLFxuICAgICAgbWVtb3J5U2l6ZTogMTAyNCxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoNSksXG4gICAgICBlbnRyeTogam9pbihfX2Rpcm5hbWUsIGxvY2FsID8gJ2Rlc3Ryb3llci1zdGFjay5mbi1jbG91ZGZvcm1hdGlvbi50cycgOiAnZGVzdHJveWVyLXN0YWNrLmZuLWNsb3VkZm9ybWF0aW9uLmpzJyksXG4gICAgICBpbml0aWFsUG9saWN5OiBbXG4gICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICdjbG91ZGZvcm1hdGlvbjpEZXNjcmliZSonLFxuICAgICAgICAgICAgJ2Nsb3VkZm9ybWF0aW9uOkdldConLFxuICAgICAgICAgICAgJ2Nsb3VkZm9ybWF0aW9uOkxpc3QqJyxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcbiAgICB0YWJsZS5ncmFudFJlYWRXcml0ZURhdGEoY2xvdWRmb3JtYXRpb25Gbik7XG4gICAgY2xvdWRmb3JtYXRpb25Gbi5hZGRFbnZpcm9ubWVudCgnREVTVFJPWV9UQUJMRV9OQU1FJywgdGFibGUudGFibGVOYW1lKTtcbiAgICBuZXcgUnVsZSh0aGlzLCAnY2xvdWRmb3JtYXRpb24tcnVsZScsIHtcbiAgICAgIGV2ZW50UGF0dGVybjoge1xuICAgICAgICBzb3VyY2U6IFsnYXdzLmNsb3VkZm9ybWF0aW9uJ10sXG4gICAgICAgIGRldGFpbFR5cGU6IFsnQ2xvdWRGb3JtYXRpb24gU3RhY2sgU3RhdHVzIENoYW5nZSddLFxuICAgICAgfSxcbiAgICAgIHRhcmdldHM6IFtuZXcgTGFtYmRhRnVuY3Rpb24oY2xvdWRmb3JtYXRpb25GbildLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZGVzdHJveUZuID0gbmV3IE5vZGVqc0Z1bmN0aW9uKHRoaXMsICdmbi1kZXN0cm95ZXInLCB7XG4gICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18xOF9YLFxuICAgICAgbWVtb3J5U2l6ZTogMTAyNCxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoNSksXG4gICAgICBlbnRyeTogam9pbihfX2Rpcm5hbWUsIGxvY2FsID8gJ2Rlc3Ryb3llci1zdGFjay5mbi1kZXN0cm95ZXIudHMnIDogJ2Rlc3Ryb3llci1zdGFjay5mbi1kZXN0cm95ZXIuanMnKSxcbiAgICB9KTtcblxuICAgIGRlc3Ryb3lGbi5hZGRFdmVudFNvdXJjZShcbiAgICAgIG5ldyBEeW5hbW9FdmVudFNvdXJjZSh0YWJsZSwge1xuICAgICAgICBzdGFydGluZ1Bvc2l0aW9uOiBTdGFydGluZ1Bvc2l0aW9uLkxBVEVTVCxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgZGVzdHJveUZuLmFkZFRvUm9sZVBvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbJ2Nsb3VkZm9ybWF0aW9uOkRlbGV0ZVN0YWNrJ10sXG4gICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIGNvbnN0IGZhaWxUb3BpYyA9IG5ldyBUb3BpYyh0aGlzLCAnZmFpbC10b3BpYycpO1xuICAgIG5ldyBSdWxlKHRoaXMsICdkZWxldGUtZmFpbGVkLXJ1bGUnLCB7XG4gICAgICBldmVudFBhdHRlcm46IHtcbiAgICAgICAgc291cmNlOiBbJ2F3cy5jbG91ZGZvcm1hdGlvbiddLFxuICAgICAgICBkZXRhaWxUeXBlOiBbJ0Nsb3VkRm9ybWF0aW9uIFN0YWNrIFN0YXR1cyBDaGFuZ2UnXSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgcmVzb3VyY2VTdGF0dXM6IFsnREVMRVRFX0ZBSUxFRCddLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHRhcmdldHM6IFtuZXcgU25zVG9waWMoZmFpbFRvcGljKV0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==