@aws-community/ephemeral
Version:
Ephemeral Stacks! A CDK Stack and Construct that will self-destruct after a specified time period.
32 lines • 4.99 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.handler = void 0;
const util_dynamodb_1 = require("@aws-sdk/util-dynamodb");
const client_cloudformation_1 = require("@aws-sdk/client-cloudformation");
const handler = async (event) => {
const stacksToDestroy = event.Records.reduce((p, record) => {
if (record.eventName === 'REMOVE') {
if (record.dynamodb?.OldImage) {
const oldImage = record.dynamodb.OldImage;
const item = (0, util_dynamodb_1.unmarshall)(oldImage);
const currentTimeInSeconds = new Date().getTime() / 1000;
if (item.ttl > currentTimeInSeconds) {
// item was manually removed and not expired
console.log('item was manually removed and not expired', currentTimeInSeconds, item.ttl);
return [...p];
}
return [...p, item.pk];
}
}
return [...p];
}, []);
console.log(stacksToDestroy);
if (stacksToDestroy.length > 0) {
const client = new client_cloudformation_1.CloudFormationClient({});
await Promise.all(stacksToDestroy.map(async (stackName) => await client.send(new client_cloudformation_1.DeleteStackCommand({
StackName: stackName,
}))));
}
};
exports.handler = handler;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzdHJveWVyLXN0YWNrLmZuLWRlc3Ryb3llci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kZXN0cm95ZXItc3RhY2suZm4tZGVzdHJveWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDBEQUFvRDtBQUVwRCwwRUFBMEY7QUFFbkYsTUFBTSxPQUFPLEdBQUcsS0FBSyxFQUFFLEtBQTBCLEVBQWlCLEVBQUU7SUFDekUsTUFBTSxlQUFlLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQVcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDbkUsSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLFFBQVEsRUFBRTtZQUNqQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFO2dCQUM3QixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBR2hDLENBQUM7Z0JBQ0YsTUFBTSxJQUFJLEdBQUcsSUFBQSwwQkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNsQyxNQUFNLG9CQUFvQixHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDO2dCQUN6RCxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsb0JBQW9CLEVBQUU7b0JBQ25DLDRDQUE0QztvQkFDNUMsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQ0FBMkMsRUFBRSxvQkFBb0IsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3pGLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2lCQUNmO2dCQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDeEI7U0FDRjtRQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2hCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNQLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDN0IsSUFBSSxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUM5QixNQUFNLE1BQU0sR0FBRyxJQUFJLDRDQUFvQixDQUFDLEVBQ3ZDLENBQUMsQ0FBQztRQUNILE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixlQUFlLENBQUMsR0FBRyxDQUNqQixLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FDbEIsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUNmLElBQUksMENBQWtCLENBQUM7WUFDckIsU0FBUyxFQUFFLFNBQVM7U0FDckIsQ0FBQyxDQUNILENBQ0osQ0FDRixDQUFDO0tBQ0g7QUFDSCxDQUFDLENBQUM7QUFuQ1csUUFBQSxPQUFPLFdBbUNsQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRHluYW1vREJTdHJlYW1FdmVudCB9IGZyb20gJ2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgdW5tYXJzaGFsbCB9IGZyb20gJ0Bhd3Mtc2RrL3V0aWwtZHluYW1vZGInO1xuaW1wb3J0IHsgQXR0cmlidXRlVmFsdWUgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtZHluYW1vZGInO1xuaW1wb3J0IHsgQ2xvdWRGb3JtYXRpb25DbGllbnQsIERlbGV0ZVN0YWNrQ29tbWFuZCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1jbG91ZGZvcm1hdGlvbic7XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVyID0gYXN5bmMgKGV2ZW50OiBEeW5hbW9EQlN0cmVhbUV2ZW50KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHN0YWNrc1RvRGVzdHJveSA9IGV2ZW50LlJlY29yZHMucmVkdWNlPHN0cmluZ1tdPigocCwgcmVjb3JkKSA9PiB7XG4gICAgaWYgKHJlY29yZC5ldmVudE5hbWUgPT09ICdSRU1PVkUnKSB7XG4gICAgICBpZiAocmVjb3JkLmR5bmFtb2RiPy5PbGRJbWFnZSkge1xuICAgICAgICBjb25zdCBvbGRJbWFnZSA9IHJlY29yZC5keW5hbW9kYi5PbGRJbWFnZSBhcyBSZWNvcmQ8XG4gICAgICAgIHN0cmluZyxcbiAgICAgICAgQXR0cmlidXRlVmFsdWVcbiAgICAgICAgPjtcbiAgICAgICAgY29uc3QgaXRlbSA9IHVubWFyc2hhbGwob2xkSW1hZ2UpO1xuICAgICAgICBjb25zdCBjdXJyZW50VGltZUluU2Vjb25kcyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMDtcbiAgICAgICAgaWYgKGl0ZW0udHRsID4gY3VycmVudFRpbWVJblNlY29uZHMpIHtcbiAgICAgICAgICAvLyBpdGVtIHdhcyBtYW51YWxseSByZW1vdmVkIGFuZCBub3QgZXhwaXJlZFxuICAgICAgICAgIGNvbnNvbGUubG9nKCdpdGVtIHdhcyBtYW51YWxseSByZW1vdmVkIGFuZCBub3QgZXhwaXJlZCcsIGN1cnJlbnRUaW1lSW5TZWNvbmRzLCBpdGVtLnR0bCk7XG4gICAgICAgICAgcmV0dXJuIFsuLi5wXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gWy4uLnAsIGl0ZW0ucGtdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gWy4uLnBdO1xuICB9LCBbXSk7XG4gIGNvbnNvbGUubG9nKHN0YWNrc1RvRGVzdHJveSk7XG4gIGlmIChzdGFja3NUb0Rlc3Ryb3kubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBDbG91ZEZvcm1hdGlvbkNsaWVudCh7XG4gICAgfSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBzdGFja3NUb0Rlc3Ryb3kubWFwKFxuICAgICAgICBhc3luYyAoc3RhY2tOYW1lKSA9PlxuICAgICAgICAgIGF3YWl0IGNsaWVudC5zZW5kKFxuICAgICAgICAgICAgbmV3IERlbGV0ZVN0YWNrQ29tbWFuZCh7XG4gICAgICAgICAgICAgIFN0YWNrTmFtZTogc3RhY2tOYW1lLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxufTtcbiJdfQ==