UNPKG

aws-logs-comptroller

Version:

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

86 lines 11.3 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"); const 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, }); }; exports.getIteratorStateMachine = getIteratorStateMachine; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlcmF0b3Itc3RhdGUtbWFjaGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIml0ZXJhdG9yLXN0YXRlLW1hY2hpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBT21EO0FBQ25ELGlGQUFrRztBQUczRixNQUFNLHVCQUF1QixHQUFHLENBQ3JDLEtBQWdCLEVBQ2hCLE1BQW9CLEVBQ04sRUFBRTtJQUNoQjs7OztPQUlHO0lBQ0gsTUFBTSxZQUFZLEdBQUcsSUFBSSx3Q0FBYyxDQUFDLEtBQUssRUFBRSxjQUFjLEVBQUU7UUFDN0QsTUFBTSxFQUFFLG1CQUFtQjtRQUMzQixTQUFTLEVBQUUsd0JBQXdCO1FBQ25DLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQztRQUNuQixVQUFVLEVBQUUsTUFBTTtRQUNsQixPQUFPLEVBQUUsZ0JBQWdCO0tBQzFCLENBQUMsQ0FBQztJQUVIOzs7T0FHRztJQUNILE1BQU0sVUFBVSxHQUFHLElBQUksd0JBQUksQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFO1FBQy9DLFVBQVUsRUFBRTtZQUNWLFVBQVUsRUFBRSxDQUFDO1lBQ2IsV0FBVyxFQUFFLENBQUM7WUFDZCxPQUFPLEVBQUUsNEJBQVEsQ0FBQyxRQUFRLENBQUMsb0NBQW9DLENBQUM7U0FDakU7UUFDRCxVQUFVLEVBQUUsU0FBUztLQUN0QixDQUFDLENBQUM7SUFFSDs7O09BR0c7SUFDSCxNQUFNLGFBQWEsR0FBRyxJQUFJLHFEQUEyQixDQUNuRCxLQUFLLEVBQ0wsZUFBZSxFQUNmO1FBQ0UsS0FBSyxFQUFFLDZCQUFTLENBQUMsVUFBVSxDQUFDO1lBQzFCLFNBQVMsRUFBRSw0QkFBUSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztZQUM5QyxLQUFLLEVBQUUsNEJBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO1lBQ25DLEtBQUssRUFBRSw0QkFBUSxDQUFDLFNBQVM7U0FDMUIsQ0FBQztRQUNGLGtCQUFrQixFQUFFLHNDQUFrQixDQUFDLG1CQUFtQjtRQUMxRCxVQUFVLEVBQUUsU0FBUztRQUNyQixZQUFZLEVBQUUsTUFBTTtLQUNyQixDQUNGLENBQUM7SUFFRjs7T0FFRztJQUNILE1BQU0sWUFBWSxHQUFHLElBQUksMEJBQU0sQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFFeEQ7OztPQUdHO0lBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLHdDQUFjLENBQUMsS0FBSyxFQUFFLGtCQUFrQixFQUFFO1FBQ3JFLE1BQU0sRUFBRSxtQkFBbUI7UUFDM0IsU0FBUyxFQUFFLHdCQUF3QjtRQUNuQyxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUM7UUFDbkIsVUFBVSxFQUFFO1lBQ1YsU0FBUyxFQUFFLDRCQUFRLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDO1NBQy9DO1FBQ0QsVUFBVSxFQUFFLE1BQU07UUFDbEIsT0FBTyxFQUFFLGdCQUFnQjtLQUMxQixDQUFDLENBQUM7SUFFSDs7T0FFRztJQUNILE1BQU0sV0FBVyxHQUFHLElBQUksd0JBQUksQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFO1FBQ2pELFVBQVUsRUFBRTtZQUNWLFVBQVUsRUFBRSw0QkFBUSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQztZQUNuRCxXQUFXLEVBQUUsNEJBQVEsQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUM7WUFDckQsV0FBVyxFQUNULHFFQUFxRTtTQUN4RTtRQUNELFVBQVUsRUFBRSxTQUFTO0tBQ3RCLENBQUMsQ0FBQztJQUVILFlBQVksQ0FBQyxJQUFJLENBQ2YsVUFBVSxDQUFDLElBQUksQ0FDYixhQUFhLENBQUMsSUFBSSxDQUNoQixZQUFZO1NBQ1QsSUFBSSxDQUNILDZCQUFTLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLEVBQ3JDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQ3ZEO1NBQ0EsU0FBUyxDQUNSLElBQUksMkJBQU8sQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUU7UUFDbkMsVUFBVSxFQUFFLFNBQVM7S0FDdEIsQ0FBQyxDQUNILENBQ0osQ0FDRixDQUNGLENBQUM7SUFFRixPQUFPLElBQUksZ0NBQVksQ0FBQyxLQUFLLEVBQUUseUJBQXlCLEVBQUU7UUFDeEQsVUFBVSxFQUFFLFlBQVk7UUFDeEIsZ0JBQWdCLEVBQUUsMkJBQTJCO1FBQzdDLGNBQWMsRUFBRSxJQUFJO0tBQ3JCLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQXhHVyxRQUFBLHVCQUF1QiwyQkF3R2xDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hvaWNlLFxuICBDb25kaXRpb24sXG4gIEludGVncmF0aW9uUGF0dGVybixcbiAgSnNvblBhdGgsXG4gIFBhc3MsXG4gIFN0YXRlTWFjaGluZSxcbiAgU3VjY2VlZCxcbiAgVGFza0lucHV0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXN0ZXBmdW5jdGlvbnMnO1xuaW1wb3J0IHsgQ2FsbEF3c1NlcnZpY2UsIFN0ZXBGdW5jdGlvbnNTdGFydEV4ZWN1dGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zdGVwZnVuY3Rpb25zLXRhc2tzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG5leHBvcnQgY29uc3QgZ2V0SXRlcmF0b3JTdGF0ZU1hY2hpbmUgPSAoXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXG4gIHJ1bm5lcjogU3RhdGVNYWNoaW5lLFxuKTogU3RhdGVNYWNoaW5lID0+IHtcbiAgLyoqXG4gICAqIEdldCBmaXJzdCBncm91cCBvZiBMb2dHcm91cHMuXG4gICAqIFBhZ2luYXRpb24gaXMgaW1wbGljaXQsIHNvIHdlJ2xsIGdldCB0aGUgZmlyc3QgNTAgZ3JvdXBzLlxuICAgKiBJZiB0aGVyZSBhcmUgbW9yZSB0aGFuIDUwIGdyb3Vwcywgd2UnbGwgZ2V0IGEgTmV4dFRva2VuLlxuICAgKi9cbiAgY29uc3QgZ2V0TG9nR3JvdXBzID0gbmV3IENhbGxBd3NTZXJ2aWNlKHNjb3BlLCAnR2V0TG9nR3JvdXBzJywge1xuICAgIGFjdGlvbjogJ2Rlc2NyaWJlTG9nR3JvdXBzJyxcbiAgICBpYW1BY3Rpb246ICdsb2dzOkRlc2NyaWJlTG9nR3JvdXBzJyxcbiAgICBpYW1SZXNvdXJjZXM6IFsnKiddLFxuICAgIHJlc3VsdFBhdGg6ICckLkxHJyxcbiAgICBzZXJ2aWNlOiAnY2xvdWR3YXRjaGxvZ3MnLFxuICB9KTtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBzdGF0cyBvYmplY3QgYW5kIHNldCBMR3NTZWVuIHRvIHRoZSBsZW5ndGggb2YgdGhlIHJldHVybmVkIGFycmF5LlxuICAgKiBUaGlzIHdpbGwgYmUgb3VyIHJ1bm5pbmcgdG90YWwuXG4gICAqL1xuICBjb25zdCBzZXRMR3NTZWVuID0gbmV3IFBhc3Moc2NvcGUsICdTZXRMR3NTZWVuJywge1xuICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgIExHc0RlbGV0ZWQ6IDAsXG4gICAgICBMR3NSZXRhaW5lZDogMCxcbiAgICAgIExHc1NlZW46IEpzb25QYXRoLm51bWJlckF0KCdTdGF0ZXMuQXJyYXlMZW5ndGgoJC5MRy5Mb2dHcm91cHMpJyksXG4gICAgfSxcbiAgICByZXN1bHRQYXRoOiAnJC5TdGF0cycsXG4gIH0pO1xuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHJ1bm5lciBzdGF0ZSBtYWNoaW5lIHRvIHByb2Nlc3MgdGhlIGN1cnJlbnQgYmF0Y2ggb2YgTG9nR3JvdXBzLlxuICAgKiBEZWxlZ2F0ZSB0aGlzIHRvIGEgY2hpbGQgc3RhdGUgbWFjaGluZSBpbiBvcmRlciB0byBhdm9pZCBoaXR0aW5nIHRoZSBtYXhpbXVtIGV2ZW50IGhpc3Rvcnkgb2YgMjUwMDAgZXZlbnRzLlxuICAgKi9cbiAgY29uc3QgZXhlY3V0ZVJ1bm5lciA9IG5ldyBTdGVwRnVuY3Rpb25zU3RhcnRFeGVjdXRpb24oXG4gICAgc2NvcGUsXG4gICAgJ0V4ZWN1dGVSdW5uZXInLFxuICAgIHtcbiAgICAgIGlucHV0OiBUYXNrSW5wdXQuZnJvbU9iamVjdCh7XG4gICAgICAgIExvZ0dyb3VwczogSnNvblBhdGgub2JqZWN0QXQoJyQuTEcuTG9nR3JvdXBzJyksXG4gICAgICAgIFN0YXRzOiBKc29uUGF0aC5vYmplY3RBdCgnJC5TdGF0cycpLFxuICAgICAgICBUb2tlbjogSnNvblBhdGgudGFza1Rva2VuLFxuICAgICAgfSksXG4gICAgICBpbnRlZ3JhdGlvblBhdHRlcm46IEludGVncmF0aW9uUGF0dGVybi5XQUlUX0ZPUl9UQVNLX1RPS0VOLFxuICAgICAgcmVzdWx0UGF0aDogJyQuU3RhdHMnLFxuICAgICAgc3RhdGVNYWNoaW5lOiBydW5uZXIsXG4gICAgfSxcbiAgKTtcblxuICAvKipcbiAgICogQ2hvaWNlIHN0ZXAgZGV0ZXJtaW5lcyB3aGV0aGVyIHdlIHNob3VsZCBzdGFydCBhbm90aGVyIGxvb3Agb3IgaWYgdGhlIGpvYiBpcyBkb25lLlxuICAgKi9cbiAgY29uc3QgaGFzTmV4dFRva2VuID0gbmV3IENob2ljZShzY29wZSwgJ0hhc05leHRUb2tlbj8nKTtcblxuICAvKipcbiAgICogR2V0IG5leHQgYmF0Y2ggb2YgTG9nR3JvdXBzIHdpdGggdGhlIE5leHRUb2tlbi5cbiAgICogV2lsbCByZXR1cm4gYW5vdGhlciBOZXh0VG9rZW4gaWYgdGhlcmUgYXJlIG1vcmUgcmVzdWx0cyBhdmFpbGFibGUuXG4gICAqL1xuICBjb25zdCBnZXROZXh0TG9nR3JvdXBzID0gbmV3IENhbGxBd3NTZXJ2aWNlKHNjb3BlLCAnR2V0TmV4dExvZ0dyb3VwcycsIHtcbiAgICBhY3Rpb246ICdkZXNjcmliZUxvZ0dyb3VwcycsXG4gICAgaWFtQWN0aW9uOiAnbG9nczpEZXNjcmliZUxvZ0dyb3VwcycsXG4gICAgaWFtUmVzb3VyY2VzOiBbJyonXSxcbiAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICBOZXh0VG9rZW46IEpzb25QYXRoLnN0cmluZ0F0KCckLkxHLk5leHRUb2tlbicpLFxuICAgIH0sXG4gICAgcmVzdWx0UGF0aDogJyQuTEcnLFxuICAgIHNlcnZpY2U6ICdjbG91ZHdhdGNobG9ncycsXG4gIH0pO1xuXG4gIC8qKlxuICAgKiBBcHBlbmQgcnVubmluZyB0b3RhbCBvZiBMb2dHcm91cHMgYWZ0ZXIgZ2V0dGluZyBhIHN1YnNlcXVlbnQgYmF0Y2guXG4gICAqL1xuICBjb25zdCBhcHBlbmRUb3RhbCA9IG5ldyBQYXNzKHNjb3BlLCAnQXBwZW5kVG90YWwnLCB7XG4gICAgcGFyYW1ldGVyczoge1xuICAgICAgTEdzRGVsZXRlZDogSnNvblBhdGgubnVtYmVyQXQoJyQuU3RhdHMuTEdzRGVsZXRlZCcpLFxuICAgICAgTEdzUmV0YWluZWQ6IEpzb25QYXRoLm51bWJlckF0KCckLlN0YXRzLkxHc1JldGFpbmVkJyksXG4gICAgICAnTEdzU2Vlbi4kJzpcbiAgICAgICAgJ1N0YXRlcy5NYXRoQWRkKCQuU3RhdHMuTEdzU2VlbiwgU3RhdGVzLkFycmF5TGVuZ3RoKCQuTEcuTG9nR3JvdXBzKSknLFxuICAgIH0sXG4gICAgcmVzdWx0UGF0aDogJyQuU3RhdHMnLFxuICB9KTtcblxuICBnZXRMb2dHcm91cHMubmV4dChcbiAgICBzZXRMR3NTZWVuLm5leHQoXG4gICAgICBleGVjdXRlUnVubmVyLm5leHQoXG4gICAgICAgIGhhc05leHRUb2tlblxuICAgICAgICAgIC53aGVuKFxuICAgICAgICAgICAgQ29uZGl0aW9uLmlzUHJlc2VudCgnJC5MRy5OZXh0VG9rZW4nKSxcbiAgICAgICAgICAgIGdldE5leHRMb2dHcm91cHMubmV4dChhcHBlbmRUb3RhbC5uZXh0KGV4ZWN1dGVSdW5uZXIpKSxcbiAgICAgICAgICApXG4gICAgICAgICAgLm90aGVyd2lzZShcbiAgICAgICAgICAgIG5ldyBTdWNjZWVkKHNjb3BlLCAnV29yayBDb21wbGV0ZSEnLCB7XG4gICAgICAgICAgICAgIG91dHB1dFBhdGg6ICckLlN0YXRzJyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICksXG4gICAgICApLFxuICAgICksXG4gICk7XG5cbiAgcmV0dXJuIG5ldyBTdGF0ZU1hY2hpbmUoc2NvcGUsICdMb2dzQ29tcHRyb2xsZXJJdGVyYXRvcicsIHtcbiAgICBkZWZpbml0aW9uOiBnZXRMb2dHcm91cHMsXG4gICAgc3RhdGVNYWNoaW5lTmFtZTogJ2xvZ3MtY29tcHRyb2xsZXItaXRlcmF0b3InLFxuICAgIHRyYWNpbmdFbmFibGVkOiB0cnVlLFxuICB9KTtcbn07XG4iXX0=