UNPKG

aws-logs-comptroller

Version:

Set Log Retention and prune orphaned LogGroups on a schedule using Step Functions service integrations and intrinsic functions.

85 lines 11.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getIteratorStateMachine = void 0; const aws_stepfunctions_1 = require("aws-cdk-lib/aws-stepfunctions"); const aws_stepfunctions_tasks_1 = require("aws-cdk-lib/aws-stepfunctions-tasks"); exports.getIteratorStateMachine = (scope, runner) => { /** * Get first group of LogGroups. * Pagination is implicit, so we'll get the first 50 groups. * If there are more than 50 groups, we'll get a NextToken. */ const getLogGroups = new aws_stepfunctions_tasks_1.CallAwsService(scope, 'GetLogGroups', { action: 'describeLogGroups', iamAction: 'logs:DescribeLogGroups', iamResources: ['*'], resultPath: '$.LG', service: 'cloudwatchlogs', }); /** * Initialize stats object and set LGsSeen to the length of the returned array. * This will be our running total. */ const setLGsSeen = new aws_stepfunctions_1.Pass(scope, 'SetLGsSeen', { parameters: { LGsDeleted: 0, LGsRetained: 0, LGsSeen: aws_stepfunctions_1.JsonPath.numberAt('States.ArrayLength($.LG.LogGroups)'), }, resultPath: '$.Stats', }); /** * Execute runner state machine to process the current batch of LogGroups. * Delegate this to a child state machine in order to avoid hitting the maximum event history of 25000 events. */ const executeRunner = new aws_stepfunctions_tasks_1.StepFunctionsStartExecution(scope, 'ExecuteRunner', { input: aws_stepfunctions_1.TaskInput.fromObject({ LogGroups: aws_stepfunctions_1.JsonPath.objectAt('$.LG.LogGroups'), Stats: aws_stepfunctions_1.JsonPath.objectAt('$.Stats'), Token: aws_stepfunctions_1.JsonPath.taskToken, }), integrationPattern: aws_stepfunctions_1.IntegrationPattern.WAIT_FOR_TASK_TOKEN, resultPath: '$.Stats', stateMachine: runner, }); /** * Choice step determines whether we should start another loop or if the job is done. */ const hasNextToken = new aws_stepfunctions_1.Choice(scope, 'HasNextToken?'); /** * Get next batch of LogGroups with the NextToken. * Will return another NextToken if there are more results available. */ const getNextLogGroups = new aws_stepfunctions_tasks_1.CallAwsService(scope, 'GetNextLogGroups', { action: 'describeLogGroups', iamAction: 'logs:DescribeLogGroups', iamResources: ['*'], parameters: { NextToken: aws_stepfunctions_1.JsonPath.stringAt('$.LG.NextToken'), }, resultPath: '$.LG', service: 'cloudwatchlogs', }); /** * Append running total of LogGroups after getting a subsequent batch. */ const appendTotal = new aws_stepfunctions_1.Pass(scope, 'AppendTotal', { parameters: { LGsDeleted: aws_stepfunctions_1.JsonPath.numberAt('$.Stats.LGsDeleted'), LGsRetained: aws_stepfunctions_1.JsonPath.numberAt('$.Stats.LGsRetained'), 'LGsSeen.$': 'States.MathAdd($.Stats.LGsSeen, States.ArrayLength($.LG.LogGroups))', }, resultPath: '$.Stats', }); getLogGroups.next(setLGsSeen.next(executeRunner.next(hasNextToken .when(aws_stepfunctions_1.Condition.isPresent('$.LG.NextToken'), getNextLogGroups.next(appendTotal.next(executeRunner))) .otherwise(new aws_stepfunctions_1.Succeed(scope, 'Work Complete!', { outputPath: '$.Stats', }))))); return new aws_stepfunctions_1.StateMachine(scope, 'LogsComptrollerIterator', { definition: getLogGroups, stateMachineName: 'logs-comptroller-iterator', tracingEnabled: true, }); }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlcmF0b3Itc3RhdGUtbWFjaGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pdGVyYXRvci1zdGF0ZS1tYWNoaW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQU9tRDtBQUNuRCxpRkFBa0c7QUFHckYsUUFBQSx1QkFBdUIsR0FBRyxDQUNyQyxLQUFnQixFQUNoQixNQUFvQixFQUNOLEVBQUU7SUFDaEI7Ozs7T0FJRztJQUNILE1BQU0sWUFBWSxHQUFHLElBQUksd0NBQWMsQ0FBQyxLQUFLLEVBQUUsY0FBYyxFQUFFO1FBQzdELE1BQU0sRUFBRSxtQkFBbUI7UUFDM0IsU0FBUyxFQUFFLHdCQUF3QjtRQUNuQyxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUM7UUFDbkIsVUFBVSxFQUFFLE1BQU07UUFDbEIsT0FBTyxFQUFFLGdCQUFnQjtLQUMxQixDQUFDLENBQUM7SUFFSDs7O09BR0c7SUFDSCxNQUFNLFVBQVUsR0FBRyxJQUFJLHdCQUFJLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRTtRQUMvQyxVQUFVLEVBQUU7WUFDVixVQUFVLEVBQUUsQ0FBQztZQUNiLFdBQVcsRUFBRSxDQUFDO1lBQ2QsT0FBTyxFQUFFLDRCQUFRLENBQUMsUUFBUSxDQUFDLG9DQUFvQyxDQUFDO1NBQ2pFO1FBQ0QsVUFBVSxFQUFFLFNBQVM7S0FDdEIsQ0FBQyxDQUFDO0lBRUg7OztPQUdHO0lBQ0gsTUFBTSxhQUFhLEdBQUcsSUFBSSxxREFBMkIsQ0FDbkQsS0FBSyxFQUNMLGVBQWUsRUFDZjtRQUNFLEtBQUssRUFBRSw2QkFBUyxDQUFDLFVBQVUsQ0FBQztZQUMxQixTQUFTLEVBQUUsNEJBQVEsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUM7WUFDOUMsS0FBSyxFQUFFLDRCQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztZQUNuQyxLQUFLLEVBQUUsNEJBQVEsQ0FBQyxTQUFTO1NBQzFCLENBQUM7UUFDRixrQkFBa0IsRUFBRSxzQ0FBa0IsQ0FBQyxtQkFBbUI7UUFDMUQsVUFBVSxFQUFFLFNBQVM7UUFDckIsWUFBWSxFQUFFLE1BQU07S0FDckIsQ0FDRixDQUFDO0lBRUY7O09BRUc7SUFDSCxNQUFNLFlBQVksR0FBRyxJQUFJLDBCQUFNLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBRXhEOzs7T0FHRztJQUNILE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSx3Q0FBYyxDQUFDLEtBQUssRUFBRSxrQkFBa0IsRUFBRTtRQUNyRSxNQUFNLEVBQUUsbUJBQW1CO1FBQzNCLFNBQVMsRUFBRSx3QkFBd0I7UUFDbkMsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQ25CLFVBQVUsRUFBRTtZQUNWLFNBQVMsRUFBRSw0QkFBUSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztTQUMvQztRQUNELFVBQVUsRUFBRSxNQUFNO1FBQ2xCLE9BQU8sRUFBRSxnQkFBZ0I7S0FDMUIsQ0FBQyxDQUFDO0lBRUg7O09BRUc7SUFDSCxNQUFNLFdBQVcsR0FBRyxJQUFJLHdCQUFJLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRTtRQUNqRCxVQUFVLEVBQUU7WUFDVixVQUFVLEVBQUUsNEJBQVEsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUM7WUFDbkQsV0FBVyxFQUFFLDRCQUFRLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDO1lBQ3JELFdBQVcsRUFDVCxxRUFBcUU7U0FDeEU7UUFDRCxVQUFVLEVBQUUsU0FBUztLQUN0QixDQUFDLENBQUM7SUFFSCxZQUFZLENBQUMsSUFBSSxDQUNmLFVBQVUsQ0FBQyxJQUFJLENBQ2IsYUFBYSxDQUFDLElBQUksQ0FDaEIsWUFBWTtTQUNULElBQUksQ0FDSCw2QkFBUyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUNyQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUN2RDtTQUNBLFNBQVMsQ0FDUixJQUFJLDJCQUFPLENBQUMsS0FBSyxFQUFFLGdCQUFnQixFQUFFO1FBQ25DLFVBQVUsRUFBRSxTQUFTO0tBQ3RCLENBQUMsQ0FDSCxDQUNKLENBQ0YsQ0FDRixDQUFDO0lBRUYsT0FBTyxJQUFJLGdDQUFZLENBQUMsS0FBSyxFQUFFLHlCQUF5QixFQUFFO1FBQ3hELFVBQVUsRUFBRSxZQUFZO1FBQ3hCLGdCQUFnQixFQUFFLDJCQUEyQjtRQUM3QyxjQUFjLEVBQUUsSUFBSTtLQUNyQixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaG9pY2UsXG4gIENvbmRpdGlvbixcbiAgSW50ZWdyYXRpb25QYXR0ZXJuLFxuICBKc29uUGF0aCxcbiAgUGFzcyxcbiAgU3RhdGVNYWNoaW5lLFxuICBTdWNjZWVkLFxuICBUYXNrSW5wdXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc3RlcGZ1bmN0aW9ucyc7XG5pbXBvcnQgeyBDYWxsQXdzU2VydmljZSwgU3RlcEZ1bmN0aW9uc1N0YXJ0RXhlY3V0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXN0ZXBmdW5jdGlvbnMtdGFza3MnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbmV4cG9ydCBjb25zdCBnZXRJdGVyYXRvclN0YXRlTWFjaGluZSA9IChcbiAgc2NvcGU6IENvbnN0cnVjdCxcbiAgcnVubmVyOiBTdGF0ZU1hY2hpbmUsXG4pOiBTdGF0ZU1hY2hpbmUgPT4ge1xuICAvKipcbiAgICogR2V0IGZpcnN0IGdyb3VwIG9mIExvZ0dyb3Vwcy5cbiAgICogUGFnaW5hdGlvbiBpcyBpbXBsaWNpdCwgc28gd2UnbGwgZ2V0IHRoZSBmaXJzdCA1MCBncm91cHMuXG4gICAqIElmIHRoZXJlIGFyZSBtb3JlIHRoYW4gNTAgZ3JvdXBzLCB3ZSdsbCBnZXQgYSBOZXh0VG9rZW4uXG4gICAqL1xuICBjb25zdCBnZXRMb2dHcm91cHMgPSBuZXcgQ2FsbEF3c1NlcnZpY2Uoc2NvcGUsICdHZXRMb2dHcm91cHMnLCB7XG4gICAgYWN0aW9uOiAnZGVzY3JpYmVMb2dHcm91cHMnLFxuICAgIGlhbUFjdGlvbjogJ2xvZ3M6RGVzY3JpYmVMb2dHcm91cHMnLFxuICAgIGlhbVJlc291cmNlczogWycqJ10sXG4gICAgcmVzdWx0UGF0aDogJyQuTEcnLFxuICAgIHNlcnZpY2U6ICdjbG91ZHdhdGNobG9ncycsXG4gIH0pO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHN0YXRzIG9iamVjdCBhbmQgc2V0IExHc1NlZW4gdG8gdGhlIGxlbmd0aCBvZiB0aGUgcmV0dXJuZWQgYXJyYXkuXG4gICAqIFRoaXMgd2lsbCBiZSBvdXIgcnVubmluZyB0b3RhbC5cbiAgICovXG4gIGNvbnN0IHNldExHc1NlZW4gPSBuZXcgUGFzcyhzY29wZSwgJ1NldExHc1NlZW4nLCB7XG4gICAgcGFyYW1ldGVyczoge1xuICAgICAgTEdzRGVsZXRlZDogMCxcbiAgICAgIExHc1JldGFpbmVkOiAwLFxuICAgICAgTEdzU2VlbjogSnNvblBhdGgubnVtYmVyQXQoJ1N0YXRlcy5BcnJheUxlbmd0aCgkLkxHLkxvZ0dyb3VwcyknKSxcbiAgICB9LFxuICAgIHJlc3VsdFBhdGg6ICckLlN0YXRzJyxcbiAgfSk7XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgcnVubmVyIHN0YXRlIG1hY2hpbmUgdG8gcHJvY2VzcyB0aGUgY3VycmVudCBiYXRjaCBvZiBMb2dHcm91cHMuXG4gICAqIERlbGVnYXRlIHRoaXMgdG8gYSBjaGlsZCBzdGF0ZSBtYWNoaW5lIGluIG9yZGVyIHRvIGF2b2lkIGhpdHRpbmcgdGhlIG1heGltdW0gZXZlbnQgaGlzdG9yeSBvZiAyNTAwMCBldmVudHMuXG4gICAqL1xuICBjb25zdCBleGVjdXRlUnVubmVyID0gbmV3IFN0ZXBGdW5jdGlvbnNTdGFydEV4ZWN1dGlvbihcbiAgICBzY29wZSxcbiAgICAnRXhlY3V0ZVJ1bm5lcicsXG4gICAge1xuICAgICAgaW5wdXQ6IFRhc2tJbnB1dC5mcm9tT2JqZWN0KHtcbiAgICAgICAgTG9nR3JvdXBzOiBKc29uUGF0aC5vYmplY3RBdCgnJC5MRy5Mb2dHcm91cHMnKSxcbiAgICAgICAgU3RhdHM6IEpzb25QYXRoLm9iamVjdEF0KCckLlN0YXRzJyksXG4gICAgICAgIFRva2VuOiBKc29uUGF0aC50YXNrVG9rZW4sXG4gICAgICB9KSxcbiAgICAgIGludGVncmF0aW9uUGF0dGVybjogSW50ZWdyYXRpb25QYXR0ZXJuLldBSVRfRk9SX1RBU0tfVE9LRU4sXG4gICAgICByZXN1bHRQYXRoOiAnJC5TdGF0cycsXG4gICAgICBzdGF0ZU1hY2hpbmU6IHJ1bm5lcixcbiAgICB9LFxuICApO1xuXG4gIC8qKlxuICAgKiBDaG9pY2Ugc3RlcCBkZXRlcm1pbmVzIHdoZXRoZXIgd2Ugc2hvdWxkIHN0YXJ0IGFub3RoZXIgbG9vcCBvciBpZiB0aGUgam9iIGlzIGRvbmUuXG4gICAqL1xuICBjb25zdCBoYXNOZXh0VG9rZW4gPSBuZXcgQ2hvaWNlKHNjb3BlLCAnSGFzTmV4dFRva2VuPycpO1xuXG4gIC8qKlxuICAgKiBHZXQgbmV4dCBiYXRjaCBvZiBMb2dHcm91cHMgd2l0aCB0aGUgTmV4dFRva2VuLlxuICAgKiBXaWxsIHJldHVybiBhbm90aGVyIE5leHRUb2tlbiBpZiB0aGVyZSBhcmUgbW9yZSByZXN1bHRzIGF2YWlsYWJsZS5cbiAgICovXG4gIGNvbnN0IGdldE5leHRMb2dHcm91cHMgPSBuZXcgQ2FsbEF3c1NlcnZpY2Uoc2NvcGUsICdHZXROZXh0TG9nR3JvdXBzJywge1xuICAgIGFjdGlvbjogJ2Rlc2NyaWJlTG9nR3JvdXBzJyxcbiAgICBpYW1BY3Rpb246ICdsb2dzOkRlc2NyaWJlTG9nR3JvdXBzJyxcbiAgICBpYW1SZXNvdXJjZXM6IFsnKiddLFxuICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgIE5leHRUb2tlbjogSnNvblBhdGguc3RyaW5nQXQoJyQuTEcuTmV4dFRva2VuJyksXG4gICAgfSxcbiAgICByZXN1bHRQYXRoOiAnJC5MRycsXG4gICAgc2VydmljZTogJ2Nsb3Vkd2F0Y2hsb2dzJyxcbiAgfSk7XG5cbiAgLyoqXG4gICAqIEFwcGVuZCBydW5uaW5nIHRvdGFsIG9mIExvZ0dyb3VwcyBhZnRlciBnZXR0aW5nIGEgc3Vic2VxdWVudCBiYXRjaC5cbiAgICovXG4gIGNvbnN0IGFwcGVuZFRvdGFsID0gbmV3IFBhc3Moc2NvcGUsICdBcHBlbmRUb3RhbCcsIHtcbiAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICBMR3NEZWxldGVkOiBKc29uUGF0aC5udW1iZXJBdCgnJC5TdGF0cy5MR3NEZWxldGVkJyksXG4gICAgICBMR3NSZXRhaW5lZDogSnNvblBhdGgubnVtYmVyQXQoJyQuU3RhdHMuTEdzUmV0YWluZWQnKSxcbiAgICAgICdMR3NTZWVuLiQnOlxuICAgICAgICAnU3RhdGVzLk1hdGhBZGQoJC5TdGF0cy5MR3NTZWVuLCBTdGF0ZXMuQXJyYXlMZW5ndGgoJC5MRy5Mb2dHcm91cHMpKScsXG4gICAgfSxcbiAgICByZXN1bHRQYXRoOiAnJC5TdGF0cycsXG4gIH0pO1xuXG4gIGdldExvZ0dyb3Vwcy5uZXh0KFxuICAgIHNldExHc1NlZW4ubmV4dChcbiAgICAgIGV4ZWN1dGVSdW5uZXIubmV4dChcbiAgICAgICAgaGFzTmV4dFRva2VuXG4gICAgICAgICAgLndoZW4oXG4gICAgICAgICAgICBDb25kaXRpb24uaXNQcmVzZW50KCckLkxHLk5leHRUb2tlbicpLFxuICAgICAgICAgICAgZ2V0TmV4dExvZ0dyb3Vwcy5uZXh0KGFwcGVuZFRvdGFsLm5leHQoZXhlY3V0ZVJ1bm5lcikpLFxuICAgICAgICAgIClcbiAgICAgICAgICAub3RoZXJ3aXNlKFxuICAgICAgICAgICAgbmV3IFN1Y2NlZWQoc2NvcGUsICdXb3JrIENvbXBsZXRlIScsIHtcbiAgICAgICAgICAgICAgb3V0cHV0UGF0aDogJyQuU3RhdHMnLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKSxcbiAgICAgICksXG4gICAgKSxcbiAgKTtcblxuICByZXR1cm4gbmV3IFN0YXRlTWFjaGluZShzY29wZSwgJ0xvZ3NDb21wdHJvbGxlckl0ZXJhdG9yJywge1xuICAgIGRlZmluaXRpb246IGdldExvZ0dyb3VwcyxcbiAgICBzdGF0ZU1hY2hpbmVOYW1lOiAnbG9ncy1jb21wdHJvbGxlci1pdGVyYXRvcicsXG4gICAgdHJhY2luZ0VuYWJsZWQ6IHRydWUsXG4gIH0pO1xufTtcbiJdfQ==