ec2-instance-running-scheduler 0.2.7 → 0.3.0
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 +357 -47
- package/API.md +402 -27
- package/README.md +55 -17
- package/assets/funcs/running-scheduler.lambda/index.js +333 -212
- package/assets/funcs/running-scheduler.lambda/index.js.map +4 -4
- package/lib/constructs/ec2-instance-running-scheduler.d.ts +31 -14
- package/lib/constructs/ec2-instance-running-scheduler.js +26 -13
- package/lib/constructs/running-scheduler-failure-detection.d.ts +87 -0
- package/lib/constructs/running-scheduler-failure-detection.js +185 -0
- package/lib/funcs/running-scheduler-predicates.d.ts +24 -24
- package/lib/funcs/running-scheduler-predicates.js +18 -18
- package/lib/funcs/running-scheduler-wait-config.d.ts +17 -0
- package/lib/funcs/running-scheduler-wait-config.js +21 -0
- package/lib/funcs/running-scheduler-wait-env.d.ts +9 -0
- package/lib/funcs/running-scheduler-wait-env.js +54 -0
- package/lib/funcs/running-scheduler.lambda.d.ts +11 -4
- package/lib/funcs/running-scheduler.lambda.js +88 -50
- package/lib/index.d.ts +2 -1
- package/lib/index.js +3 -2
- package/lib/stacks/ec2-instance-running-schedule-stack.d.ts +9 -3
- package/lib/stacks/ec2-instance-running-schedule-stack.js +8 -3
- package/package.json +5 -6
- package/lib/funcs/running-scheduler-polling-config.d.ts +0 -17
- package/lib/funcs/running-scheduler-polling-config.js +0 -21
- package/lib/funcs/running-scheduler-polling-env.d.ts +0 -8
- package/lib/funcs/running-scheduler-polling-env.js +0 -53
|
@@ -3,23 +3,23 @@
|
|
|
3
3
|
*/
|
|
4
4
|
/** Value of `Params.Mode` from the EventBridge Scheduler payload. */
|
|
5
5
|
export type RunningSchedulerMode = 'Start' | 'Stop';
|
|
6
|
-
/** Upper bounds for per-instance stable-state
|
|
7
|
-
export interface
|
|
8
|
-
/** Maximum describe/
|
|
6
|
+
/** Upper bounds for per-instance stable-state waiting in the running scheduler Lambda handler. */
|
|
7
|
+
export interface ResourceWaitLimits {
|
|
8
|
+
/** Maximum describe/wait loop iterations before failing (each loop may include a durable wait). */
|
|
9
9
|
readonly maxLoopCount: number;
|
|
10
|
-
/** Maximum wall-clock seconds from the first
|
|
10
|
+
/** Maximum wall-clock seconds from the first wait iteration before failing. */
|
|
11
11
|
readonly maxElapsedSeconds: number;
|
|
12
12
|
}
|
|
13
|
-
/** Default
|
|
14
|
-
export declare const
|
|
13
|
+
/** Default wait limits (90 loops × 20s wait ≈ 30 minutes of waits; 30 minutes elapsed). */
|
|
14
|
+
export declare const DEFAULT_RESOURCE_WAIT_LIMITS: ResourceWaitLimits;
|
|
15
15
|
/**
|
|
16
|
-
* Why per-instance
|
|
16
|
+
* Why per-instance waiting stopped with an error.
|
|
17
17
|
*
|
|
18
|
-
* - `MaxLoopCountExceeded` – {@link
|
|
19
|
-
* - `MaxElapsedTimeExceeded` – elapsed wall-clock time exceeded {@link
|
|
18
|
+
* - `MaxLoopCountExceeded` – {@link getWaitAbortReason} hit {@link ResourceWaitLimits.maxLoopCount}.
|
|
19
|
+
* - `MaxElapsedTimeExceeded` – elapsed wall-clock time exceeded {@link ResourceWaitLimits.maxElapsedSeconds}.
|
|
20
20
|
* - `UnexpectedInstanceState` – state is neither stable, actionable, nor a known transition.
|
|
21
21
|
*/
|
|
22
|
-
export type
|
|
22
|
+
export type ResourceWaitFailureReason = 'MaxLoopCountExceeded' | 'MaxElapsedTimeExceeded' | 'UnexpectedInstanceState';
|
|
23
23
|
/**
|
|
24
24
|
* Whether the instance is already in the goal state for the scheduler mode (no start/stop needed).
|
|
25
25
|
*
|
|
@@ -37,33 +37,33 @@ export declare const isDesiredStableState: (mode: RunningSchedulerMode, currentS
|
|
|
37
37
|
*/
|
|
38
38
|
export declare const isTransitioningState: (mode: RunningSchedulerMode, currentState: string) => boolean;
|
|
39
39
|
/**
|
|
40
|
-
* Returns a
|
|
40
|
+
* Returns a wait abort reason when loop count or elapsed time exceeds configured limits.
|
|
41
41
|
*
|
|
42
|
-
* @param loopCount - Zero-based iteration count for the current
|
|
43
|
-
* @param startedAtMs - Epoch milliseconds recorded at the start of
|
|
42
|
+
* @param loopCount - Zero-based iteration count for the current wait loop.
|
|
43
|
+
* @param startedAtMs - Epoch milliseconds recorded at the start of waiting (durable step).
|
|
44
44
|
* @param nowMs - Current epoch milliseconds (from a durable step when replay matters).
|
|
45
|
-
* @param limits - Configured {@link
|
|
46
|
-
* @returns Abort reason, or `undefined` when
|
|
45
|
+
* @param limits - Configured {@link ResourceWaitLimits}.
|
|
46
|
+
* @returns Abort reason, or `undefined` when waiting may continue.
|
|
47
47
|
*/
|
|
48
|
-
export declare const
|
|
49
|
-
/** Inputs for {@link
|
|
50
|
-
export interface
|
|
48
|
+
export declare const getWaitAbortReason: (loopCount: number, startedAtMs: number, nowMs: number, limits: ResourceWaitLimits) => "MaxLoopCountExceeded" | "MaxElapsedTimeExceeded" | undefined;
|
|
49
|
+
/** Inputs for {@link formatResourceWaitFailure}. */
|
|
50
|
+
export interface ResourceWaitFailureContext {
|
|
51
51
|
/** EC2 instance id parsed from the target ARN. */
|
|
52
52
|
readonly identifier: string;
|
|
53
53
|
/** Scheduler mode from the invocation payload. */
|
|
54
54
|
readonly mode: RunningSchedulerMode;
|
|
55
55
|
/** Last observed instance state from `DescribeInstances`. */
|
|
56
56
|
readonly currentState: string;
|
|
57
|
-
/** Zero-based
|
|
57
|
+
/** Zero-based wait loop iteration when the failure occurred. */
|
|
58
58
|
readonly loopCount: number;
|
|
59
|
-
/** Active
|
|
60
|
-
readonly limits:
|
|
59
|
+
/** Active wait limits for limit-related failure messages. */
|
|
60
|
+
readonly limits: ResourceWaitLimits;
|
|
61
61
|
}
|
|
62
62
|
/**
|
|
63
|
-
* Builds a stable, grep-friendly error message for
|
|
63
|
+
* Builds a stable, grep-friendly error message for wait failures.
|
|
64
64
|
*
|
|
65
65
|
* @param reason - Failure category.
|
|
66
66
|
* @param context - Instance id, mode, state, loop count, and limits.
|
|
67
|
-
* @returns Message prefixed with `
|
|
67
|
+
* @returns Message prefixed with `ResourceWaitFailed:` (e.g. `ResourceWaitFailed:MaxLoopCountExceeded: ...`).
|
|
68
68
|
*/
|
|
69
|
-
export declare const
|
|
69
|
+
export declare const formatResourceWaitFailure: (reason: ResourceWaitFailureReason, context: ResourceWaitFailureContext) => string;
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
* Pure predicates for the EC2 running scheduler Lambda (no AWS SDK).
|
|
4
4
|
*/
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
7
|
-
/** Default
|
|
8
|
-
exports.
|
|
6
|
+
exports.formatResourceWaitFailure = exports.getWaitAbortReason = exports.isTransitioningState = exports.isDesiredStableState = exports.DEFAULT_RESOURCE_WAIT_LIMITS = void 0;
|
|
7
|
+
/** Default wait limits (90 loops × 20s wait ≈ 30 minutes of waits; 30 minutes elapsed). */
|
|
8
|
+
exports.DEFAULT_RESOURCE_WAIT_LIMITS = {
|
|
9
9
|
maxLoopCount: 90,
|
|
10
10
|
maxElapsedSeconds: 1800,
|
|
11
11
|
};
|
|
@@ -29,15 +29,15 @@ const isTransitioningState = (mode, currentState) => (mode === 'Start' && curren
|
|
|
29
29
|
(mode === 'Stop' && (currentState === 'stopping' || currentState === 'shutting-down'));
|
|
30
30
|
exports.isTransitioningState = isTransitioningState;
|
|
31
31
|
/**
|
|
32
|
-
* Returns a
|
|
32
|
+
* Returns a wait abort reason when loop count or elapsed time exceeds configured limits.
|
|
33
33
|
*
|
|
34
|
-
* @param loopCount - Zero-based iteration count for the current
|
|
35
|
-
* @param startedAtMs - Epoch milliseconds recorded at the start of
|
|
34
|
+
* @param loopCount - Zero-based iteration count for the current wait loop.
|
|
35
|
+
* @param startedAtMs - Epoch milliseconds recorded at the start of waiting (durable step).
|
|
36
36
|
* @param nowMs - Current epoch milliseconds (from a durable step when replay matters).
|
|
37
|
-
* @param limits - Configured {@link
|
|
38
|
-
* @returns Abort reason, or `undefined` when
|
|
37
|
+
* @param limits - Configured {@link ResourceWaitLimits}.
|
|
38
|
+
* @returns Abort reason, or `undefined` when waiting may continue.
|
|
39
39
|
*/
|
|
40
|
-
const
|
|
40
|
+
const getWaitAbortReason = (loopCount, startedAtMs, nowMs, limits) => {
|
|
41
41
|
if (loopCount >= limits.maxLoopCount) {
|
|
42
42
|
return 'MaxLoopCountExceeded';
|
|
43
43
|
}
|
|
@@ -47,23 +47,23 @@ const getPollingAbortReason = (loopCount, startedAtMs, nowMs, limits) => {
|
|
|
47
47
|
}
|
|
48
48
|
return undefined;
|
|
49
49
|
};
|
|
50
|
-
exports.
|
|
50
|
+
exports.getWaitAbortReason = getWaitAbortReason;
|
|
51
51
|
/**
|
|
52
|
-
* Builds a stable, grep-friendly error message for
|
|
52
|
+
* Builds a stable, grep-friendly error message for wait failures.
|
|
53
53
|
*
|
|
54
54
|
* @param reason - Failure category.
|
|
55
55
|
* @param context - Instance id, mode, state, loop count, and limits.
|
|
56
|
-
* @returns Message prefixed with `
|
|
56
|
+
* @returns Message prefixed with `ResourceWaitFailed:` (e.g. `ResourceWaitFailed:MaxLoopCountExceeded: ...`).
|
|
57
57
|
*/
|
|
58
|
-
const
|
|
58
|
+
const formatResourceWaitFailure = (reason, context) => {
|
|
59
59
|
const common = `identifier=${context.identifier} mode=${context.mode} currentState=${context.currentState} loopCount=${context.loopCount}`;
|
|
60
60
|
if (reason === 'MaxLoopCountExceeded') {
|
|
61
|
-
return `
|
|
61
|
+
return `ResourceWaitFailed:MaxLoopCountExceeded: ${common} maxLoopCount=${context.limits.maxLoopCount}`;
|
|
62
62
|
}
|
|
63
63
|
if (reason === 'MaxElapsedTimeExceeded') {
|
|
64
|
-
return `
|
|
64
|
+
return `ResourceWaitFailed:MaxElapsedTimeExceeded: ${common} maxElapsedSeconds=${context.limits.maxElapsedSeconds}`;
|
|
65
65
|
}
|
|
66
|
-
return `
|
|
66
|
+
return `ResourceWaitFailed:UnexpectedInstanceState: ${common}`;
|
|
67
67
|
};
|
|
68
|
-
exports.
|
|
69
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
68
|
+
exports.formatResourceWaitFailure = formatResourceWaitFailure;
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmluZy1zY2hlZHVsZXItcHJlZGljYXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mdW5jcy9ydW5uaW5nLXNjaGVkdWxlci1wcmVkaWNhdGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRzs7O0FBYUgsMkZBQTJGO0FBQzlFLFFBQUEsNEJBQTRCLEdBQXVCO0lBQzlELFlBQVksRUFBRSxFQUFFO0lBQ2hCLGlCQUFpQixFQUFFLElBQUk7Q0FDeEIsQ0FBQztBQWNGOzs7Ozs7R0FNRztBQUNJLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxJQUEwQixFQUFFLFlBQW9CLEVBQVcsRUFBRSxDQUNoRyxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksWUFBWSxLQUFLLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxZQUFZLEtBQUssU0FBUyxDQUFDLENBQUM7QUFEekYsUUFBQSxvQkFBb0Isd0JBQ3FFO0FBRXRHOzs7Ozs7R0FNRztBQUNJLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxJQUEwQixFQUFFLFlBQW9CLEVBQVcsRUFBRSxDQUNoRyxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksWUFBWSxLQUFLLFNBQVMsQ0FBQztJQUNoRCxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksQ0FBQyxZQUFZLEtBQUssVUFBVSxJQUFJLFlBQVksS0FBSyxlQUFlLENBQUMsQ0FBQyxDQUFDO0FBRjVFLFFBQUEsb0JBQW9CLHdCQUV3RDtBQUV6Rjs7Ozs7Ozs7R0FRRztBQUNJLE1BQU0sa0JBQWtCLEdBQUcsQ0FDaEMsU0FBaUIsRUFDakIsV0FBbUIsRUFDbkIsS0FBYSxFQUNiLE1BQTBCLEVBQ3FDLEVBQUU7SUFDakUsSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3JDLE9BQU8sc0JBQXNCLENBQUM7SUFDaEMsQ0FBQztJQUNELE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNwRCxJQUFJLGNBQWMsSUFBSSxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMvQyxPQUFPLHdCQUF3QixDQUFDO0lBQ2xDLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDLENBQUM7QUFkVyxRQUFBLGtCQUFrQixzQkFjN0I7QUFnQkY7Ozs7OztHQU1HO0FBQ0ksTUFBTSx5QkFBeUIsR0FBRyxDQUN2QyxNQUFpQyxFQUNqQyxPQUFtQyxFQUMzQixFQUFFO0lBQ1YsTUFBTSxNQUFNLEdBQ1YsY0FBYyxPQUFPLENBQUMsVUFBVSxTQUFTLE9BQU8sQ0FBQyxJQUFJLGlCQUFpQixPQUFPLENBQUMsWUFBWSxjQUFjLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUM5SCxJQUFJLE1BQU0sS0FBSyxzQkFBc0IsRUFBRSxDQUFDO1FBQ3RDLE9BQU8sNENBQTRDLE1BQU0saUJBQWlCLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUcsQ0FBQztJQUNELElBQUksTUFBTSxLQUFLLHdCQUF3QixFQUFFLENBQUM7UUFDeEMsT0FBTyw4Q0FBOEMsTUFBTSxzQkFBc0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQ3RILENBQUM7SUFDRCxPQUFPLCtDQUErQyxNQUFNLEVBQUUsQ0FBQztBQUNqRSxDQUFDLENBQUM7QUFiVyxRQUFBLHlCQUF5Qiw2QkFhcEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFB1cmUgcHJlZGljYXRlcyBmb3IgdGhlIEVDMiBydW5uaW5nIHNjaGVkdWxlciBMYW1iZGEgKG5vIEFXUyBTREspLlxuICovXG5cbi8qKiBWYWx1ZSBvZiBgUGFyYW1zLk1vZGVgIGZyb20gdGhlIEV2ZW50QnJpZGdlIFNjaGVkdWxlciBwYXlsb2FkLiAqL1xuZXhwb3J0IHR5cGUgUnVubmluZ1NjaGVkdWxlck1vZGUgPSAnU3RhcnQnIHwgJ1N0b3AnO1xuXG4vKiogVXBwZXIgYm91bmRzIGZvciBwZXItaW5zdGFuY2Ugc3RhYmxlLXN0YXRlIHdhaXRpbmcgaW4gdGhlIHJ1bm5pbmcgc2NoZWR1bGVyIExhbWJkYSBoYW5kbGVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZVdhaXRMaW1pdHMge1xuICAvKiogTWF4aW11bSBkZXNjcmliZS93YWl0IGxvb3AgaXRlcmF0aW9ucyBiZWZvcmUgZmFpbGluZyAoZWFjaCBsb29wIG1heSBpbmNsdWRlIGEgZHVyYWJsZSB3YWl0KS4gKi9cbiAgcmVhZG9ubHkgbWF4TG9vcENvdW50OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIHdhbGwtY2xvY2sgc2Vjb25kcyBmcm9tIHRoZSBmaXJzdCB3YWl0IGl0ZXJhdGlvbiBiZWZvcmUgZmFpbGluZy4gKi9cbiAgcmVhZG9ubHkgbWF4RWxhcHNlZFNlY29uZHM6IG51bWJlcjtcbn1cblxuLyoqIERlZmF1bHQgd2FpdCBsaW1pdHMgKDkwIGxvb3BzIMOXIDIwcyB3YWl0IOKJiCAzMCBtaW51dGVzIG9mIHdhaXRzOyAzMCBtaW51dGVzIGVsYXBzZWQpLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkVTT1VSQ0VfV0FJVF9MSU1JVFM6IFJlc291cmNlV2FpdExpbWl0cyA9IHtcbiAgbWF4TG9vcENvdW50OiA5MCxcbiAgbWF4RWxhcHNlZFNlY29uZHM6IDE4MDAsXG59O1xuXG4vKipcbiAqIFdoeSBwZXItaW5zdGFuY2Ugd2FpdGluZyBzdG9wcGVkIHdpdGggYW4gZXJyb3IuXG4gKlxuICogLSBgTWF4TG9vcENvdW50RXhjZWVkZWRgIOKAkyB7QGxpbmsgZ2V0V2FpdEFib3J0UmVhc29ufSBoaXQge0BsaW5rIFJlc291cmNlV2FpdExpbWl0cy5tYXhMb29wQ291bnR9LlxuICogLSBgTWF4RWxhcHNlZFRpbWVFeGNlZWRlZGAg4oCTIGVsYXBzZWQgd2FsbC1jbG9jayB0aW1lIGV4Y2VlZGVkIHtAbGluayBSZXNvdXJjZVdhaXRMaW1pdHMubWF4RWxhcHNlZFNlY29uZHN9LlxuICogLSBgVW5leHBlY3RlZEluc3RhbmNlU3RhdGVgIOKAkyBzdGF0ZSBpcyBuZWl0aGVyIHN0YWJsZSwgYWN0aW9uYWJsZSwgbm9yIGEga25vd24gdHJhbnNpdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgUmVzb3VyY2VXYWl0RmFpbHVyZVJlYXNvbiA9XG4gIHwgJ01heExvb3BDb3VudEV4Y2VlZGVkJ1xuICB8ICdNYXhFbGFwc2VkVGltZUV4Y2VlZGVkJ1xuICB8ICdVbmV4cGVjdGVkSW5zdGFuY2VTdGF0ZSc7XG5cbi8qKlxuICogV2hldGhlciB0aGUgaW5zdGFuY2UgaXMgYWxyZWFkeSBpbiB0aGUgZ29hbCBzdGF0ZSBmb3IgdGhlIHNjaGVkdWxlciBtb2RlIChubyBzdGFydC9zdG9wIG5lZWRlZCkuXG4gKlxuICogQHBhcmFtIG1vZGUgLSBgU3RhcnRgIGV4cGVjdHMgYHJ1bm5pbmdgOyBgU3RvcGAgZXhwZWN0cyBgc3RvcHBlZGAuXG4gKiBAcGFyYW0gY3VycmVudFN0YXRlIC0gSW5zdGFuY2Ugc3RhdGUgZnJvbSBgRGVzY3JpYmVJbnN0YW5jZXNgIChlLmcuIGBydW5uaW5nYCwgYHBlbmRpbmdgKS5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBpbnN0YW5jZSBtYXRjaGVzIHRoZSB0YXJnZXQgc3RhdGUgZm9yIGBtb2RlYC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzRGVzaXJlZFN0YWJsZVN0YXRlID0gKG1vZGU6IFJ1bm5pbmdTY2hlZHVsZXJNb2RlLCBjdXJyZW50U3RhdGU6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgKG1vZGUgPT09ICdTdGFydCcgJiYgY3VycmVudFN0YXRlID09PSAncnVubmluZycpIHx8IChtb2RlID09PSAnU3RvcCcgJiYgY3VycmVudFN0YXRlID09PSAnc3RvcHBlZCcpO1xuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGluc3RhbmNlIGlzIGluIGEga25vd24gdHJhbnNpdGlvbmFsIHN0YXRlIGZvciB0aGUgc2NoZWR1bGVyIG1vZGUuXG4gKlxuICogQHBhcmFtIG1vZGUgLSBgU3RhcnRgIG9yIGBTdG9wYC5cbiAqIEBwYXJhbSBjdXJyZW50U3RhdGUgLSBJbnN0YW5jZSBzdGF0ZSBmcm9tIGBEZXNjcmliZUluc3RhbmNlc2AuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgaW5zdGFuY2UgaXMgbW92aW5nIHRvd2FyZCB0aGUgZ29hbCBzdGF0ZSBmb3IgYG1vZGVgLlxuICovXG5leHBvcnQgY29uc3QgaXNUcmFuc2l0aW9uaW5nU3RhdGUgPSAobW9kZTogUnVubmluZ1NjaGVkdWxlck1vZGUsIGN1cnJlbnRTdGF0ZTogc3RyaW5nKTogYm9vbGVhbiA9PlxuICAobW9kZSA9PT0gJ1N0YXJ0JyAmJiBjdXJyZW50U3RhdGUgPT09ICdwZW5kaW5nJykgfHxcbiAgKG1vZGUgPT09ICdTdG9wJyAmJiAoY3VycmVudFN0YXRlID09PSAnc3RvcHBpbmcnIHx8IGN1cnJlbnRTdGF0ZSA9PT0gJ3NodXR0aW5nLWRvd24nKSk7XG5cbi8qKlxuICogUmV0dXJucyBhIHdhaXQgYWJvcnQgcmVhc29uIHdoZW4gbG9vcCBjb3VudCBvciBlbGFwc2VkIHRpbWUgZXhjZWVkcyBjb25maWd1cmVkIGxpbWl0cy5cbiAqXG4gKiBAcGFyYW0gbG9vcENvdW50IC0gWmVyby1iYXNlZCBpdGVyYXRpb24gY291bnQgZm9yIHRoZSBjdXJyZW50IHdhaXQgbG9vcC5cbiAqIEBwYXJhbSBzdGFydGVkQXRNcyAtIEVwb2NoIG1pbGxpc2Vjb25kcyByZWNvcmRlZCBhdCB0aGUgc3RhcnQgb2Ygd2FpdGluZyAoZHVyYWJsZSBzdGVwKS5cbiAqIEBwYXJhbSBub3dNcyAtIEN1cnJlbnQgZXBvY2ggbWlsbGlzZWNvbmRzIChmcm9tIGEgZHVyYWJsZSBzdGVwIHdoZW4gcmVwbGF5IG1hdHRlcnMpLlxuICogQHBhcmFtIGxpbWl0cyAtIENvbmZpZ3VyZWQge0BsaW5rIFJlc291cmNlV2FpdExpbWl0c30uXG4gKiBAcmV0dXJucyBBYm9ydCByZWFzb24sIG9yIGB1bmRlZmluZWRgIHdoZW4gd2FpdGluZyBtYXkgY29udGludWUuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRXYWl0QWJvcnRSZWFzb24gPSAoXG4gIGxvb3BDb3VudDogbnVtYmVyLFxuICBzdGFydGVkQXRNczogbnVtYmVyLFxuICBub3dNczogbnVtYmVyLFxuICBsaW1pdHM6IFJlc291cmNlV2FpdExpbWl0cyxcbik6ICdNYXhMb29wQ291bnRFeGNlZWRlZCcgfCAnTWF4RWxhcHNlZFRpbWVFeGNlZWRlZCcgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAobG9vcENvdW50ID49IGxpbWl0cy5tYXhMb29wQ291bnQpIHtcbiAgICByZXR1cm4gJ01heExvb3BDb3VudEV4Y2VlZGVkJztcbiAgfVxuICBjb25zdCBlbGFwc2VkU2Vjb25kcyA9IChub3dNcyAtIHN0YXJ0ZWRBdE1zKSAvIDEwMDA7XG4gIGlmIChlbGFwc2VkU2Vjb25kcyA+PSBsaW1pdHMubWF4RWxhcHNlZFNlY29uZHMpIHtcbiAgICByZXR1cm4gJ01heEVsYXBzZWRUaW1lRXhjZWVkZWQnO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG4vKiogSW5wdXRzIGZvciB7QGxpbmsgZm9ybWF0UmVzb3VyY2VXYWl0RmFpbHVyZX0uICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlV2FpdEZhaWx1cmVDb250ZXh0IHtcbiAgLyoqIEVDMiBpbnN0YW5jZSBpZCBwYXJzZWQgZnJvbSB0aGUgdGFyZ2V0IEFSTi4gKi9cbiAgcmVhZG9ubHkgaWRlbnRpZmllcjogc3RyaW5nO1xuICAvKiogU2NoZWR1bGVyIG1vZGUgZnJvbSB0aGUgaW52b2NhdGlvbiBwYXlsb2FkLiAqL1xuICByZWFkb25seSBtb2RlOiBSdW5uaW5nU2NoZWR1bGVyTW9kZTtcbiAgLyoqIExhc3Qgb2JzZXJ2ZWQgaW5zdGFuY2Ugc3RhdGUgZnJvbSBgRGVzY3JpYmVJbnN0YW5jZXNgLiAqL1xuICByZWFkb25seSBjdXJyZW50U3RhdGU6IHN0cmluZztcbiAgLyoqIFplcm8tYmFzZWQgd2FpdCBsb29wIGl0ZXJhdGlvbiB3aGVuIHRoZSBmYWlsdXJlIG9jY3VycmVkLiAqL1xuICByZWFkb25seSBsb29wQ291bnQ6IG51bWJlcjtcbiAgLyoqIEFjdGl2ZSB3YWl0IGxpbWl0cyBmb3IgbGltaXQtcmVsYXRlZCBmYWlsdXJlIG1lc3NhZ2VzLiAqL1xuICByZWFkb25seSBsaW1pdHM6IFJlc291cmNlV2FpdExpbWl0cztcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBzdGFibGUsIGdyZXAtZnJpZW5kbHkgZXJyb3IgbWVzc2FnZSBmb3Igd2FpdCBmYWlsdXJlcy5cbiAqXG4gKiBAcGFyYW0gcmVhc29uIC0gRmFpbHVyZSBjYXRlZ29yeS5cbiAqIEBwYXJhbSBjb250ZXh0IC0gSW5zdGFuY2UgaWQsIG1vZGUsIHN0YXRlLCBsb29wIGNvdW50LCBhbmQgbGltaXRzLlxuICogQHJldHVybnMgTWVzc2FnZSBwcmVmaXhlZCB3aXRoIGBSZXNvdXJjZVdhaXRGYWlsZWQ6YCAoZS5nLiBgUmVzb3VyY2VXYWl0RmFpbGVkOk1heExvb3BDb3VudEV4Y2VlZGVkOiAuLi5gKS5cbiAqL1xuZXhwb3J0IGNvbnN0IGZvcm1hdFJlc291cmNlV2FpdEZhaWx1cmUgPSAoXG4gIHJlYXNvbjogUmVzb3VyY2VXYWl0RmFpbHVyZVJlYXNvbixcbiAgY29udGV4dDogUmVzb3VyY2VXYWl0RmFpbHVyZUNvbnRleHQsXG4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBjb21tb24gPVxuICAgIGBpZGVudGlmaWVyPSR7Y29udGV4dC5pZGVudGlmaWVyfSBtb2RlPSR7Y29udGV4dC5tb2RlfSBjdXJyZW50U3RhdGU9JHtjb250ZXh0LmN1cnJlbnRTdGF0ZX0gbG9vcENvdW50PSR7Y29udGV4dC5sb29wQ291bnR9YDtcbiAgaWYgKHJlYXNvbiA9PT0gJ01heExvb3BDb3VudEV4Y2VlZGVkJykge1xuICAgIHJldHVybiBgUmVzb3VyY2VXYWl0RmFpbGVkOk1heExvb3BDb3VudEV4Y2VlZGVkOiAke2NvbW1vbn0gbWF4TG9vcENvdW50PSR7Y29udGV4dC5saW1pdHMubWF4TG9vcENvdW50fWA7XG4gIH1cbiAgaWYgKHJlYXNvbiA9PT0gJ01heEVsYXBzZWRUaW1lRXhjZWVkZWQnKSB7XG4gICAgcmV0dXJuIGBSZXNvdXJjZVdhaXRGYWlsZWQ6TWF4RWxhcHNlZFRpbWVFeGNlZWRlZDogJHtjb21tb259IG1heEVsYXBzZWRTZWNvbmRzPSR7Y29udGV4dC5saW1pdHMubWF4RWxhcHNlZFNlY29uZHN9YDtcbiAgfVxuICByZXR1cm4gYFJlc291cmNlV2FpdEZhaWxlZDpVbmV4cGVjdGVkSW5zdGFuY2VTdGF0ZTogJHtjb21tb259YDtcbn07XG4iXX0=
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment variable names for per-instance wait limits.
|
|
3
|
+
*
|
|
4
|
+
* Values are set by {@link EC2InstanceRunningScheduler} and read at handler cold start.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Lambda environment variable name for max wait loop count.
|
|
8
|
+
*
|
|
9
|
+
* @see {@link parseResourceWaitLimitsFromEnv} in `running-scheduler-wait-env.ts`
|
|
10
|
+
*/
|
|
11
|
+
export declare const PROCESS_RESOURCE_MAX_LOOP_COUNT_ENV = "PROCESS_RESOURCE_MAX_LOOP_COUNT";
|
|
12
|
+
/**
|
|
13
|
+
* Lambda environment variable name for max wait elapsed seconds.
|
|
14
|
+
*
|
|
15
|
+
* @see {@link parseResourceWaitLimitsFromEnv} in `running-scheduler-wait-env.ts`
|
|
16
|
+
*/
|
|
17
|
+
export declare const PROCESS_RESOURCE_MAX_ELAPSED_SECONDS_ENV = "PROCESS_RESOURCE_MAX_ELAPSED_SECONDS";
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Environment variable names for per-instance wait limits.
|
|
4
|
+
*
|
|
5
|
+
* Values are set by {@link EC2InstanceRunningScheduler} and read at handler cold start.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.PROCESS_RESOURCE_MAX_ELAPSED_SECONDS_ENV = exports.PROCESS_RESOURCE_MAX_LOOP_COUNT_ENV = void 0;
|
|
9
|
+
/**
|
|
10
|
+
* Lambda environment variable name for max wait loop count.
|
|
11
|
+
*
|
|
12
|
+
* @see {@link parseResourceWaitLimitsFromEnv} in `running-scheduler-wait-env.ts`
|
|
13
|
+
*/
|
|
14
|
+
exports.PROCESS_RESOURCE_MAX_LOOP_COUNT_ENV = 'PROCESS_RESOURCE_MAX_LOOP_COUNT';
|
|
15
|
+
/**
|
|
16
|
+
* Lambda environment variable name for max wait elapsed seconds.
|
|
17
|
+
*
|
|
18
|
+
* @see {@link parseResourceWaitLimitsFromEnv} in `running-scheduler-wait-env.ts`
|
|
19
|
+
*/
|
|
20
|
+
exports.PROCESS_RESOURCE_MAX_ELAPSED_SECONDS_ENV = 'PROCESS_RESOURCE_MAX_ELAPSED_SECONDS';
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmluZy1zY2hlZHVsZXItd2FpdC1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZnVuY3MvcnVubmluZy1zY2hlZHVsZXItd2FpdC1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7OztBQUVIOzs7O0dBSUc7QUFDVSxRQUFBLG1DQUFtQyxHQUFHLGlDQUFpQyxDQUFDO0FBRXJGOzs7O0dBSUc7QUFDVSxRQUFBLHdDQUF3QyxHQUFHLHNDQUFzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lcyBmb3IgcGVyLWluc3RhbmNlIHdhaXQgbGltaXRzLlxuICpcbiAqIFZhbHVlcyBhcmUgc2V0IGJ5IHtAbGluayBFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZXJ9IGFuZCByZWFkIGF0IGhhbmRsZXIgY29sZCBzdGFydC5cbiAqL1xuXG4vKipcbiAqIExhbWJkYSBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lIGZvciBtYXggd2FpdCBsb29wIGNvdW50LlxuICpcbiAqIEBzZWUge0BsaW5rIHBhcnNlUmVzb3VyY2VXYWl0TGltaXRzRnJvbUVudn0gaW4gYHJ1bm5pbmctc2NoZWR1bGVyLXdhaXQtZW52LnRzYFxuICovXG5leHBvcnQgY29uc3QgUFJPQ0VTU19SRVNPVVJDRV9NQVhfTE9PUF9DT1VOVF9FTlYgPSAnUFJPQ0VTU19SRVNPVVJDRV9NQVhfTE9PUF9DT1VOVCc7XG5cbi8qKlxuICogTGFtYmRhIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWUgZm9yIG1heCB3YWl0IGVsYXBzZWQgc2Vjb25kcy5cbiAqXG4gKiBAc2VlIHtAbGluayBwYXJzZVJlc291cmNlV2FpdExpbWl0c0Zyb21FbnZ9IGluIGBydW5uaW5nLXNjaGVkdWxlci13YWl0LWVudi50c2BcbiAqL1xuZXhwb3J0IGNvbnN0IFBST0NFU1NfUkVTT1VSQ0VfTUFYX0VMQVBTRURfU0VDT05EU19FTlYgPSAnUFJPQ0VTU19SRVNPVVJDRV9NQVhfRUxBUFNFRF9TRUNPTkRTJztcbiJdfQ==
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ResourceWaitLimits } from './running-scheduler-predicates';
|
|
2
|
+
/**
|
|
3
|
+
* Reads per-instance wait limits from Lambda environment variables set by the CDK construct.
|
|
4
|
+
*
|
|
5
|
+
* @returns Parsed limits, using {@link DEFAULT_RESOURCE_WAIT_LIMITS} when variables are unset.
|
|
6
|
+
* @throws {import('strict-env-resolver').StrictEnvValidationError} When a set variable is not a finite number.
|
|
7
|
+
* @throws {Error} When a set variable is zero or negative.
|
|
8
|
+
*/
|
|
9
|
+
export declare const parseResourceWaitLimitsFromEnv: () => ResourceWaitLimits;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseResourceWaitLimitsFromEnv = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Lambda-only environment parsing for per-instance wait limits.
|
|
6
|
+
*
|
|
7
|
+
* Bundled into the running scheduler function; not imported from CDK constructs.
|
|
8
|
+
*/
|
|
9
|
+
const strict_env_resolver_1 = require("strict-env-resolver");
|
|
10
|
+
const running_scheduler_predicates_1 = require("./running-scheduler-predicates");
|
|
11
|
+
const running_scheduler_wait_config_1 = require("./running-scheduler-wait-config");
|
|
12
|
+
/**
|
|
13
|
+
* Ensures a parsed env integer is strictly positive.
|
|
14
|
+
*
|
|
15
|
+
* `StrictEnvType.Number` accepts any finite number (including zero and negatives);
|
|
16
|
+
* wait limits require values greater than zero.
|
|
17
|
+
*
|
|
18
|
+
* @param key - Environment variable name used in error messages.
|
|
19
|
+
* @param value - Parsed number from {@link StrictEnvResolver.resolveAll}.
|
|
20
|
+
* @returns `value` when it is greater than zero.
|
|
21
|
+
* @throws {Error} When `value` is zero or negative.
|
|
22
|
+
*/
|
|
23
|
+
const assertPositiveEnvInt = (key, value) => {
|
|
24
|
+
if (value <= 0) {
|
|
25
|
+
const raw = process.env[key];
|
|
26
|
+
throw new Error(`Invalid ${key}: must be a positive integer (got "${raw ?? ''}")`);
|
|
27
|
+
}
|
|
28
|
+
return value;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Reads per-instance wait limits from Lambda environment variables set by the CDK construct.
|
|
32
|
+
*
|
|
33
|
+
* @returns Parsed limits, using {@link DEFAULT_RESOURCE_WAIT_LIMITS} when variables are unset.
|
|
34
|
+
* @throws {import('strict-env-resolver').StrictEnvValidationError} When a set variable is not a finite number.
|
|
35
|
+
* @throws {Error} When a set variable is zero or negative.
|
|
36
|
+
*/
|
|
37
|
+
const parseResourceWaitLimitsFromEnv = () => {
|
|
38
|
+
const parsed = strict_env_resolver_1.StrictEnvResolver.resolveAll({
|
|
39
|
+
[running_scheduler_wait_config_1.PROCESS_RESOURCE_MAX_LOOP_COUNT_ENV]: [
|
|
40
|
+
strict_env_resolver_1.StrictEnvType.Number,
|
|
41
|
+
{ default: running_scheduler_predicates_1.DEFAULT_RESOURCE_WAIT_LIMITS.maxLoopCount },
|
|
42
|
+
],
|
|
43
|
+
[running_scheduler_wait_config_1.PROCESS_RESOURCE_MAX_ELAPSED_SECONDS_ENV]: [
|
|
44
|
+
strict_env_resolver_1.StrictEnvType.Number,
|
|
45
|
+
{ default: running_scheduler_predicates_1.DEFAULT_RESOURCE_WAIT_LIMITS.maxElapsedSeconds },
|
|
46
|
+
],
|
|
47
|
+
});
|
|
48
|
+
return {
|
|
49
|
+
maxLoopCount: assertPositiveEnvInt(running_scheduler_wait_config_1.PROCESS_RESOURCE_MAX_LOOP_COUNT_ENV, parsed[running_scheduler_wait_config_1.PROCESS_RESOURCE_MAX_LOOP_COUNT_ENV]),
|
|
50
|
+
maxElapsedSeconds: assertPositiveEnvInt(running_scheduler_wait_config_1.PROCESS_RESOURCE_MAX_ELAPSED_SECONDS_ENV, parsed[running_scheduler_wait_config_1.PROCESS_RESOURCE_MAX_ELAPSED_SECONDS_ENV]),
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
exports.parseResourceWaitLimitsFromEnv = parseResourceWaitLimitsFromEnv;
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmluZy1zY2hlZHVsZXItd2FpdC1lbnYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZnVuY3MvcnVubmluZy1zY2hlZHVsZXItd2FpdC1lbnYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7Ozs7R0FJRztBQUNILDZEQUF1RTtBQUN2RSxpRkFHd0M7QUFDeEMsbUZBR3lDO0FBRXpDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLG9CQUFvQixHQUFHLENBQUMsR0FBVyxFQUFFLEtBQWEsRUFBVSxFQUFFO0lBQ2xFLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2YsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLFdBQVcsR0FBRyxzQ0FBc0MsR0FBRyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyxDQUFDO0FBRUY7Ozs7OztHQU1HO0FBQ0ksTUFBTSw4QkFBOEIsR0FBRyxHQUF1QixFQUFFO0lBQ3JFLE1BQU0sTUFBTSxHQUFHLHVDQUFpQixDQUFDLFVBQVUsQ0FBQztRQUMxQyxDQUFDLG1FQUFtQyxDQUFDLEVBQUU7WUFDckMsbUNBQWEsQ0FBQyxNQUFNO1lBQ3BCLEVBQUUsT0FBTyxFQUFFLDJEQUE0QixDQUFDLFlBQVksRUFBRTtTQUN2RDtRQUNELENBQUMsd0VBQXdDLENBQUMsRUFBRTtZQUMxQyxtQ0FBYSxDQUFDLE1BQU07WUFDcEIsRUFBRSxPQUFPLEVBQUUsMkRBQTRCLENBQUMsaUJBQWlCLEVBQUU7U0FDNUQ7S0FDRixDQUFDLENBQUM7SUFFSCxPQUFPO1FBQ0wsWUFBWSxFQUFFLG9CQUFvQixDQUNoQyxtRUFBbUMsRUFDbkMsTUFBTSxDQUFDLG1FQUFtQyxDQUFDLENBQzVDO1FBQ0QsaUJBQWlCLEVBQUUsb0JBQW9CLENBQ3JDLHdFQUF3QyxFQUN4QyxNQUFNLENBQUMsd0VBQXdDLENBQUMsQ0FDakQ7S0FDRixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBdEJXLFFBQUEsOEJBQThCLGtDQXNCekMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIExhbWJkYS1vbmx5IGVudmlyb25tZW50IHBhcnNpbmcgZm9yIHBlci1pbnN0YW5jZSB3YWl0IGxpbWl0cy5cbiAqXG4gKiBCdW5kbGVkIGludG8gdGhlIHJ1bm5pbmcgc2NoZWR1bGVyIGZ1bmN0aW9uOyBub3QgaW1wb3J0ZWQgZnJvbSBDREsgY29uc3RydWN0cy5cbiAqL1xuaW1wb3J0IHsgU3RyaWN0RW52UmVzb2x2ZXIsIFN0cmljdEVudlR5cGUgfSBmcm9tICdzdHJpY3QtZW52LXJlc29sdmVyJztcbmltcG9ydCB7XG4gIERFRkFVTFRfUkVTT1VSQ0VfV0FJVF9MSU1JVFMsXG4gIHR5cGUgUmVzb3VyY2VXYWl0TGltaXRzLFxufSBmcm9tICcuL3J1bm5pbmctc2NoZWR1bGVyLXByZWRpY2F0ZXMnO1xuaW1wb3J0IHtcbiAgUFJPQ0VTU19SRVNPVVJDRV9NQVhfRUxBUFNFRF9TRUNPTkRTX0VOVixcbiAgUFJPQ0VTU19SRVNPVVJDRV9NQVhfTE9PUF9DT1VOVF9FTlYsXG59IGZyb20gJy4vcnVubmluZy1zY2hlZHVsZXItd2FpdC1jb25maWcnO1xuXG4vKipcbiAqIEVuc3VyZXMgYSBwYXJzZWQgZW52IGludGVnZXIgaXMgc3RyaWN0bHkgcG9zaXRpdmUuXG4gKlxuICogYFN0cmljdEVudlR5cGUuTnVtYmVyYCBhY2NlcHRzIGFueSBmaW5pdGUgbnVtYmVyIChpbmNsdWRpbmcgemVybyBhbmQgbmVnYXRpdmVzKTtcbiAqIHdhaXQgbGltaXRzIHJlcXVpcmUgdmFsdWVzIGdyZWF0ZXIgdGhhbiB6ZXJvLlxuICpcbiAqIEBwYXJhbSBrZXkgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lIHVzZWQgaW4gZXJyb3IgbWVzc2FnZXMuXG4gKiBAcGFyYW0gdmFsdWUgLSBQYXJzZWQgbnVtYmVyIGZyb20ge0BsaW5rIFN0cmljdEVudlJlc29sdmVyLnJlc29sdmVBbGx9LlxuICogQHJldHVybnMgYHZhbHVlYCB3aGVuIGl0IGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLlxuICogQHRocm93cyB7RXJyb3J9IFdoZW4gYHZhbHVlYCBpcyB6ZXJvIG9yIG5lZ2F0aXZlLlxuICovXG5jb25zdCBhc3NlcnRQb3NpdGl2ZUVudkludCA9IChrZXk6IHN0cmluZywgdmFsdWU6IG51bWJlcik6IG51bWJlciA9PiB7XG4gIGlmICh2YWx1ZSA8PSAwKSB7XG4gICAgY29uc3QgcmF3ID0gcHJvY2Vzcy5lbnZba2V5XTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgJHtrZXl9OiBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciAoZ290IFwiJHtyYXcgPz8gJyd9XCIpYCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuLyoqXG4gKiBSZWFkcyBwZXItaW5zdGFuY2Ugd2FpdCBsaW1pdHMgZnJvbSBMYW1iZGEgZW52aXJvbm1lbnQgdmFyaWFibGVzIHNldCBieSB0aGUgQ0RLIGNvbnN0cnVjdC5cbiAqXG4gKiBAcmV0dXJucyBQYXJzZWQgbGltaXRzLCB1c2luZyB7QGxpbmsgREVGQVVMVF9SRVNPVVJDRV9XQUlUX0xJTUlUU30gd2hlbiB2YXJpYWJsZXMgYXJlIHVuc2V0LlxuICogQHRocm93cyB7aW1wb3J0KCdzdHJpY3QtZW52LXJlc29sdmVyJykuU3RyaWN0RW52VmFsaWRhdGlvbkVycm9yfSBXaGVuIGEgc2V0IHZhcmlhYmxlIGlzIG5vdCBhIGZpbml0ZSBudW1iZXIuXG4gKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBhIHNldCB2YXJpYWJsZSBpcyB6ZXJvIG9yIG5lZ2F0aXZlLlxuICovXG5leHBvcnQgY29uc3QgcGFyc2VSZXNvdXJjZVdhaXRMaW1pdHNGcm9tRW52ID0gKCk6IFJlc291cmNlV2FpdExpbWl0cyA9PiB7XG4gIGNvbnN0IHBhcnNlZCA9IFN0cmljdEVudlJlc29sdmVyLnJlc29sdmVBbGwoe1xuICAgIFtQUk9DRVNTX1JFU09VUkNFX01BWF9MT09QX0NPVU5UX0VOVl06IFtcbiAgICAgIFN0cmljdEVudlR5cGUuTnVtYmVyLFxuICAgICAgeyBkZWZhdWx0OiBERUZBVUxUX1JFU09VUkNFX1dBSVRfTElNSVRTLm1heExvb3BDb3VudCB9LFxuICAgIF0sXG4gICAgW1BST0NFU1NfUkVTT1VSQ0VfTUFYX0VMQVBTRURfU0VDT05EU19FTlZdOiBbXG4gICAgICBTdHJpY3RFbnZUeXBlLk51bWJlcixcbiAgICAgIHsgZGVmYXVsdDogREVGQVVMVF9SRVNPVVJDRV9XQUlUX0xJTUlUUy5tYXhFbGFwc2VkU2Vjb25kcyB9LFxuICAgIF0sXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgbWF4TG9vcENvdW50OiBhc3NlcnRQb3NpdGl2ZUVudkludChcbiAgICAgIFBST0NFU1NfUkVTT1VSQ0VfTUFYX0xPT1BfQ09VTlRfRU5WLFxuICAgICAgcGFyc2VkW1BST0NFU1NfUkVTT1VSQ0VfTUFYX0xPT1BfQ09VTlRfRU5WXSxcbiAgICApLFxuICAgIG1heEVsYXBzZWRTZWNvbmRzOiBhc3NlcnRQb3NpdGl2ZUVudkludChcbiAgICAgIFBST0NFU1NfUkVTT1VSQ0VfTUFYX0VMQVBTRURfU0VDT05EU19FTlYsXG4gICAgICBwYXJzZWRbUFJPQ0VTU19SRVNPVVJDRV9NQVhfRUxBUFNFRF9TRUNPTkRTX0VOVl0sXG4gICAgKSxcbiAgfTtcbn07XG4iXX0=
|
|
@@ -29,15 +29,22 @@ export interface SchedulerEvent {
|
|
|
29
29
|
* in parallel (bounded concurrency), posts a parent Slack message and per-instance thread replies,
|
|
30
30
|
* and uses durable `step` / `wait` / `map` so the run can resume across suspensions.
|
|
31
31
|
*
|
|
32
|
-
* Reads per-instance
|
|
33
|
-
* `PROCESS_RESOURCE_MAX_ELAPSED_SECONDS` via {@link
|
|
32
|
+
* Reads per-instance wait limits from `PROCESS_RESOURCE_MAX_LOOP_COUNT` and
|
|
33
|
+
* `PROCESS_RESOURCE_MAX_ELAPSED_SECONDS` via {@link parseResourceWaitLimitsFromEnv}.
|
|
34
|
+
* Loads the Slack secret via {@link secretFetcher} (Parameters and Secrets Lambda Extension).
|
|
35
|
+
* Slack API failures are logged as `running-scheduler: Slack post failed` for CloudWatch log filters.
|
|
34
36
|
*
|
|
35
37
|
* @param event - Payload from EventBridge Scheduler; must include `Params.TagKey`, `Params.TagValues`, `Params.Mode`.
|
|
36
38
|
* @param ctx - Root durable execution context.
|
|
37
39
|
* @returns
|
|
38
40
|
* - `{ status: 'TargetResourcesNotFound' }` when no instances match the tag filter.
|
|
39
41
|
* - `{ status: 'Completed', processed, results }` when instances were handled (`results` entries match {@link processOneResource} return shape).
|
|
40
|
-
* @throws {Error} If `Params` is invalid,
|
|
41
|
-
* the Slack secret is incomplete,
|
|
42
|
+
* @throws {Error} If `Params` is invalid, wait env vars are not positive integers,
|
|
43
|
+
* the Slack secret is incomplete, instance processing fails (including `ResourceWaitFailed:*` errors),
|
|
44
|
+
* or the secret cannot be read from the extension (e.g. outside Lambda or missing `AWS_SESSION_TOKEN`).
|
|
45
|
+
* @throws {import('strict-env-resolver').StrictEnvValidationError} When required env vars are missing or not valid numbers.
|
|
46
|
+
* @throws {import('fetch-retrier').FetchRetrierHttpError} When the extension returns a non-retriable HTTP error.
|
|
47
|
+
* @throws {import('fetch-retrier').FetchRetrierNetworkError} When extension requests fail at the network level.
|
|
48
|
+
* @throws {import('fetch-retrier').FetchRetrierAbortError} When extension requests time out after all retries.
|
|
42
49
|
*/
|
|
43
50
|
export declare const handler: import("@aws/durable-execution-sdk-js").DurableLambdaHandler;
|