aws-ec2-instance-running-scheduler 3.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +8973 -0
- package/API.md +1684 -0
- package/LICENSE +202 -0
- package/README.md +139 -0
- package/assets/funcs/running-scheduler.lambda/index.js +22788 -0
- package/lib/constructs/ec2-instance-running-scheduler.d.ts +59 -0
- package/lib/constructs/ec2-instance-running-scheduler.js +140 -0
- package/lib/funcs/running-scheduler-function.d.ts +18 -0
- package/lib/funcs/running-scheduler-function.js +24 -0
- package/lib/funcs/running-scheduler.lambda.d.ts +28 -0
- package/lib/funcs/running-scheduler.lambda.js +182 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.js +22 -0
- package/lib/stacks/ec2-instance-running-schedule-stack.d.ts +31 -0
- package/lib/stacks/ec2-instance-running-schedule-stack.js +33 -0
- package/package.json +152 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { TimeZone } from 'aws-cdk-lib';
|
|
2
|
+
import { Construct } from 'constructs';
|
|
3
|
+
/**
|
|
4
|
+
* Cron-style schedule configuration for start/stop actions.
|
|
5
|
+
*/
|
|
6
|
+
export interface Schedule {
|
|
7
|
+
/** Time zone for the schedule (e.g. ETC_UTC). */
|
|
8
|
+
readonly timezone: TimeZone;
|
|
9
|
+
/** Cron minute (0–59). */
|
|
10
|
+
readonly minute?: string;
|
|
11
|
+
/** Cron hour (0–23). */
|
|
12
|
+
readonly hour?: string;
|
|
13
|
+
/** Cron day of week (e.g. MON-FRI). */
|
|
14
|
+
readonly week?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Defines which EC2 instances are targeted by tag key and values.
|
|
18
|
+
*/
|
|
19
|
+
export interface TargetResource {
|
|
20
|
+
/** Tag key used to select instances (e.g. Schedule). */
|
|
21
|
+
readonly tagKey: string;
|
|
22
|
+
/** Tag values that match instances to include. */
|
|
23
|
+
readonly tagValues: string[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Secret identifiers required by the scheduler (e.g. Slack).
|
|
27
|
+
*/
|
|
28
|
+
export interface Secrets {
|
|
29
|
+
/** Name of the Secrets Manager secret containing Slack token and channel. */
|
|
30
|
+
readonly slackSecretName: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Properties for creating an EC2 instance running scheduler.
|
|
34
|
+
*/
|
|
35
|
+
export interface EC2InstanceRunningSchedulerProps {
|
|
36
|
+
/** Tag-based targeting for EC2 instances to start/stop. */
|
|
37
|
+
readonly targetResource: TargetResource;
|
|
38
|
+
/** Whether EventBridge Scheduler rules are enabled. Defaults to true if omitted. */
|
|
39
|
+
readonly enableScheduling?: boolean;
|
|
40
|
+
/** Secrets (e.g. Slack) used for notifications. */
|
|
41
|
+
readonly secrets: Secrets;
|
|
42
|
+
/** Cron schedule for stopping instances. */
|
|
43
|
+
readonly stopSchedule?: Schedule;
|
|
44
|
+
/** Cron schedule for starting instances. */
|
|
45
|
+
readonly startSchedule?: Schedule;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Construct that schedules EC2 instance start/stop via EventBridge Scheduler and a Durable Lambda.
|
|
49
|
+
*/
|
|
50
|
+
export declare class EC2InstanceRunningScheduler extends Construct {
|
|
51
|
+
/**
|
|
52
|
+
* Creates an EC2 instance running scheduler with start/stop schedules and a Durable Lambda.
|
|
53
|
+
*
|
|
54
|
+
* @param scope - Parent construct.
|
|
55
|
+
* @param id - Construct id.
|
|
56
|
+
* @param props - Scheduler configuration (target resource, schedules, secrets).
|
|
57
|
+
*/
|
|
58
|
+
constructor(scope: Construct, id: string, props: EC2InstanceRunningSchedulerProps);
|
|
59
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.EC2InstanceRunningScheduler = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
7
|
+
const iam = require("aws-cdk-lib/aws-iam");
|
|
8
|
+
const lambda = require("aws-cdk-lib/aws-lambda");
|
|
9
|
+
const logs = require("aws-cdk-lib/aws-logs");
|
|
10
|
+
const scheduler = require("aws-cdk-lib/aws-scheduler");
|
|
11
|
+
const targets = require("aws-cdk-lib/aws-scheduler-targets");
|
|
12
|
+
const aws_secretsmanager_1 = require("aws-cdk-lib/aws-secretsmanager");
|
|
13
|
+
const constructs_1 = require("constructs");
|
|
14
|
+
const running_scheduler_function_1 = require("../funcs/running-scheduler-function");
|
|
15
|
+
/**
|
|
16
|
+
* Construct that schedules EC2 instance start/stop via EventBridge Scheduler and a Durable Lambda.
|
|
17
|
+
*/
|
|
18
|
+
class EC2InstanceRunningScheduler extends constructs_1.Construct {
|
|
19
|
+
/**
|
|
20
|
+
* Creates an EC2 instance running scheduler with start/stop schedules and a Durable Lambda.
|
|
21
|
+
*
|
|
22
|
+
* @param scope - Parent construct.
|
|
23
|
+
* @param id - Construct id.
|
|
24
|
+
* @param props - Scheduler configuration (target resource, schedules, secrets).
|
|
25
|
+
*/
|
|
26
|
+
constructor(scope, id, props) {
|
|
27
|
+
super(scope, id);
|
|
28
|
+
const slackSecret = aws_secretsmanager_1.Secret.fromSecretNameV2(this, 'SlackSecret', props.secrets.slackSecretName);
|
|
29
|
+
// Durable Functions-based Running Scheduler (previous Step Functions logic implemented in Lambda).
|
|
30
|
+
// Durable Execution requires Node.js 22+.
|
|
31
|
+
const runningScheduleFunction = new running_scheduler_function_1.RunningSchedulerFunction(this, 'RunningSchedulerFunction', {
|
|
32
|
+
description: 'A function to run the scheduled RDS Database or Cluster.',
|
|
33
|
+
architecture: lambda.Architecture.ARM_64,
|
|
34
|
+
timeout: aws_cdk_lib_1.Duration.minutes(15),
|
|
35
|
+
memorySize: 512,
|
|
36
|
+
retryAttempts: 2,
|
|
37
|
+
durableConfig: {
|
|
38
|
+
executionTimeout: aws_cdk_lib_1.Duration.hours(2),
|
|
39
|
+
retentionPeriod: aws_cdk_lib_1.Duration.days(1),
|
|
40
|
+
},
|
|
41
|
+
environment: {
|
|
42
|
+
SLACK_SECRET_NAME: props.secrets.slackSecretName,
|
|
43
|
+
},
|
|
44
|
+
paramsAndSecrets: lambda.ParamsAndSecretsLayerVersion.fromVersion(lambda.ParamsAndSecretsVersions.V1_0_103, {
|
|
45
|
+
cacheSize: 500,
|
|
46
|
+
logLevel: lambda.ParamsAndSecretsLogLevel.INFO,
|
|
47
|
+
}),
|
|
48
|
+
role: new iam.Role(this, 'RunningSchedulerFunctionRole', {
|
|
49
|
+
description: 'A role to control the RDS Database or Cluster.',
|
|
50
|
+
assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'),
|
|
51
|
+
managedPolicies: [
|
|
52
|
+
iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaBasicExecutionRole'),
|
|
53
|
+
iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaBasicDurableExecutionRolePolicy'),
|
|
54
|
+
],
|
|
55
|
+
}),
|
|
56
|
+
logGroup: new logs.LogGroup(this, 'RunningSchedulerFunctionLogGroup', {
|
|
57
|
+
retention: logs.RetentionDays.THREE_MONTHS,
|
|
58
|
+
removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY,
|
|
59
|
+
}),
|
|
60
|
+
loggingFormat: lambda.LoggingFormat.JSON,
|
|
61
|
+
systemLogLevelV2: lambda.SystemLogLevel.INFO,
|
|
62
|
+
applicationLogLevelV2: lambda.ApplicationLogLevel.INFO,
|
|
63
|
+
});
|
|
64
|
+
runningScheduleFunction.addToRolePolicy(new iam.PolicyStatement({
|
|
65
|
+
sid: 'GetResources',
|
|
66
|
+
effect: iam.Effect.ALLOW,
|
|
67
|
+
actions: [
|
|
68
|
+
'tag:GetResources',
|
|
69
|
+
],
|
|
70
|
+
resources: ['*'],
|
|
71
|
+
}));
|
|
72
|
+
// Grant read access to the RDS API
|
|
73
|
+
runningScheduleFunction.addToRolePolicy(new iam.PolicyStatement({
|
|
74
|
+
sid: 'RdsRunningControl',
|
|
75
|
+
effect: iam.Effect.ALLOW,
|
|
76
|
+
actions: [
|
|
77
|
+
'ec2:DescribeInstances',
|
|
78
|
+
'ec2:StartInstances',
|
|
79
|
+
'ec2:StopInstances',
|
|
80
|
+
],
|
|
81
|
+
resources: ['*'],
|
|
82
|
+
}));
|
|
83
|
+
// Grant read access to the Slack secret
|
|
84
|
+
slackSecret.grantRead(runningScheduleFunction);
|
|
85
|
+
// See: https://docs.aws.amazon.com/lambda/latest/dg/durable-getting-started-iac.html
|
|
86
|
+
const runningScheduleFunctionAlias = runningScheduleFunction.addAlias('live');
|
|
87
|
+
// Whether schedules are enabled (default true unless explicitly disabled).
|
|
88
|
+
const scheduleEnabled = (() => {
|
|
89
|
+
if (props.enableScheduling === undefined || props.enableScheduling) {
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
})();
|
|
96
|
+
// Durable Functions: Lambda performs tag lookup and instance start/stop in a single run.
|
|
97
|
+
new scheduler.Schedule(this, 'RunningStartSchedule', {
|
|
98
|
+
description: 'running start schedule',
|
|
99
|
+
enabled: scheduleEnabled,
|
|
100
|
+
schedule: scheduler.ScheduleExpression.cron({
|
|
101
|
+
minute: props.startSchedule?.minute ?? '50',
|
|
102
|
+
hour: props.startSchedule?.hour ?? '7',
|
|
103
|
+
weekDay: props.startSchedule?.week ?? 'MON-FRI',
|
|
104
|
+
timeZone: props.startSchedule?.timezone ?? aws_cdk_lib_1.TimeZone.ETC_UTC,
|
|
105
|
+
}),
|
|
106
|
+
target: new targets.LambdaInvoke(runningScheduleFunctionAlias, {
|
|
107
|
+
input: scheduler.ScheduleTargetInput.fromObject({
|
|
108
|
+
Params: {
|
|
109
|
+
TagKey: props.targetResource.tagKey,
|
|
110
|
+
TagValues: props.targetResource.tagValues,
|
|
111
|
+
Mode: 'Start',
|
|
112
|
+
},
|
|
113
|
+
}),
|
|
114
|
+
}),
|
|
115
|
+
});
|
|
116
|
+
new scheduler.Schedule(this, 'RunningStopSchedule', {
|
|
117
|
+
description: 'running stop schedule',
|
|
118
|
+
enabled: scheduleEnabled,
|
|
119
|
+
schedule: scheduler.ScheduleExpression.cron({
|
|
120
|
+
minute: props.stopSchedule?.minute ?? '5',
|
|
121
|
+
hour: props.stopSchedule?.hour ?? '19',
|
|
122
|
+
weekDay: props.stopSchedule?.week ?? 'MON-FRI',
|
|
123
|
+
timeZone: props.stopSchedule?.timezone ?? aws_cdk_lib_1.TimeZone.ETC_UTC,
|
|
124
|
+
}),
|
|
125
|
+
target: new targets.LambdaInvoke(runningScheduleFunctionAlias, {
|
|
126
|
+
input: scheduler.ScheduleTargetInput.fromObject({
|
|
127
|
+
Params: {
|
|
128
|
+
TagKey: props.targetResource.tagKey,
|
|
129
|
+
TagValues: props.targetResource.tagValues,
|
|
130
|
+
Mode: 'Stop',
|
|
131
|
+
},
|
|
132
|
+
}),
|
|
133
|
+
}),
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
exports.EC2InstanceRunningScheduler = EC2InstanceRunningScheduler;
|
|
138
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
139
|
+
EC2InstanceRunningScheduler[_a] = { fqn: "aws-ec2-instance-running-scheduler.EC2InstanceRunningScheduler", version: "3.0.2" };
|
|
140
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWMyLWluc3RhbmNlLXJ1bm5pbmctc2NoZWR1bGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0cnVjdHMvZWMyLWluc3RhbmNlLXJ1bm5pbmctc2NoZWR1bGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBQWdFO0FBQ2hFLDJDQUEyQztBQUMzQyxpREFBaUQ7QUFDakQsNkNBQTZDO0FBQzdDLHVEQUF1RDtBQUN2RCw2REFBNkQ7QUFDN0QsdUVBQXdEO0FBQ3hELDJDQUF1QztBQUN2QyxvRkFBK0U7QUFrRC9FOztHQUVHO0FBQ0gsTUFBYSwyQkFBNEIsU0FBUSxzQkFBUztJQUN4RDs7Ozs7O09BTUc7SUFDSCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXVDO1FBQy9FLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxXQUFXLEdBQUcsMkJBQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFaEcsbUdBQW1HO1FBQ25HLDBDQUEwQztRQUMxQyxNQUFNLHVCQUF1QixHQUFHLElBQUkscURBQXdCLENBQUMsSUFBSSxFQUFFLDBCQUEwQixFQUFFO1lBQzdGLFdBQVcsRUFBRSwwREFBMEQ7WUFDdkUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTTtZQUN4QyxPQUFPLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzdCLFVBQVUsRUFBRSxHQUFHO1lBQ2YsYUFBYSxFQUFFLENBQUM7WUFDaEIsYUFBYSxFQUFFO2dCQUNiLGdCQUFnQixFQUFFLHNCQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDbkMsZUFBZSxFQUFFLHNCQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzthQUNsQztZQUNELFdBQVcsRUFBRTtnQkFDWCxpQkFBaUIsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWU7YUFDakQ7WUFDRCxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsNEJBQTRCLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLEVBQUU7Z0JBQzFHLFNBQVMsRUFBRSxHQUFHO2dCQUNkLFFBQVEsRUFBRSxNQUFNLENBQUMsd0JBQXdCLENBQUMsSUFBSTthQUMvQyxDQUFDO1lBQ0YsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsOEJBQThCLEVBQUU7Z0JBQ3ZELFdBQVcsRUFBRSxnREFBZ0Q7Z0JBQzdELFNBQVMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQztnQkFDM0QsZUFBZSxFQUFFO29CQUNmLEdBQUcsQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsMENBQTBDLENBQUM7b0JBQ3RGLEdBQUcsQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsdURBQXVELENBQUM7aUJBQ3BHO2FBQ0YsQ0FBQztZQUNGLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGtDQUFrQyxFQUFFO2dCQUNwRSxTQUFTLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZO2dCQUMxQyxhQUFhLEVBQUUsMkJBQWEsQ0FBQyxPQUFPO2FBQ3JDLENBQUM7WUFDRixhQUFhLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJO1lBQ3hDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSTtZQUM1QyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsbUJBQW1CLENBQUMsSUFBSTtTQUN2RCxDQUFDLENBQUM7UUFDSCx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDO1lBQzlELEdBQUcsRUFBRSxjQUFjO1lBQ25CLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUs7WUFDeEIsT0FBTyxFQUFFO2dCQUNQLGtCQUFrQjthQUNuQjtZQUNELFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQztTQUNqQixDQUFDLENBQUMsQ0FBQztRQUNKLG1DQUFtQztRQUNuQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDO1lBQzlELEdBQUcsRUFBRSxtQkFBbUI7WUFDeEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSztZQUN4QixPQUFPLEVBQUU7Z0JBQ1AsdUJBQXVCO2dCQUN2QixvQkFBb0I7Z0JBQ3BCLG1CQUFtQjthQUNwQjtZQUNELFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQztTQUNqQixDQUFDLENBQUMsQ0FBQztRQUNKLHdDQUF3QztRQUN4QyxXQUFXLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFFL0MscUZBQXFGO1FBQ3JGLE1BQU0sNEJBQTRCLEdBQUcsdUJBQXVCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTlFLDJFQUEyRTtRQUMzRSxNQUFNLGVBQWUsR0FBWSxDQUFDLEdBQUcsRUFBRTtZQUNyQyxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ25FLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztRQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFTCx5RkFBeUY7UUFDekYsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxzQkFBc0IsRUFBRTtZQUNuRCxXQUFXLEVBQUUsd0JBQXdCO1lBQ3JDLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLFFBQVEsRUFBRSxTQUFTLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDO2dCQUMxQyxNQUFNLEVBQUUsS0FBSyxDQUFDLGFBQWEsRUFBRSxNQUFNLElBQUksSUFBSTtnQkFDM0MsSUFBSSxFQUFFLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxJQUFJLEdBQUc7Z0JBQ3RDLE9BQU8sRUFBRSxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksSUFBSSxTQUFTO2dCQUMvQyxRQUFRLEVBQUUsS0FBSyxDQUFDLGFBQWEsRUFBRSxRQUFRLElBQUksc0JBQVEsQ0FBQyxPQUFPO2FBQzVELENBQUM7WUFDRixNQUFNLEVBQUUsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLDRCQUE0QixFQUFFO2dCQUM3RCxLQUFLLEVBQUUsU0FBUyxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQztvQkFDOUMsTUFBTSxFQUFFO3dCQUNOLE1BQU0sRUFBRSxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU07d0JBQ25DLFNBQVMsRUFBRSxLQUFLLENBQUMsY0FBYyxDQUFDLFNBQVM7d0JBQ3pDLElBQUksRUFBRSxPQUFPO3FCQUNkO2lCQUNGLENBQUM7YUFDSCxDQUFDO1NBQ0gsQ0FBQyxDQUFDO1FBRUgsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxxQkFBcUIsRUFBRTtZQUNsRCxXQUFXLEVBQUUsdUJBQXVCO1lBQ3BDLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLFFBQVEsRUFBRSxTQUFTLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDO2dCQUMxQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFlBQVksRUFBRSxNQUFNLElBQUksR0FBRztnQkFDekMsSUFBSSxFQUFFLEtBQUssQ0FBQyxZQUFZLEVBQUUsSUFBSSxJQUFJLElBQUk7Z0JBQ3RDLE9BQU8sRUFBRSxLQUFLLENBQUMsWUFBWSxFQUFFLElBQUksSUFBSSxTQUFTO2dCQUM5QyxRQUFRLEVBQUUsS0FBSyxDQUFDLFlBQVksRUFBRSxRQUFRLElBQUksc0JBQVEsQ0FBQyxPQUFPO2FBQzNELENBQUM7WUFDRixNQUFNLEVBQUUsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLDRCQUE0QixFQUFFO2dCQUM3RCxLQUFLLEVBQUUsU0FBUyxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQztvQkFDOUMsTUFBTSxFQUFFO3dCQUNOLE1BQU0sRUFBRSxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU07d0JBQ25DLFNBQVMsRUFBRSxLQUFLLENBQUMsY0FBYyxDQUFDLFNBQVM7d0JBQ3pDLElBQUksRUFBRSxNQUFNO3FCQUNiO2lCQUNGLENBQUM7YUFDSCxDQUFDO1NBQ0gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUExSEgsa0VBMkhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRHVyYXRpb24sIFJlbW92YWxQb2xpY3ksIFRpbWVab25lIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0ICogYXMgbG9ncyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbG9ncyc7XG5pbXBvcnQgKiBhcyBzY2hlZHVsZXIgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNjaGVkdWxlcic7XG5pbXBvcnQgKiBhcyB0YXJnZXRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zY2hlZHVsZXItdGFyZ2V0cyc7XG5pbXBvcnQgeyBTZWNyZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXInO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBSdW5uaW5nU2NoZWR1bGVyRnVuY3Rpb24gfSBmcm9tICcuLi9mdW5jcy9ydW5uaW5nLXNjaGVkdWxlci1mdW5jdGlvbic7XG5cbi8qKlxuICogQ3Jvbi1zdHlsZSBzY2hlZHVsZSBjb25maWd1cmF0aW9uIGZvciBzdGFydC9zdG9wIGFjdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZWR1bGUge1xuICAvKiogVGltZSB6b25lIGZvciB0aGUgc2NoZWR1bGUgKGUuZy4gRVRDX1VUQykuICovXG4gIHJlYWRvbmx5IHRpbWV6b25lOiBUaW1lWm9uZTtcbiAgLyoqIENyb24gbWludXRlICgw4oCTNTkpLiAqL1xuICByZWFkb25seSBtaW51dGU/OiBzdHJpbmc7XG4gIC8qKiBDcm9uIGhvdXIgKDDigJMyMykuICovXG4gIHJlYWRvbmx5IGhvdXI/OiBzdHJpbmc7XG4gIC8qKiBDcm9uIGRheSBvZiB3ZWVrIChlLmcuIE1PTi1GUkkpLiAqL1xuICByZWFkb25seSB3ZWVrPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIERlZmluZXMgd2hpY2ggRUMyIGluc3RhbmNlcyBhcmUgdGFyZ2V0ZWQgYnkgdGFnIGtleSBhbmQgdmFsdWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhcmdldFJlc291cmNlIHtcbiAgLyoqIFRhZyBrZXkgdXNlZCB0byBzZWxlY3QgaW5zdGFuY2VzIChlLmcuIFNjaGVkdWxlKS4gKi9cbiAgcmVhZG9ubHkgdGFnS2V5OiBzdHJpbmc7XG4gIC8qKiBUYWcgdmFsdWVzIHRoYXQgbWF0Y2ggaW5zdGFuY2VzIHRvIGluY2x1ZGUuICovXG4gIHJlYWRvbmx5IHRhZ1ZhbHVlczogc3RyaW5nW107XG59XG5cbi8qKlxuICogU2VjcmV0IGlkZW50aWZpZXJzIHJlcXVpcmVkIGJ5IHRoZSBzY2hlZHVsZXIgKGUuZy4gU2xhY2spLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlY3JldHMge1xuICAvKiogTmFtZSBvZiB0aGUgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCBjb250YWluaW5nIFNsYWNrIHRva2VuIGFuZCBjaGFubmVsLiAqL1xuICByZWFkb25seSBzbGFja1NlY3JldE5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBjcmVhdGluZyBhbiBFQzIgaW5zdGFuY2UgcnVubmluZyBzY2hlZHVsZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVyUHJvcHMge1xuICAvKiogVGFnLWJhc2VkIHRhcmdldGluZyBmb3IgRUMyIGluc3RhbmNlcyB0byBzdGFydC9zdG9wLiAqL1xuICByZWFkb25seSB0YXJnZXRSZXNvdXJjZTogVGFyZ2V0UmVzb3VyY2U7XG4gIC8qKiBXaGV0aGVyIEV2ZW50QnJpZGdlIFNjaGVkdWxlciBydWxlcyBhcmUgZW5hYmxlZC4gRGVmYXVsdHMgdG8gdHJ1ZSBpZiBvbWl0dGVkLiAqL1xuICByZWFkb25seSBlbmFibGVTY2hlZHVsaW5nPzogYm9vbGVhbjtcbiAgLyoqIFNlY3JldHMgKGUuZy4gU2xhY2spIHVzZWQgZm9yIG5vdGlmaWNhdGlvbnMuICovXG4gIHJlYWRvbmx5IHNlY3JldHM6IFNlY3JldHM7XG4gIC8qKiBDcm9uIHNjaGVkdWxlIGZvciBzdG9wcGluZyBpbnN0YW5jZXMuICovXG4gIHJlYWRvbmx5IHN0b3BTY2hlZHVsZT86IFNjaGVkdWxlO1xuICAvKiogQ3JvbiBzY2hlZHVsZSBmb3Igc3RhcnRpbmcgaW5zdGFuY2VzLiAqL1xuICByZWFkb25seSBzdGFydFNjaGVkdWxlPzogU2NoZWR1bGU7XG59XG5cbi8qKlxuICogQ29uc3RydWN0IHRoYXQgc2NoZWR1bGVzIEVDMiBpbnN0YW5jZSBzdGFydC9zdG9wIHZpYSBFdmVudEJyaWRnZSBTY2hlZHVsZXIgYW5kIGEgRHVyYWJsZSBMYW1iZGEuXG4gKi9cbmV4cG9ydCBjbGFzcyBFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZXIgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogQ3JlYXRlcyBhbiBFQzIgaW5zdGFuY2UgcnVubmluZyBzY2hlZHVsZXIgd2l0aCBzdGFydC9zdG9wIHNjaGVkdWxlcyBhbmQgYSBEdXJhYmxlIExhbWJkYS5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIC0gUGFyZW50IGNvbnN0cnVjdC5cbiAgICogQHBhcmFtIGlkIC0gQ29uc3RydWN0IGlkLlxuICAgKiBAcGFyYW0gcHJvcHMgLSBTY2hlZHVsZXIgY29uZmlndXJhdGlvbiAodGFyZ2V0IHJlc291cmNlLCBzY2hlZHVsZXMsIHNlY3JldHMpLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEVDMkluc3RhbmNlUnVubmluZ1NjaGVkdWxlclByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IHNsYWNrU2VjcmV0ID0gU2VjcmV0LmZyb21TZWNyZXROYW1lVjIodGhpcywgJ1NsYWNrU2VjcmV0JywgcHJvcHMuc2VjcmV0cy5zbGFja1NlY3JldE5hbWUpO1xuXG4gICAgLy8gRHVyYWJsZSBGdW5jdGlvbnMtYmFzZWQgUnVubmluZyBTY2hlZHVsZXIgKHByZXZpb3VzIFN0ZXAgRnVuY3Rpb25zIGxvZ2ljIGltcGxlbWVudGVkIGluIExhbWJkYSkuXG4gICAgLy8gRHVyYWJsZSBFeGVjdXRpb24gcmVxdWlyZXMgTm9kZS5qcyAyMisuXG4gICAgY29uc3QgcnVubmluZ1NjaGVkdWxlRnVuY3Rpb24gPSBuZXcgUnVubmluZ1NjaGVkdWxlckZ1bmN0aW9uKHRoaXMsICdSdW5uaW5nU2NoZWR1bGVyRnVuY3Rpb24nLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0EgZnVuY3Rpb24gdG8gcnVuIHRoZSBzY2hlZHVsZWQgUkRTIERhdGFiYXNlIG9yIENsdXN0ZXIuJyxcbiAgICAgIGFyY2hpdGVjdHVyZTogbGFtYmRhLkFyY2hpdGVjdHVyZS5BUk1fNjQsXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDE1KSxcbiAgICAgIG1lbW9yeVNpemU6IDUxMixcbiAgICAgIHJldHJ5QXR0ZW1wdHM6IDIsXG4gICAgICBkdXJhYmxlQ29uZmlnOiB7XG4gICAgICAgIGV4ZWN1dGlvblRpbWVvdXQ6IER1cmF0aW9uLmhvdXJzKDIpLFxuICAgICAgICByZXRlbnRpb25QZXJpb2Q6IER1cmF0aW9uLmRheXMoMSksXG4gICAgICB9LFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgU0xBQ0tfU0VDUkVUX05BTUU6IHByb3BzLnNlY3JldHMuc2xhY2tTZWNyZXROYW1lLFxuICAgICAgfSxcbiAgICAgIHBhcmFtc0FuZFNlY3JldHM6IGxhbWJkYS5QYXJhbXNBbmRTZWNyZXRzTGF5ZXJWZXJzaW9uLmZyb21WZXJzaW9uKGxhbWJkYS5QYXJhbXNBbmRTZWNyZXRzVmVyc2lvbnMuVjFfMF8xMDMsIHtcbiAgICAgICAgY2FjaGVTaXplOiA1MDAsXG4gICAgICAgIGxvZ0xldmVsOiBsYW1iZGEuUGFyYW1zQW5kU2VjcmV0c0xvZ0xldmVsLklORk8sXG4gICAgICB9KSxcbiAgICAgIHJvbGU6IG5ldyBpYW0uUm9sZSh0aGlzLCAnUnVubmluZ1NjaGVkdWxlckZ1bmN0aW9uUm9sZScsIHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdBIHJvbGUgdG8gY29udHJvbCB0aGUgUkRTIERhdGFiYXNlIG9yIENsdXN0ZXIuJyxcbiAgICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2xhbWJkYS5hbWF6b25hd3MuY29tJyksXG4gICAgICAgIG1hbmFnZWRQb2xpY2llczogW1xuICAgICAgICAgIGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnc2VydmljZS1yb2xlL0FXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZScpLFxuICAgICAgICAgIGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnc2VydmljZS1yb2xlL0FXU0xhbWJkYUJhc2ljRHVyYWJsZUV4ZWN1dGlvblJvbGVQb2xpY3knKSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICAgbG9nR3JvdXA6IG5ldyBsb2dzLkxvZ0dyb3VwKHRoaXMsICdSdW5uaW5nU2NoZWR1bGVyRnVuY3Rpb25Mb2dHcm91cCcsIHtcbiAgICAgICAgcmV0ZW50aW9uOiBsb2dzLlJldGVudGlvbkRheXMuVEhSRUVfTU9OVEhTLFxuICAgICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICB9KSxcbiAgICAgIGxvZ2dpbmdGb3JtYXQ6IGxhbWJkYS5Mb2dnaW5nRm9ybWF0LkpTT04sXG4gICAgICBzeXN0ZW1Mb2dMZXZlbFYyOiBsYW1iZGEuU3lzdGVtTG9nTGV2ZWwuSU5GTyxcbiAgICAgIGFwcGxpY2F0aW9uTG9nTGV2ZWxWMjogbGFtYmRhLkFwcGxpY2F0aW9uTG9nTGV2ZWwuSU5GTyxcbiAgICB9KTtcbiAgICBydW5uaW5nU2NoZWR1bGVGdW5jdGlvbi5hZGRUb1JvbGVQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgc2lkOiAnR2V0UmVzb3VyY2VzJyxcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgJ3RhZzpHZXRSZXNvdXJjZXMnLFxuICAgICAgXSxcbiAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgfSkpO1xuICAgIC8vIEdyYW50IHJlYWQgYWNjZXNzIHRvIHRoZSBSRFMgQVBJXG4gICAgcnVubmluZ1NjaGVkdWxlRnVuY3Rpb24uYWRkVG9Sb2xlUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIHNpZDogJ1Jkc1J1bm5pbmdDb250cm9sJyxcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgJ2VjMjpEZXNjcmliZUluc3RhbmNlcycsXG4gICAgICAgICdlYzI6U3RhcnRJbnN0YW5jZXMnLFxuICAgICAgICAnZWMyOlN0b3BJbnN0YW5jZXMnLFxuICAgICAgXSxcbiAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgfSkpO1xuICAgIC8vIEdyYW50IHJlYWQgYWNjZXNzIHRvIHRoZSBTbGFjayBzZWNyZXRcbiAgICBzbGFja1NlY3JldC5ncmFudFJlYWQocnVubmluZ1NjaGVkdWxlRnVuY3Rpb24pO1xuXG4gICAgLy8gU2VlOiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFtYmRhL2xhdGVzdC9kZy9kdXJhYmxlLWdldHRpbmctc3RhcnRlZC1pYWMuaHRtbFxuICAgIGNvbnN0IHJ1bm5pbmdTY2hlZHVsZUZ1bmN0aW9uQWxpYXMgPSBydW5uaW5nU2NoZWR1bGVGdW5jdGlvbi5hZGRBbGlhcygnbGl2ZScpO1xuXG4gICAgLy8gV2hldGhlciBzY2hlZHVsZXMgYXJlIGVuYWJsZWQgKGRlZmF1bHQgdHJ1ZSB1bmxlc3MgZXhwbGljaXRseSBkaXNhYmxlZCkuXG4gICAgY29uc3Qgc2NoZWR1bGVFbmFibGVkOiBib29sZWFuID0gKCgpID0+IHtcbiAgICAgIGlmIChwcm9wcy5lbmFibGVTY2hlZHVsaW5nID09PSB1bmRlZmluZWQgfHwgcHJvcHMuZW5hYmxlU2NoZWR1bGluZykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KSgpO1xuXG4gICAgLy8gRHVyYWJsZSBGdW5jdGlvbnM6IExhbWJkYSBwZXJmb3JtcyB0YWcgbG9va3VwIGFuZCBpbnN0YW5jZSBzdGFydC9zdG9wIGluIGEgc2luZ2xlIHJ1bi5cbiAgICBuZXcgc2NoZWR1bGVyLlNjaGVkdWxlKHRoaXMsICdSdW5uaW5nU3RhcnRTY2hlZHVsZScsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAncnVubmluZyBzdGFydCBzY2hlZHVsZScsXG4gICAgICBlbmFibGVkOiBzY2hlZHVsZUVuYWJsZWQsXG4gICAgICBzY2hlZHVsZTogc2NoZWR1bGVyLlNjaGVkdWxlRXhwcmVzc2lvbi5jcm9uKHtcbiAgICAgICAgbWludXRlOiBwcm9wcy5zdGFydFNjaGVkdWxlPy5taW51dGUgPz8gJzUwJyxcbiAgICAgICAgaG91cjogcHJvcHMuc3RhcnRTY2hlZHVsZT8uaG91ciA/PyAnNycsXG4gICAgICAgIHdlZWtEYXk6IHByb3BzLnN0YXJ0U2NoZWR1bGU/LndlZWsgPz8gJ01PTi1GUkknLFxuICAgICAgICB0aW1lWm9uZTogcHJvcHMuc3RhcnRTY2hlZHVsZT8udGltZXpvbmUgPz8gVGltZVpvbmUuRVRDX1VUQyxcbiAgICAgIH0pLFxuICAgICAgdGFyZ2V0OiBuZXcgdGFyZ2V0cy5MYW1iZGFJbnZva2UocnVubmluZ1NjaGVkdWxlRnVuY3Rpb25BbGlhcywge1xuICAgICAgICBpbnB1dDogc2NoZWR1bGVyLlNjaGVkdWxlVGFyZ2V0SW5wdXQuZnJvbU9iamVjdCh7XG4gICAgICAgICAgUGFyYW1zOiB7XG4gICAgICAgICAgICBUYWdLZXk6IHByb3BzLnRhcmdldFJlc291cmNlLnRhZ0tleSxcbiAgICAgICAgICAgIFRhZ1ZhbHVlczogcHJvcHMudGFyZ2V0UmVzb3VyY2UudGFnVmFsdWVzLFxuICAgICAgICAgICAgTW9kZTogJ1N0YXJ0JyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgbmV3IHNjaGVkdWxlci5TY2hlZHVsZSh0aGlzLCAnUnVubmluZ1N0b3BTY2hlZHVsZScsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAncnVubmluZyBzdG9wIHNjaGVkdWxlJyxcbiAgICAgIGVuYWJsZWQ6IHNjaGVkdWxlRW5hYmxlZCxcbiAgICAgIHNjaGVkdWxlOiBzY2hlZHVsZXIuU2NoZWR1bGVFeHByZXNzaW9uLmNyb24oe1xuICAgICAgICBtaW51dGU6IHByb3BzLnN0b3BTY2hlZHVsZT8ubWludXRlID8/ICc1JyxcbiAgICAgICAgaG91cjogcHJvcHMuc3RvcFNjaGVkdWxlPy5ob3VyID8/ICcxOScsXG4gICAgICAgIHdlZWtEYXk6IHByb3BzLnN0b3BTY2hlZHVsZT8ud2VlayA/PyAnTU9OLUZSSScsXG4gICAgICAgIHRpbWVab25lOiBwcm9wcy5zdG9wU2NoZWR1bGU/LnRpbWV6b25lID8/IFRpbWVab25lLkVUQ19VVEMsXG4gICAgICB9KSxcbiAgICAgIHRhcmdldDogbmV3IHRhcmdldHMuTGFtYmRhSW52b2tlKHJ1bm5pbmdTY2hlZHVsZUZ1bmN0aW9uQWxpYXMsIHtcbiAgICAgICAgaW5wdXQ6IHNjaGVkdWxlci5TY2hlZHVsZVRhcmdldElucHV0LmZyb21PYmplY3Qoe1xuICAgICAgICAgIFBhcmFtczoge1xuICAgICAgICAgICAgVGFnS2V5OiBwcm9wcy50YXJnZXRSZXNvdXJjZS50YWdLZXksXG4gICAgICAgICAgICBUYWdWYWx1ZXM6IHByb3BzLnRhcmdldFJlc291cmNlLnRhZ1ZhbHVlcyxcbiAgICAgICAgICAgIE1vZGU6ICdTdG9wJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as lambda from 'aws-cdk-lib/aws-lambda';
|
|
2
|
+
import { Construct } from 'constructs';
|
|
3
|
+
/**
|
|
4
|
+
* Props for RunningSchedulerFunction
|
|
5
|
+
*/
|
|
6
|
+
export interface RunningSchedulerFunctionProps extends lambda.FunctionOptions {
|
|
7
|
+
/**
|
|
8
|
+
* The Lambda runtime to use.
|
|
9
|
+
* @default - Latest Node.js runtime available in the deployment region
|
|
10
|
+
*/
|
|
11
|
+
readonly runtime?: lambda.Runtime;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* An AWS Lambda function which executes src/funcs/running-scheduler.
|
|
15
|
+
*/
|
|
16
|
+
export declare class RunningSchedulerFunction extends lambda.Function {
|
|
17
|
+
constructor(scope: Construct, id: string, props?: RunningSchedulerFunctionProps);
|
|
18
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RunningSchedulerFunction = void 0;
|
|
4
|
+
// ~~ Generated by projen. To modify, edit .projenrc.ts and run "npx projen".
|
|
5
|
+
const path = require("path");
|
|
6
|
+
const lambda = require("aws-cdk-lib/aws-lambda");
|
|
7
|
+
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
|
|
8
|
+
/**
|
|
9
|
+
* An AWS Lambda function which executes src/funcs/running-scheduler.
|
|
10
|
+
*/
|
|
11
|
+
class RunningSchedulerFunction extends lambda.Function {
|
|
12
|
+
constructor(scope, id, props) {
|
|
13
|
+
super(scope, id, {
|
|
14
|
+
description: 'src/funcs/running-scheduler.lambda.ts',
|
|
15
|
+
...props,
|
|
16
|
+
runtime: props?.runtime ?? (0, aws_lambda_1.determineLatestNodeRuntime)(scope),
|
|
17
|
+
handler: 'index.handler',
|
|
18
|
+
code: lambda.Code.fromAsset(path.join(__dirname, '../../assets/funcs/running-scheduler.lambda')),
|
|
19
|
+
});
|
|
20
|
+
this.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true });
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.RunningSchedulerFunction = RunningSchedulerFunction;
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmluZy1zY2hlZHVsZXItZnVuY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZnVuY3MvcnVubmluZy1zY2hlZHVsZXItZnVuY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkVBQTZFO0FBQzdFLDZCQUE2QjtBQUM3QixpREFBaUQ7QUFDakQsdURBQW9FO0FBY3BFOztHQUVHO0FBQ0gsTUFBYSx3QkFBeUIsU0FBUSxNQUFNLENBQUMsUUFBUTtJQUMzRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXFDO1FBQzdFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsV0FBVyxFQUFFLHVDQUF1QztZQUNwRCxHQUFHLEtBQUs7WUFDUixPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sSUFBSSxJQUFBLHVDQUEwQixFQUFDLEtBQUssQ0FBQztZQUM1RCxPQUFPLEVBQUUsZUFBZTtZQUN4QixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsNkNBQTZDLENBQUMsQ0FBQztTQUNqRyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsY0FBYyxDQUFDLHFDQUFxQyxFQUFFLEdBQUcsRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzFGLENBQUM7Q0FDRjtBQVhELDREQVdDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gfn4gR2VuZXJhdGVkIGJ5IHByb2plbi4gVG8gbW9kaWZ5LCBlZGl0IC5wcm9qZW5yYy50cyBhbmQgcnVuIFwibnB4IHByb2plblwiLlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IGRldGVybWluZUxhdGVzdE5vZGVSdW50aW1lIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuLyoqXG4gKiBQcm9wcyBmb3IgUnVubmluZ1NjaGVkdWxlckZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVubmluZ1NjaGVkdWxlckZ1bmN0aW9uUHJvcHMgZXh0ZW5kcyBsYW1iZGEuRnVuY3Rpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBMYW1iZGEgcnVudGltZSB0byB1c2UuXG4gICAqIEBkZWZhdWx0IC0gTGF0ZXN0IE5vZGUuanMgcnVudGltZSBhdmFpbGFibGUgaW4gdGhlIGRlcGxveW1lbnQgcmVnaW9uXG4gICAqL1xuICByZWFkb25seSBydW50aW1lPzogbGFtYmRhLlJ1bnRpbWU7XG59XG5cbi8qKlxuICogQW4gQVdTIExhbWJkYSBmdW5jdGlvbiB3aGljaCBleGVjdXRlcyBzcmMvZnVuY3MvcnVubmluZy1zY2hlZHVsZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW5uaW5nU2NoZWR1bGVyRnVuY3Rpb24gZXh0ZW5kcyBsYW1iZGEuRnVuY3Rpb24ge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wcz86IFJ1bm5pbmdTY2hlZHVsZXJGdW5jdGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ3NyYy9mdW5jcy9ydW5uaW5nLXNjaGVkdWxlci5sYW1iZGEudHMnLFxuICAgICAgLi4ucHJvcHMsXG4gICAgICBydW50aW1lOiBwcm9wcz8ucnVudGltZSA/PyBkZXRlcm1pbmVMYXRlc3ROb2RlUnVudGltZShzY29wZSksXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL2Fzc2V0cy9mdW5jcy9ydW5uaW5nLXNjaGVkdWxlci5sYW1iZGEnKSksXG4gICAgfSk7XG4gICAgdGhpcy5hZGRFbnZpcm9ubWVudCgnQVdTX05PREVKU19DT05ORUNUSU9OX1JFVVNFX0VOQUJMRUQnLCAnMScsIHsgcmVtb3ZlSW5FZGdlOiB0cnVlIH0pO1xuICB9XG59Il19
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EC2 Running Scheduler – Durable Functions implementation.
|
|
3
|
+
*
|
|
4
|
+
* Implements the running-control flow using AWS Lambda Durable Execution.
|
|
5
|
+
* Step checkpoints, wait (no charge), and parallel map provide a flow equivalent to Step Functions.
|
|
6
|
+
*
|
|
7
|
+
* @see https://docs.aws.amazon.com/lambda/latest/dg/durable-execution-sdk.html
|
|
8
|
+
*/
|
|
9
|
+
/** Event payload from EventBridge Scheduler invoking this Lambda. */
|
|
10
|
+
export interface SchedulerEvent {
|
|
11
|
+
Params: {
|
|
12
|
+
/** Tag key used to select EC2 instances. */
|
|
13
|
+
TagKey: string;
|
|
14
|
+
/** Tag values to match. */
|
|
15
|
+
TagValues: string[];
|
|
16
|
+
/** Whether to start or stop instances. */
|
|
17
|
+
Mode: 'Start' | 'Stop';
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Durable Lambda handler for the EC2 running scheduler.
|
|
22
|
+
* Fetches target resources by tag, starts or stops instances per Mode, and posts results to Slack.
|
|
23
|
+
*
|
|
24
|
+
* @param event - SchedulerEvent with Params.TagKey, Params.TagValues, Params.Mode.
|
|
25
|
+
* @param context - Durable execution context.
|
|
26
|
+
* @returns Status and list of processed resources, or TargetResourcesNotFound if none match.
|
|
27
|
+
*/
|
|
28
|
+
export declare const handler: import("@aws/durable-execution-sdk-js").DurableLambdaHandler;
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* EC2 Running Scheduler – Durable Functions implementation.
|
|
4
|
+
*
|
|
5
|
+
* Implements the running-control flow using AWS Lambda Durable Execution.
|
|
6
|
+
* Step checkpoints, wait (no charge), and parallel map provide a flow equivalent to Step Functions.
|
|
7
|
+
*
|
|
8
|
+
* @see https://docs.aws.amazon.com/lambda/latest/dg/durable-execution-sdk.html
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.handler = void 0;
|
|
12
|
+
const durable_execution_sdk_js_1 = require("@aws/durable-execution-sdk-js");
|
|
13
|
+
const client_ec2_1 = require("@aws-sdk/client-ec2");
|
|
14
|
+
const client_resource_groups_tagging_api_1 = require("@aws-sdk/client-resource-groups-tagging-api");
|
|
15
|
+
const web_api_1 = require("@slack/web-api");
|
|
16
|
+
const aws_lambda_secret_fetcher_1 = require("aws-lambda-secret-fetcher");
|
|
17
|
+
/** Mapping of EC2 instance state to display name and emoji for Slack. */
|
|
18
|
+
const STATE_LIST = [
|
|
19
|
+
{ name: 'RUNNING', emoji: '😆', state: 'running' },
|
|
20
|
+
{ name: 'STOPPED', emoji: '😴', state: 'stopped' },
|
|
21
|
+
];
|
|
22
|
+
/** Seconds to wait between polling instance state after start/stop. */
|
|
23
|
+
const STATUS_CHANGE_WAIT_SECONDS = 20;
|
|
24
|
+
/**
|
|
25
|
+
* Returns display name and emoji for an EC2 instance state.
|
|
26
|
+
*
|
|
27
|
+
* @param current - Current instance state (e.g. 'running', 'stopped').
|
|
28
|
+
* @returns Display info or undefined if state is not in STATE_LIST.
|
|
29
|
+
*/
|
|
30
|
+
const getStateDisplay = (current) => {
|
|
31
|
+
const found = STATE_LIST.find((s) => s.state === current);
|
|
32
|
+
return found ? { emoji: found.emoji, name: found.name } : undefined;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Processes a single EC2 instance: describes state, starts or stops as needed, and polls until stable.
|
|
36
|
+
*
|
|
37
|
+
* @param ctx - Durable execution context for steps and wait.
|
|
38
|
+
* @param targetResource - EC2 instance ARN.
|
|
39
|
+
* @param params - Scheduler params (TagKey, TagValues, Mode).
|
|
40
|
+
* @param resourceIndex - Index of this resource (used for step names).
|
|
41
|
+
* @returns Resource ARN, final status, account, region, and instance id.
|
|
42
|
+
*/
|
|
43
|
+
const processOneResource = async (ctx, targetResource, params, resourceIndex) => {
|
|
44
|
+
const parts = targetResource.split('/');
|
|
45
|
+
const identifier = parts[parts.length - 1] ?? 'unknown';
|
|
46
|
+
const arnParts = targetResource.split(':');
|
|
47
|
+
const account = arnParts[4] ?? '';
|
|
48
|
+
const region = arnParts[3] ?? '';
|
|
49
|
+
const stepPrefix = `resource-${resourceIndex}-${identifier}`;
|
|
50
|
+
let loopCount = 0;
|
|
51
|
+
for (;;) {
|
|
52
|
+
const currentState = await ctx.step(`${stepPrefix}-describe-${loopCount}`, async () => {
|
|
53
|
+
const ec2 = new client_ec2_1.EC2Client({});
|
|
54
|
+
const out = await ec2.send(new client_ec2_1.DescribeInstancesCommand({ InstanceIds: [identifier] }));
|
|
55
|
+
return out.Reservations?.[0]?.Instances?.[0]?.State?.Name ?? 'unknown';
|
|
56
|
+
});
|
|
57
|
+
const mode = params.Mode;
|
|
58
|
+
if (mode === 'Start' && currentState === 'stopped') {
|
|
59
|
+
await ctx.step(`${stepPrefix}-start-${loopCount}`, async () => {
|
|
60
|
+
const ec2 = new client_ec2_1.EC2Client({});
|
|
61
|
+
await ec2.send(new client_ec2_1.StartInstancesCommand({ InstanceIds: [identifier] }));
|
|
62
|
+
});
|
|
63
|
+
await ctx.wait({ seconds: STATUS_CHANGE_WAIT_SECONDS });
|
|
64
|
+
loopCount += 1;
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (mode === 'Stop' && (currentState === 'running')) {
|
|
68
|
+
await ctx.step(`${stepPrefix}-stop-${loopCount}`, async () => {
|
|
69
|
+
const ec2 = new client_ec2_1.EC2Client({});
|
|
70
|
+
await ec2.send(new client_ec2_1.StopInstancesCommand({ InstanceIds: [identifier] }));
|
|
71
|
+
});
|
|
72
|
+
await ctx.wait({ seconds: STATUS_CHANGE_WAIT_SECONDS });
|
|
73
|
+
loopCount += 1;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if ((mode === 'Start' && currentState === 'running') ||
|
|
77
|
+
(mode === 'Stop' && currentState === 'stopped')) {
|
|
78
|
+
return {
|
|
79
|
+
identifier,
|
|
80
|
+
account,
|
|
81
|
+
region,
|
|
82
|
+
resource: targetResource,
|
|
83
|
+
status: currentState,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
const transitioning = (mode === 'Start' && currentState === 'pending') ||
|
|
87
|
+
(mode === 'Stop' && (currentState === 'stopping' || currentState === 'shutting-down'));
|
|
88
|
+
if (transitioning) {
|
|
89
|
+
await ctx.wait({ seconds: STATUS_CHANGE_WAIT_SECONDS });
|
|
90
|
+
loopCount += 1;
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
throw new Error(`instance status fail: mode=${mode} currentState=${currentState}`);
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* Durable Lambda handler for the EC2 running scheduler.
|
|
98
|
+
* Fetches target resources by tag, starts or stops instances per Mode, and posts results to Slack.
|
|
99
|
+
*
|
|
100
|
+
* @param event - SchedulerEvent with Params.TagKey, Params.TagValues, Params.Mode.
|
|
101
|
+
* @param context - Durable execution context.
|
|
102
|
+
* @returns Status and list of processed resources, or TargetResourcesNotFound if none match.
|
|
103
|
+
*/
|
|
104
|
+
exports.handler = (0, durable_execution_sdk_js_1.withDurableExecution)(async (event, context) => {
|
|
105
|
+
const params = event.Params;
|
|
106
|
+
if (!params?.TagKey || !params?.TagValues || !params?.Mode) {
|
|
107
|
+
throw new Error('Invalid event: Params.TagKey, Params.TagValues, Params.Mode are required.');
|
|
108
|
+
}
|
|
109
|
+
const slackSecretName = process.env.SLACK_SECRET_NAME;
|
|
110
|
+
if (!slackSecretName) {
|
|
111
|
+
throw new Error('missing environment variable SLACK_SECRET_NAME.');
|
|
112
|
+
}
|
|
113
|
+
const slackSecretValue = await context.step('fetch-slack-secret', async () => {
|
|
114
|
+
return aws_lambda_secret_fetcher_1.secretFetcher.getSecretValue(slackSecretName);
|
|
115
|
+
});
|
|
116
|
+
if (!slackSecretValue?.token || !slackSecretValue?.channel) {
|
|
117
|
+
throw new Error('Slack secret must contain token and channel.');
|
|
118
|
+
}
|
|
119
|
+
const targetResources = await context.step('get-target-resources', async () => {
|
|
120
|
+
const client = new client_resource_groups_tagging_api_1.ResourceGroupsTaggingAPIClient({});
|
|
121
|
+
const result = await client.send(new client_resource_groups_tagging_api_1.GetResourcesCommand({
|
|
122
|
+
ResourceTypeFilters: ['ec2:instance'],
|
|
123
|
+
TagFilters: [{ Key: params.TagKey, Values: params.TagValues }],
|
|
124
|
+
}));
|
|
125
|
+
return (result.ResourceTagMappingList ?? [])
|
|
126
|
+
.map((m) => m.ResourceARN)
|
|
127
|
+
.filter((arn) => arn != null);
|
|
128
|
+
});
|
|
129
|
+
if (targetResources.length === 0) {
|
|
130
|
+
return { status: 'TargetResourcesNotFound' };
|
|
131
|
+
}
|
|
132
|
+
const client = new web_api_1.WebClient(slackSecretValue.token);
|
|
133
|
+
const channel = slackSecretValue.channel;
|
|
134
|
+
// send slack message
|
|
135
|
+
const slackParentMessageResult = await context.step('post-slack-messages', async () => {
|
|
136
|
+
return client.chat.postMessage({
|
|
137
|
+
channel,
|
|
138
|
+
text: `${params.Mode === 'Start' ? '😆 Starts' : '🥱 Stops'} the scheduled EC2 Instance.`,
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
const results = await context.map(targetResources,
|
|
142
|
+
// async (ctx: DurableContext, targetResource: string, index: number) =>
|
|
143
|
+
// ctx.step(`process-resource-${index}`, async () =>
|
|
144
|
+
// processOneResource(ctx, targetResource, params, index),
|
|
145
|
+
// ),
|
|
146
|
+
async (ctx, targetResource, index) => {
|
|
147
|
+
return ctx.runInChildContext(`resource-${index}`, async (childCtx) => {
|
|
148
|
+
const result = await processOneResource(childCtx, targetResource, params, index);
|
|
149
|
+
// if (result.status === 'skipped') {
|
|
150
|
+
// return result;
|
|
151
|
+
// }
|
|
152
|
+
// send slack thread message
|
|
153
|
+
await childCtx.step('post-slack-child-messages', async () => {
|
|
154
|
+
const display = getStateDisplay(result.status);
|
|
155
|
+
return client.chat.postMessage({
|
|
156
|
+
channel,
|
|
157
|
+
thread_ts: slackParentMessageResult?.ts,
|
|
158
|
+
attachments: [
|
|
159
|
+
{
|
|
160
|
+
color: '#36a64f',
|
|
161
|
+
pretext: `${display?.emoji} The status of the EC2 Instance ${result.identifier} changed to ${display?.name} due to the schedule.`,
|
|
162
|
+
fields: [
|
|
163
|
+
{ title: 'Account', value: result.account, short: true },
|
|
164
|
+
{ title: 'Region', value: result.region, short: true },
|
|
165
|
+
{ title: 'Identifier', value: result.identifier, short: true },
|
|
166
|
+
{ title: 'Status', value: (display?.name ?? 'Unknown'), short: true },
|
|
167
|
+
],
|
|
168
|
+
},
|
|
169
|
+
],
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
return result;
|
|
173
|
+
});
|
|
174
|
+
}, { maxConcurrency: 10 });
|
|
175
|
+
const resultList = Array.isArray(results) ? results : [];
|
|
176
|
+
return {
|
|
177
|
+
status: 'Completed',
|
|
178
|
+
processed: targetResources.length,
|
|
179
|
+
results: resultList,
|
|
180
|
+
};
|
|
181
|
+
});
|
|
182
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmluZy1zY2hlZHVsZXIubGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Z1bmNzL3J1bm5pbmctc2NoZWR1bGVyLmxhbWJkYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7R0FPRzs7O0FBRUgsNEVBQTBGO0FBQzFGLG9EQUs2QjtBQUM3QixvR0FBa0g7QUFDbEgsNENBQTJDO0FBQzNDLHlFQUEwRDtBQUUxRCx5RUFBeUU7QUFDekUsTUFBTSxVQUFVLEdBQUc7SUFDakIsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtJQUNsRCxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO0NBQzFDLENBQUM7QUFFWCx1RUFBdUU7QUFDdkUsTUFBTSwwQkFBMEIsR0FBRyxFQUFFLENBQUM7QUFvQnRDOzs7OztHQUtHO0FBQ0gsTUFBTSxlQUFlLEdBQUcsQ0FBQyxPQUFlLEVBQStDLEVBQUU7SUFDdkYsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxPQUFPLENBQUMsQ0FBQztJQUMxRCxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDdEUsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLGtCQUFrQixHQUFHLEtBQUssRUFDOUIsR0FBbUIsRUFDbkIsY0FBc0IsRUFDdEIsTUFBZ0MsRUFDaEMsYUFBcUIsRUFDK0UsRUFBRTtJQUN0RyxNQUFNLEtBQUssR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFD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Y3Rpb25zIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEltcGxlbWVudHMgdGhlIHJ1bm5pbmctY29udHJvbCBmbG93IHVzaW5nIEFXUyBMYW1iZGEgRHVyYWJsZSBFeGVjdXRpb24uXG4gKiBTdGVwIGNoZWNrcG9pbnRzLCB3YWl0IChubyBjaGFyZ2UpLCBhbmQgcGFyYWxsZWwgbWFwIHByb3ZpZGUgYSBmbG93IGVxdWl2YWxlbnQgdG8gU3RlcCBGdW5jdGlvbnMuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFtYmRhL2xhdGVzdC9kZy9kdXJhYmxlLWV4ZWN1dGlvbi1zZGsuaHRtbFxuICovXG5cbmltcG9ydCB7IHdpdGhEdXJhYmxlRXhlY3V0aW9uLCB0eXBlIER1cmFibGVDb250ZXh0IH0gZnJvbSAnQGF3cy9kdXJhYmxlLWV4ZWN1dGlvbi1zZGstanMnO1xuaW1wb3J0IHtcbiAgRUMyQ2xpZW50LFxuICBEZXNjcmliZUluc3RhbmNlc0NvbW1hbmQsXG4gIFN0YXJ0SW5zdGFuY2VzQ29tbWFuZCxcbiAgU3RvcEluc3RhbmNlc0NvbW1hbmQsXG59IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1lYzInO1xuaW1wb3J0IHsgR2V0UmVzb3VyY2VzQ29tbWFuZCwgUmVzb3VyY2VHcm91cHNUYWdnaW5nQVBJQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXJlc291cmNlLWdyb3Vwcy10YWdnaW5nLWFwaSc7XG5pbXBvcnQgeyBXZWJDbGllbnQgfSBmcm9tICdAc2xhY2svd2ViLWFwaSc7XG5pbXBvcnQgeyBzZWNyZXRGZXRjaGVyIH0gZnJvbSAnYXdzLWxhbWJkYS1zZWNyZXQtZmV0Y2hlcic7XG5cbi8qKiBNYXBwaW5nIG9mIEVDMiBpbnN0YW5jZSBzdGF0ZSB0byBkaXNwbGF5IG5hbWUgYW5kIGVtb2ppIGZvciBTbGFjay4gKi9cbmNvbnN0IFNUQVRFX0xJU1QgPSBbXG4gIHsgbmFtZTogJ1JVTk5JTkcnLCBlbW9qaTogJ/CfmIYnLCBzdGF0ZTogJ3J1bm5pbmcnIH0sXG4gIHsgbmFtZTogJ1NUT1BQRUQnLCBlbW9qaTogJ/CfmLQnLCBzdGF0ZTogJ3N0b3BwZWQnIH0sXG5dIGFzIGNvbnN0O1xuXG4vKiogU2Vjb25kcyB0byB3YWl0IGJldHdlZW4gcG9sbGluZyBpbnN0YW5jZSBzdGF0ZSBhZnRlciBzdGFydC9zdG9wLiAqL1xuY29uc3QgU1RBVFVTX0NIQU5HRV9XQUlUX1NFQ09ORFMgPSAyMDtcblxuLyoqIEV2ZW50IHBheWxvYWQgZnJvbSBFdmVudEJyaWRnZSBTY2hlZHVsZXIgaW52b2tpbmcgdGhpcyBMYW1iZGEuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVkdWxlckV2ZW50IHtcbiAgUGFyYW1zOiB7XG4gICAgLyoqIFRhZyBrZXkgdXNlZCB0byBzZWxlY3QgRUMyIGluc3RhbmNlcy4gKi9cbiAgICBUYWdLZXk6IHN0cmluZztcbiAgICAvKiogVGFnIHZhbHVlcyB0byBtYXRjaC4gKi9cbiAgICBUYWdWYWx1ZXM6IHN0cmluZ1tdO1xuICAgIC8qKiBXaGV0aGVyIHRvIHN0YXJ0IG9yIHN0b3AgaW5zdGFuY2VzLiAqL1xuICAgIE1vZGU6ICdTdGFydCcgfCAnU3RvcCc7XG4gIH07XG59XG5cbi8qKiBTaGFwZSBvZiB0aGUgU2xhY2sgc2VjcmV0IHN0b3JlZCBpbiBTZWNyZXRzIE1hbmFnZXIuICovXG5pbnRlcmZhY2UgU2xhY2tTZWNyZXQge1xuICB0b2tlbjogc3RyaW5nO1xuICBjaGFubmVsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmV0dXJucyBkaXNwbGF5IG5hbWUgYW5kIGVtb2ppIGZvciBhbiBFQzIgaW5zdGFuY2Ugc3RhdGUuXG4gKlxuICogQHBhcmFtIGN1cnJlbnQgLSBDdXJyZW50IGluc3RhbmNlIHN0YXRlIChlLmcuICdydW5uaW5nJywgJ3N0b3BwZWQnKS5cbiAqIEByZXR1cm5zIERpc3BsYXkgaW5mbyBvciB1bmRlZmluZWQgaWYgc3RhdGUgaXMgbm90IGluIFNUQVRFX0xJU1QuXG4gKi9cbmNvbnN0IGdldFN0YXRlRGlzcGxheSA9IChjdXJyZW50OiBzdHJpbmcpOiB7IGVtb2ppOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9IHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgZm91bmQgPSBTVEFURV9MSVNULmZpbmQoKHMpID0+IHMuc3RhdGUgPT09IGN1cnJlbnQpO1xuICByZXR1cm4gZm91bmQgPyB7IGVtb2ppOiBmb3VuZC5lbW9qaSwgbmFtZTogZm91bmQubmFtZSB9IDogdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBQcm9jZXNzZXMgYSBzaW5nbGUgRUMyIGluc3RhbmNlOiBkZXNjcmliZXMgc3RhdGUsIHN0YXJ0cyBvciBzdG9wcyBhcyBuZWVkZWQsIGFuZCBwb2xscyB1bnRpbCBzdGFibGUuXG4gKlxuICogQHBhcmFtIGN0eCAtIER1cmFibGUgZXhlY3V0aW9uIGNvbnRleHQgZm9yIHN0ZXBzIGFuZCB3YWl0LlxuICogQHBhcmFtIHRhcmdldFJlc291cmNlIC0gRUMyIGluc3RhbmNlIEFSTi5cbiAqIEBwYXJhbSBwYXJhbXMgLSBTY2hlZHVsZXIgcGFyYW1zIChUYWdLZXksIFRhZ1ZhbHVlcywgTW9kZSkuXG4gKiBAcGFyYW0gcmVzb3VyY2VJbmRleCAtIEluZGV4IG9mIHRoaXMgcmVzb3VyY2UgKHVzZWQgZm9yIHN0ZXAgbmFtZXMpLlxuICogQHJldHVybnMgUmVzb3VyY2UgQVJOLCBmaW5hbCBzdGF0dXMsIGFjY291bnQsIHJlZ2lvbiwgYW5kIGluc3RhbmNlIGlkLlxuICovXG5jb25zdCBwcm9jZXNzT25lUmVzb3VyY2UgPSBhc3luYyAoXG4gIGN0eDogRHVyYWJsZUNvbnRleHQsXG4gIHRhcmdldFJlc291cmNlOiBzdHJpbmcsXG4gIHBhcmFtczogU2NoZWR1bGVyRXZlbnRbJ1BhcmFtcyddLFxuICByZXNvdXJjZUluZGV4OiBudW1iZXIsXG4pOiBQcm9taXNlPHsgcmVzb3VyY2U6IHN0cmluZzsgc3RhdHVzOiBzdHJpbmc7IGFjY291bnQ6IHN0cmluZzsgcmVnaW9uOiBzdHJpbmc7IGlkZW50aWZpZXI6IHN0cmluZyB9PiA9PiB7XG4gIGNvbnN0IHBhcnRzID0gdGFyZ2V0UmVzb3VyY2Uuc3BsaXQoJy8nKTtcbiAgY29uc3QgaWRlbnRpZmllciA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdID8/ICd1bmtub3duJztcbiAgY29uc3QgYXJuUGFydHMgPSB0YXJnZXRSZXNvdXJjZS5zcGxpdCgnOicpO1xuICBjb25zdCBhY2NvdW50ID0gYXJuUGFydHNbNF0gPz8gJyc7XG4gIGNvbnN0IHJlZ2lvbiA9IGFyblBhcnRzWzNdID8/ICcnO1xuICBjb25zdCBzdGVwUHJlZml4ID0gYHJlc291cmNlLSR7cmVzb3VyY2VJbmRleH0tJHtpZGVudGlmaWVyfWA7XG5cbiAgbGV0IGxvb3BDb3VudCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICBjb25zdCBjdXJyZW50U3RhdGUgPSBhd2FpdCBjdHguc3RlcChgJHtzdGVwUHJlZml4fS1kZXNjcmliZS0ke2xvb3BDb3VudH1gLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlYzIgPSBuZXcgRUMyQ2xpZW50KHt9KTtcbiAgICAgIGNvbnN0IG91dCA9IGF3YWl0IGVjMi5zZW5kKG5ldyBEZXNjcmliZUluc3RhbmNlc0NvbW1hbmQoeyBJbnN0YW5jZUlkczogW2lkZW50aWZpZXJdIH0pKTtcbiAgICAgIHJldHVybiBvdXQuUmVzZXJ2YXRpb25zPy5bMF0/Lkluc3RhbmNlcz8uWzBdPy5TdGF0ZT8uTmFtZSA/PyAndW5rbm93bic7XG4gICAgfSk7XG5cbiAgICBjb25zdCBtb2RlID0gcGFyYW1zLk1vZGU7XG5cbiAgICBpZiAobW9kZSA9PT0gJ1N0YXJ0JyAmJiBjdXJyZW50U3RhdGUgPT09ICdzdG9wcGVkJykge1xuICAgICAgYXdhaXQgY3R4LnN0ZXAoYCR7c3RlcFByZWZpeH0tc3RhcnQtJHtsb29wQ291bnR9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBlYzIgPSBuZXcgRUMyQ2xpZW50KHt9KTtcbiAgICAgICAgYXdhaXQgZWMyLnNlbmQobmV3IFN0YXJ0SW5zdGFuY2VzQ29tbWFuZCh7IEluc3RhbmNlSWRzOiBbaWRlbnRpZmllcl0gfSkpO1xuICAgICAgfSk7XG4gICAgICBhd2FpdCBjdHgud2FpdCh7IHNlY29uZHM6IFNUQVRVU19DSEFOR0VfV0FJVF9TRUNPTkRTIH0pO1xuICAgICAgbG9vcENvdW50ICs9IDE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobW9kZSA9PT0gJ1N0b3AnICYmIChjdXJyZW50U3RhdGUgPT09ICdydW5uaW5nJykpIHtcbiAgICAgIGF3YWl0IGN0eC5zdGVwKGAke3N0ZXBQcmVmaXh9LXN0b3AtJHtsb29wQ291bnR9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBlYzIgPSBuZXcgRUMyQ2xpZW50KHt9KTtcbiAgICAgICAgYXdhaXQgZWMyLnNlbmQobmV3IFN0b3BJbnN0YW5jZXNDb21tYW5kKHsgSW5zdGFuY2VJZHM6IFtpZGVudGlmaWVyXSB9KSk7XG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGN0eC53YWl0KHsgc2Vjb25kczogU1RBVFVTX0NIQU5HRV9XQUlUX1NFQ09ORFMgfSk7XG4gICAgICBsb29wQ291bnQgKz0gMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChtb2RlID09PSAnU3RhcnQnICYmIGN1cnJlbnRTdGF0ZSA9PT0gJ3J1bm5pbmcnKSB8fFxuICAgICAgKG1vZGUgPT09ICdTdG9wJyAmJiBjdXJyZW50U3RhdGUgPT09ICdzdG9wcGVkJylcbiAgICApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkZW50aWZpZXIsXG4gICAgICAgIGFjY291bnQsXG4gICAgICAgIHJlZ2lvbixcbiAgICAgICAgcmVzb3VyY2U6IHRhcmdldFJlc291cmNlLFxuICAgICAgICBzdGF0dXM6IGN1cnJlbnRTdGF0ZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNpdGlvbmluZyA9XG4gICAgICAobW9kZSA9PT0gJ1N0YXJ0JyAmJiBjdXJyZW50U3RhdGUgPT09ICdwZW5kaW5nJykgfHxcbiAgICAgIChtb2RlID09PSAnU3RvcCcgJiYgKGN1cnJlbnRTdGF0ZSA9PT0gJ3N0b3BwaW5nJyB8fCBjdXJyZW50U3RhdGUgPT09ICdzaHV0dGluZy1kb3duJykpO1xuXG4gICAgaWYgKHRyYW5zaXRpb25pbmcpIHtcbiAgICAgIGF3YWl0IGN0eC53YWl0KHsgc2Vjb25kczogU1RBVFVTX0NIQU5HRV9XQUlUX1NFQ09ORFMgfSk7XG4gICAgICBsb29wQ291bnQgKz0gMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgaW5zdGFuY2Ugc3RhdHVzIGZhaWw6IG1vZGU9JHttb2RlfSBjdXJyZW50U3RhdGU9JHtjdXJyZW50U3RhdGV9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogRHVyYWJsZSBMYW1iZGEgaGFuZGxlciBmb3IgdGhlIEVDMiBydW5uaW5nIHNjaGVkdWxlci5cbiAqIEZldGNoZXMgdGFyZ2V0IHJlc291cmNlcyBieSB0YWcsIHN0YXJ0cyBvciBzdG9wcyBpbnN0YW5jZXMgcGVyIE1vZGUsIGFuZCBwb3N0cyByZXN1bHRzIHRvIFNsYWNrLlxuICpcbiAqIEBwYXJhbSBldmVudCAtIFNjaGVkdWxlckV2ZW50IHdpdGggUGFyYW1zLlRhZ0tleSwgUGFyYW1zLlRhZ1ZhbHVlcywgUGFyYW1zLk1vZGUuXG4gKiBAcGFyYW0gY29udGV4dCAtIER1cmFibGUgZXhlY3V0aW9uIGNvbnRleHQuXG4gKiBAcmV0dXJucyBTdGF0dXMgYW5kIGxpc3Qgb2YgcHJvY2Vzc2VkIHJlc291cmNlcywgb3IgVGFyZ2V0UmVzb3VyY2VzTm90Rm91bmQgaWYgbm9uZSBtYXRjaC5cbiAqL1xuZXhwb3J0IGNvbnN0IGhhbmRsZXIgPSB3aXRoRHVyYWJsZUV4ZWN1dGlvbihhc3luYyAoZXZlbnQ6IFNjaGVkdWxlckV2ZW50LCBjb250ZXh0OiBEdXJhYmxlQ29udGV4dCkgPT4ge1xuXG4gIGNvbnN0IHBhcmFtcyA9IGV2ZW50LlBhcmFtcztcblxuICBpZiAoIXBhcmFtcz8uVGFnS2V5IHx8ICFwYXJhbXM/LlRhZ1ZhbHVlcyB8fCAhcGFyYW1zPy5Nb2RlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGV2ZW50OiBQYXJhbXMuVGFnS2V5LCBQYXJhbXMuVGFnVmFsdWVzLCBQYXJhbXMuTW9kZSBhcmUgcmVxdWlyZWQuJyk7XG4gIH1cbiAgY29uc3Qgc2xhY2tTZWNyZXROYW1lID0gcHJvY2Vzcy5lbnYuU0xBQ0tfU0VDUkVUX05BTUU7XG4gIGlmICghc2xhY2tTZWNyZXROYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlIFNMQUNLX1NFQ1JFVF9OQU1FLicpO1xuICB9XG4gIGNvbnN0IHNsYWNrU2VjcmV0VmFsdWUgPSBhd2FpdCBjb250ZXh0LnN0ZXAoJ2ZldGNoLXNsYWNrLXNlY3JldCcsIGFzeW5jICgpID0+IHtcbiAgICByZXR1cm4gc2VjcmV0RmV0Y2hlci5nZXRTZWNyZXRWYWx1ZTxTbGFja1NlY3JldD4oc2xhY2tTZWNyZXROYW1lKTtcbiAgfSk7XG5cbiAgaWYgKCFzbGFja1NlY3JldFZhbHVlPy50b2tlbiB8fCAhc2xhY2tTZWNyZXRWYWx1ZT8uY2hhbm5lbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2xhY2sgc2VjcmV0IG11c3QgY29udGFpbiB0b2tlbiBhbmQgY2hhbm5lbC4nKTtcbiAgfVxuXG4gIGNvbnN0IHRhcmdldFJlc291cmNlcyA9IGF3YWl0IGNvbnRleHQuc3RlcCgnZ2V0LXRhcmdldC1yZXNvdXJjZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IFJlc291cmNlR3JvdXBzVGFnZ2luZ0FQSUNsaWVudCh7fSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnNlbmQoXG4gICAgICBuZXcgR2V0UmVzb3VyY2VzQ29tbWFuZCh7XG4gICAgICAgIFJlc291cmNlVHlwZUZpbHRlcnM6IFsnZWMyOmluc3RhbmNlJ10sXG4gICAgICAgIFRhZ0ZpbHRlcnM6IFt7IEtleTogcGFyYW1zLlRhZ0tleSwgVmFsdWVzOiBwYXJhbXMuVGFnVmFsdWVzIH1dLFxuICAgICAgfSksXG4gICAgKTtcbiAgICByZXR1cm4gKHJlc3VsdC5SZXNvdXJjZVRhZ01hcHBpbmdMaXN0ID8/IFtdKVxuICAgICAgLm1hcCgobTogeyBSZXNvdXJjZUFSTj86IHN0cmluZyB9KSA9PiBtLlJlc291cmNlQVJOKVxuICAgICAgLmZpbHRlcigoYXJuOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBhcm4gaXMgc3RyaW5nID0+IGFybiAhPSBudWxsKTtcbiAgfSk7XG5cbiAgaWYgKHRhcmdldFJlc291cmNlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4geyBzdGF0dXM6ICdUYXJnZXRSZXNvdXJjZXNOb3RGb3VuZCcgYXMgY29uc3QgfTtcbiAgfVxuXG4gIGNvbnN0IGNsaWVudCA9IG5ldyBXZWJDbGllbnQoc2xhY2tTZWNyZXRWYWx1ZS50b2tlbik7XG4gIGNvbnN0IGNoYW5uZWwgPSBzbGFja1NlY3JldFZhbHVlLmNoYW5uZWw7XG5cbiAgLy8gc2VuZCBzbGFjayBtZXNzYWdlXG4gIGNvbnN0IHNsYWNrUGFyZW50TWVzc2FnZVJlc3VsdCA9IGF3YWl0IGNvbnRleHQuc3RlcCgncG9zdC1zbGFjay1tZXNzYWdlcycsIGFzeW5jICgpID0+IHtcbiAgICByZXR1cm4gY2xpZW50LmNoYXQucG9zdE1lc3NhZ2Uoe1xuICAgICAgY2hhbm5lbCxcbiAgICAgIHRleHQ6IGAke3BhcmFtcy5Nb2RlID09PSAnU3RhcnQnID8gJ/CfmIYgU3RhcnRzJyA6ICfwn6WxIFN0b3BzJ30gdGhlIHNjaGVkdWxlZCBFQzIgSW5zdGFuY2UuYCxcbiAgICB9KTtcbiAgfSk7XG5cbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IGNvbnRleHQubWFwKFxuICAgIHRhcmdldFJlc291cmNlcyxcbiAgICAvLyBhc3luYyAoY3R4OiBEdXJhYmxlQ29udGV4dCwgdGFyZ2V0UmVzb3VyY2U6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT5cbiAgICAvLyAgIGN0eC5zdGVwKGBwcm9jZXNzLXJlc291cmNlLSR7aW5kZXh9YCwgYXN5bmMgKCkgPT5cbiAgICAvLyAgICAgcHJvY2Vzc09uZVJlc291cmNlKGN0eCwgdGFyZ2V0UmVzb3VyY2UsIHBhcmFtcywgaW5kZXgpLFxuICAgIC8vICAgKSxcbiAgICBhc3luYyAoY3R4OiBEdXJhYmxlQ29udGV4dCwgdGFyZ2V0UmVzb3VyY2U6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgcmV0dXJuIGN0eC5ydW5JbkNoaWxkQ29udGV4dChgcmVzb3VyY2UtJHtpbmRleH1gLCBhc3luYyAoY2hpbGRDdHg6IER1cmFibGVDb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb2Nlc3NPbmVSZXNvdXJjZShjaGlsZEN0eCwgdGFyZ2V0UmVzb3VyY2UsIHBhcmFtcywgaW5kZXgpO1xuICAgICAgICAvLyBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ3NraXBwZWQnKSB7XG4gICAgICAgIC8vICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyBzZW5kIHNsYWNrIHRocmVhZCBtZXNzYWdlXG4gICAgICAgIGF3YWl0IGNoaWxkQ3R4LnN0ZXAoJ3Bvc3Qtc2xhY2stY2hpbGQtbWVzc2FnZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZGlzcGxheSA9IGdldFN0YXRlRGlzcGxheShyZXN1bHQuc3RhdHVzKTtcblxuICAgICAgICAgIHJldHVybiBjbGllbnQuY2hhdC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgdGhyZWFkX3RzOiBzbGFja1BhcmVudE1lc3NhZ2VSZXN1bHQ/LnRzLFxuICAgICAgICAgICAgYXR0YWNobWVudHM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbG9yOiAnIzM2YTY0ZicsXG4gICAgICAgICAgICAgICAgcHJldGV4dDogYCR7ZGlzcGxheT8uZW1vaml9IFRoZSBzdGF0dXMgb2YgdGhlIEVDMiBJbnN0YW5jZSAke3Jlc3VsdC5pZGVudGlmaWVyfSBjaGFuZ2VkIHRvICR7ZGlzcGxheT8ubmFtZX0gZHVlIHRvIHRoZSBzY2hlZHVsZS5gLFxuICAgICAgICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAgICAgICAgeyB0aXRsZTogJ0FjY291bnQnLCB2YWx1ZTogcmVzdWx0LmFjY291bnQsIHNob3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgICB7IHRpdGxlOiAnUmVnaW9uJywgdmFsdWU6IHJlc3VsdC5yZWdpb24sIHNob3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgICB7IHRpdGxlOiAnSWRlbnRpZmllcicsIHZhbHVlOiByZXN1bHQuaWRlbnRpZmllciwgc2hvcnQ6IHRydWUgfSxcbiAgICAgICAgICAgICAgICAgIHsgdGl0bGU6ICdTdGF0dXMnLCB2YWx1ZTogKGRpc3BsYXk/Lm5hbWUgPz8gJ1Vua25vd24nKSwgc2hvcnQ6IHRydWUgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHsgbWF4Q29uY3VycmVuY3k6IDEwIH0sXG4gICk7XG5cbiAgY29uc3QgcmVzdWx0TGlzdCA9IEFycmF5LmlzQXJyYXkocmVzdWx0cykgPyByZXN1bHRzIDogW107XG4gIHJldHVybiB7XG4gICAgc3RhdHVzOiAnQ29tcGxldGVkJyBhcyBjb25zdCxcbiAgICBwcm9jZXNzZWQ6IHRhcmdldFJlc291cmNlcy5sZW5ndGgsXG4gICAgcmVzdWx0czogcmVzdWx0TGlzdCxcbiAgfTtcbn0pO1xuIl19
|
package/lib/index.d.ts
ADDED
package/lib/index.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
/**
|
|
18
|
+
* Public API: EC2 instance running scheduler construct and stack.
|
|
19
|
+
*/
|
|
20
|
+
__exportStar(require("./constructs/ec2-instance-running-scheduler"), exports);
|
|
21
|
+
__exportStar(require("./stacks/ec2-instance-running-schedule-stack"), exports);
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztHQUVHO0FBQ0gsOEVBQTREO0FBQzVELCtFQUE2RCIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHVibGljIEFQSTogRUMyIGluc3RhbmNlIHJ1bm5pbmcgc2NoZWR1bGVyIGNvbnN0cnVjdCBhbmQgc3RhY2suXG4gKi9cbmV4cG9ydCAqIGZyb20gJy4vY29uc3RydWN0cy9lYzItaW5zdGFuY2UtcnVubmluZy1zY2hlZHVsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9zdGFja3MvZWMyLWluc3RhbmNlLXJ1bm5pbmctc2NoZWR1bGUtc3RhY2snOyJdfQ==
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Stack, StackProps } from 'aws-cdk-lib';
|
|
2
|
+
import { Construct } from 'constructs';
|
|
3
|
+
import { TargetResource, Secrets, Schedule } from '../constructs/ec2-instance-running-scheduler';
|
|
4
|
+
/**
|
|
5
|
+
* Props for the EC2 instance running schedule CDK stack.
|
|
6
|
+
*/
|
|
7
|
+
export interface EC2InstanceRunningScheduleStackProps extends StackProps {
|
|
8
|
+
/** Tag-based target resource for EC2 instances to start/stop. */
|
|
9
|
+
readonly targetResource: TargetResource;
|
|
10
|
+
/** Whether scheduling is enabled. Defaults to true if omitted. */
|
|
11
|
+
readonly enableScheduling?: boolean;
|
|
12
|
+
/** Secrets (e.g. Slack) for the scheduler. */
|
|
13
|
+
readonly secrets: Secrets;
|
|
14
|
+
/** Cron schedule for stopping instances. */
|
|
15
|
+
readonly stopSchedule?: Schedule;
|
|
16
|
+
/** Cron schedule for starting instances. */
|
|
17
|
+
readonly startSchedule?: Schedule;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* CDK Stack that deploys the EC2 instance running scheduler (EventBridge Scheduler + Durable Lambda).
|
|
21
|
+
*/
|
|
22
|
+
export declare class EC2InstanceRunningScheduleStack extends Stack {
|
|
23
|
+
/**
|
|
24
|
+
* Creates the stack and the EC2InstanceRunningScheduler construct.
|
|
25
|
+
*
|
|
26
|
+
* @param scope - Parent construct.
|
|
27
|
+
* @param id - Stack id.
|
|
28
|
+
* @param props - Stack props (target resource, schedules, secrets).
|
|
29
|
+
*/
|
|
30
|
+
constructor(scope: Construct, id: string, props: EC2InstanceRunningScheduleStackProps);
|
|
31
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.EC2InstanceRunningScheduleStack = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
7
|
+
const ec2_instance_running_scheduler_1 = require("../constructs/ec2-instance-running-scheduler");
|
|
8
|
+
/**
|
|
9
|
+
* CDK Stack that deploys the EC2 instance running scheduler (EventBridge Scheduler + Durable Lambda).
|
|
10
|
+
*/
|
|
11
|
+
class EC2InstanceRunningScheduleStack extends aws_cdk_lib_1.Stack {
|
|
12
|
+
/**
|
|
13
|
+
* Creates the stack and the EC2InstanceRunningScheduler construct.
|
|
14
|
+
*
|
|
15
|
+
* @param scope - Parent construct.
|
|
16
|
+
* @param id - Stack id.
|
|
17
|
+
* @param props - Stack props (target resource, schedules, secrets).
|
|
18
|
+
*/
|
|
19
|
+
constructor(scope, id, props) {
|
|
20
|
+
super(scope, id, props);
|
|
21
|
+
new ec2_instance_running_scheduler_1.EC2InstanceRunningScheduler(this, 'EC2InstanceRunningScheduler', {
|
|
22
|
+
targetResource: props.targetResource,
|
|
23
|
+
enableScheduling: props.enableScheduling,
|
|
24
|
+
secrets: props.secrets,
|
|
25
|
+
stopSchedule: props.stopSchedule,
|
|
26
|
+
startSchedule: props.startSchedule,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.EC2InstanceRunningScheduleStack = EC2InstanceRunningScheduleStack;
|
|
31
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
32
|
+
EC2InstanceRunningScheduleStack[_a] = { fqn: "aws-ec2-instance-running-scheduler.EC2InstanceRunningScheduleStack", version: "3.0.2" };
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWMyLWluc3RhbmNlLXJ1bm5pbmctc2NoZWR1bGUtc3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RhY2tzL2VjMi1pbnN0YW5jZS1ydW5uaW5nLXNjaGVkdWxlLXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBQWdEO0FBRWhELGlHQUE4SDtBQWtCOUg7O0dBRUc7QUFDSCxNQUFhLCtCQUFnQyxTQUFRLG1CQUFLO0lBQ3hEOzs7Ozs7T0FNRztJQUNILFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMkM7UUFDbkYsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsSUFBSSw0REFBMkIsQ0FBQyxJQUFJLEVBQUUsNkJBQTZCLEVBQUU7WUFDbkUsY0FBYyxFQUFFLEtBQUssQ0FBQyxjQUFjO1lBQ3BDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7WUFDeEMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3RCLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtZQUNoQyxhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWE7U0FDbkMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUFsQkgsMEVBbUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RhY2ssIFN0YWNrUHJvcHMgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEVDMkluc3RhbmNlUnVubmluZ1NjaGVkdWxlciwgVGFyZ2V0UmVzb3VyY2UsIFNlY3JldHMsIFNjaGVkdWxlIH0gZnJvbSAnLi4vY29uc3RydWN0cy9lYzItaW5zdGFuY2UtcnVubmluZy1zY2hlZHVsZXInO1xuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgRUMyIGluc3RhbmNlIHJ1bm5pbmcgc2NoZWR1bGUgQ0RLIHN0YWNrLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVDMkluc3RhbmNlUnVubmluZ1NjaGVkdWxlU3RhY2tQcm9wcyBleHRlbmRzIFN0YWNrUHJvcHMge1xuICAvKiogVGFnLWJhc2VkIHRhcmdldCByZXNvdXJjZSBmb3IgRUMyIGluc3RhbmNlcyB0byBzdGFydC9zdG9wLiAqL1xuICByZWFkb25seSB0YXJnZXRSZXNvdXJjZTogVGFyZ2V0UmVzb3VyY2U7XG4gIC8qKiBXaGV0aGVyIHNjaGVkdWxpbmcgaXMgZW5hYmxlZC4gRGVmYXVsdHMgdG8gdHJ1ZSBpZiBvbWl0dGVkLiAqL1xuICByZWFkb25seSBlbmFibGVTY2hlZHVsaW5nPzogYm9vbGVhbjtcbiAgLyoqIFNlY3JldHMgKGUuZy4gU2xhY2spIGZvciB0aGUgc2NoZWR1bGVyLiAqL1xuICByZWFkb25seSBzZWNyZXRzOiBTZWNyZXRzO1xuICAvKiogQ3JvbiBzY2hlZHVsZSBmb3Igc3RvcHBpbmcgaW5zdGFuY2VzLiAqL1xuICByZWFkb25seSBzdG9wU2NoZWR1bGU/OiBTY2hlZHVsZTtcbiAgLyoqIENyb24gc2NoZWR1bGUgZm9yIHN0YXJ0aW5nIGluc3RhbmNlcy4gKi9cbiAgcmVhZG9ubHkgc3RhcnRTY2hlZHVsZT86IFNjaGVkdWxlO1xufVxuXG4vKipcbiAqIENESyBTdGFjayB0aGF0IGRlcGxveXMgdGhlIEVDMiBpbnN0YW5jZSBydW5uaW5nIHNjaGVkdWxlciAoRXZlbnRCcmlkZ2UgU2NoZWR1bGVyICsgRHVyYWJsZSBMYW1iZGEpLlxuICovXG5leHBvcnQgY2xhc3MgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVTdGFjayBleHRlbmRzIFN0YWNrIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIHN0YWNrIGFuZCB0aGUgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVyIGNvbnN0cnVjdC5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIC0gUGFyZW50IGNvbnN0cnVjdC5cbiAgICogQHBhcmFtIGlkIC0gU3RhY2sgaWQuXG4gICAqIEBwYXJhbSBwcm9wcyAtIFN0YWNrIHByb3BzICh0YXJnZXQgcmVzb3VyY2UsIHNjaGVkdWxlcywgc2VjcmV0cykuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVTdGFja1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICBuZXcgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVyKHRoaXMsICdFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZXInLCB7XG4gICAgICB0YXJnZXRSZXNvdXJjZTogcHJvcHMudGFyZ2V0UmVzb3VyY2UsXG4gICAgICBlbmFibGVTY2hlZHVsaW5nOiBwcm9wcy5lbmFibGVTY2hlZHVsaW5nLFxuICAgICAgc2VjcmV0czogcHJvcHMuc2VjcmV0cyxcbiAgICAgIHN0b3BTY2hlZHVsZTogcHJvcHMuc3RvcFNjaGVkdWxlLFxuICAgICAgc3RhcnRTY2hlZHVsZTogcHJvcHMuc3RhcnRTY2hlZHVsZSxcbiAgICB9KTtcbiAgfVxufSJdfQ==
|