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