UNPKG

@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
"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==