@lambda-kata/cdk 0.1.3-rc.85 → 0.1.3-rc.87
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/out/dist/index.js +236 -43
- package/out/tsc/src/config-layer.d.ts +0 -31
- package/out/tsc/src/index.d.ts +2 -2
- package/out/tsc/src/snapstart-activator.d.ts +74 -18
- package/out/tsc/src/snapstart-construct.d.ts +1 -7
- package/out/tsc/src/types.d.ts +1 -1
- package/package.json +2 -3
- package/out/dist/python/kata_bootstrap.py +0 -82
|
@@ -119,37 +119,6 @@ export declare const HANDLER_CONFIG_KEY = "original_js_handler";
|
|
|
119
119
|
* The name of the compiled middleware file within the .kata directory.
|
|
120
120
|
*/
|
|
121
121
|
export declare const MIDDLEWARE_FILE_NAME = "middleware.js";
|
|
122
|
-
/**
|
|
123
|
-
* Bootstrap handler module name.
|
|
124
|
-
* The compiled .pyc is at src/python/dist/kata_bootstrap.pyc and is placed
|
|
125
|
-
* in the config layer at /opt/python/kata_bootstrap.pyc so the Python 3.12
|
|
126
|
-
* runtime resolves it via PYTHONPATH.
|
|
127
|
-
*
|
|
128
|
-
* Using a pre-compiled bootstrap handler prevents SnapStart snapshot failures
|
|
129
|
-
* caused by import errors in the Lambda Kata Layer (C-bridge, Node.js binary, etc.).
|
|
130
|
-
* Source: src/python/kata_bootstrap.py — compiled via `yarn build:python`.
|
|
131
|
-
*/
|
|
132
|
-
export declare const BOOTSTRAP_HANDLER_MODULE = "kata_bootstrap";
|
|
133
|
-
/**
|
|
134
|
-
* Full handler path for the bootstrap handler.
|
|
135
|
-
* Format: "<module>.<function>" as required by Lambda handler configuration.
|
|
136
|
-
*/
|
|
137
|
-
export declare const BOOTSTRAP_HANDLER_PATH = "kata_bootstrap.handler";
|
|
138
|
-
/**
|
|
139
|
-
* Resolves the absolute path to the bootstrap handler .py source file.
|
|
140
|
-
*
|
|
141
|
-
* Two resolution paths:
|
|
142
|
-
* 1. Production (bundled JS / npm package): out/dist/python/kata_bootstrap.py
|
|
143
|
-
* __dirname = out/dist/ → __dirname/python/kata_bootstrap.py
|
|
144
|
-
* 2. Development (ts-jest / source): src/python/kata_bootstrap.py
|
|
145
|
-
* __dirname = src/ → __dirname/python/kata_bootstrap.py
|
|
146
|
-
*
|
|
147
|
-
* @returns Absolute path to kata_bootstrap.py
|
|
148
|
-
* @throws Error if the source file is not found
|
|
149
|
-
*
|
|
150
|
-
* @internal
|
|
151
|
-
*/
|
|
152
|
-
export declare function resolveBootstrapPyPath(): string;
|
|
153
122
|
/**
|
|
154
123
|
* Creates a Lambda Layer containing the kata configuration.
|
|
155
124
|
*
|
package/out/tsc/src/index.d.ts
CHANGED
|
@@ -24,8 +24,8 @@ export { resolveAccountId, resolveAccountIdWithSource, isValidAccountIdFormat, A
|
|
|
24
24
|
export { resolveAccountIdSync, resolveAccountIdSyncWithSource, resolveRegionSync, SyncAccountResolutionError, SyncAccountResolutionResult, SyncAccountResolverOptions, } from './sync-account-resolver';
|
|
25
25
|
export { kata, kataWithAccountId, applyTransformation, handleUnlicensed, isKataTransformed, getKataPromise, extractBundlePathFromHandler, KataWrapperOptions, KataResult, } from './kata-wrapper';
|
|
26
26
|
export { SnapStartActivator, SnapStartActivatorProps, } from './snapstart-construct';
|
|
27
|
-
export { activateSnapStart,
|
|
28
|
-
export { createKataConfigLayer, generateConfigContent,
|
|
27
|
+
export { activateSnapStart, SnapStartActivationResult, SnapStartActivatorConfig, } from './snapstart-activator';
|
|
28
|
+
export { createKataConfigLayer, generateConfigContent, KataConfigLayerProps, CONFIG_DIR_NAME, CONFIG_FILE_NAME, HANDLER_CONFIG_KEY, } from './config-layer';
|
|
29
29
|
export { EnsureNodeRuntimeLayerOptions, EnsureNodeRuntimeLayerResult, NodeVersionInfo, LayerInfo, LayerSearchOptions, LayerRequirements, LayerCreationOptions, Logger, RuntimeDetector, LayerManager, ErrorCodes, NodeRuntimeLayerError, VersionCacheEntry, LayerMetadata, NodejsLayerDeploymentOptions, NodejsLayerDeploymentResult, MultiArchitectureDeploymentResult, } from './nodejs-layer-manager';
|
|
30
30
|
export { DockerRuntimeDetector, DockerRuntimeDetectorOptions, } from './docker-runtime-detector';
|
|
31
31
|
export { AWSLayerManager, AWSLayerManagerOptions, } from './aws-layer-manager';
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SnapStart Activator - Custom Resource Handler
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* This module provides the Lambda handler for a CloudFormation Custom Resource
|
|
5
|
+
* that enables SnapStart on Lambda functions after deployment. SnapStart requires
|
|
6
|
+
* asynchronous waiting for snapshot creation, which cannot be done during CDK synthesis.
|
|
5
7
|
*
|
|
6
8
|
* The activation process:
|
|
7
9
|
* 1. Wait for function to be Active
|
|
@@ -9,11 +11,14 @@
|
|
|
9
11
|
* 3. Wait for configuration update
|
|
10
12
|
* 4. Publish new version (triggers snapshot creation)
|
|
11
13
|
* 5. Wait for snapshot to be ready (up to 3 minutes)
|
|
12
|
-
* 6. Create/update alias pointing to the new version
|
|
14
|
+
* 6. Create/update 'kata' alias pointing to the new version
|
|
13
15
|
*
|
|
14
16
|
* @module snapstart-activator
|
|
15
17
|
*/
|
|
16
18
|
import { LambdaClient } from '@aws-sdk/client-lambda';
|
|
19
|
+
/**
|
|
20
|
+
* Custom Resource event from CloudFormation.
|
|
21
|
+
*/
|
|
17
22
|
export interface CustomResourceEvent {
|
|
18
23
|
RequestType: 'Create' | 'Update' | 'Delete';
|
|
19
24
|
ServiceToken: string;
|
|
@@ -33,6 +38,9 @@ export interface CustomResourceEvent {
|
|
|
33
38
|
AliasName?: string;
|
|
34
39
|
};
|
|
35
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* Custom Resource response to CloudFormation.
|
|
43
|
+
*/
|
|
36
44
|
export interface CustomResourceResponse {
|
|
37
45
|
Status: 'SUCCESS' | 'FAILED';
|
|
38
46
|
Reason?: string;
|
|
@@ -47,43 +55,91 @@ export interface CustomResourceResponse {
|
|
|
47
55
|
OptimizationStatus?: string;
|
|
48
56
|
};
|
|
49
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* Result of a successful SnapStart activation cycle.
|
|
60
|
+
*
|
|
61
|
+
* Returned by {@link activateSnapStart} after enabling SnapStart,
|
|
62
|
+
* publishing a version, waiting for snapshot readiness, and creating/updating an alias.
|
|
63
|
+
*
|
|
64
|
+
* @see {@link SnapStartActivatorConfig} for configuration options
|
|
65
|
+
*/
|
|
50
66
|
export interface SnapStartActivationResult {
|
|
67
|
+
/** The published Lambda version number (e.g. "42"). */
|
|
51
68
|
version: string;
|
|
69
|
+
/** The alias name that was created or updated (e.g. "kata"). */
|
|
52
70
|
aliasName: string;
|
|
71
|
+
/** The full ARN of the alias (e.g. "arn:aws:lambda:us-east-1:123456789012:function:my-fn:kata"). */
|
|
53
72
|
aliasArn: string;
|
|
73
|
+
/** The SnapStart optimization status of the published version ("On", "Off", or "Unknown"). */
|
|
54
74
|
optimizationStatus: string;
|
|
55
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* Configuration options for the SnapStart activation cycle.
|
|
78
|
+
*
|
|
79
|
+
* All properties are optional and fall back to sensible defaults.
|
|
80
|
+
*
|
|
81
|
+
* @see {@link activateSnapStart} for the function that consumes this config
|
|
82
|
+
*/
|
|
56
83
|
export interface SnapStartActivatorConfig {
|
|
84
|
+
/**
|
|
85
|
+
* Maximum time in seconds to wait for snapshot creation before proceeding.
|
|
86
|
+
* If exceeded, a warning is logged and alias creation continues.
|
|
87
|
+
* @default 180
|
|
88
|
+
*/
|
|
57
89
|
snapshotTimeoutSeconds?: number;
|
|
90
|
+
/**
|
|
91
|
+
* Interval in seconds between polling attempts for snapshot readiness.
|
|
92
|
+
* @default 2
|
|
93
|
+
*/
|
|
58
94
|
pollingIntervalSeconds?: number;
|
|
95
|
+
/**
|
|
96
|
+
* The Lambda alias name to create or update after publishing a version.
|
|
97
|
+
* @default 'kata'
|
|
98
|
+
*/
|
|
59
99
|
aliasName?: string;
|
|
60
|
-
/**
|
|
61
|
-
|
|
100
|
+
/**
|
|
101
|
+
* @internal Override pre-publish delay in milliseconds (for testing only).
|
|
102
|
+
* @default 3000
|
|
103
|
+
*/
|
|
104
|
+
_prePublishDelayMs?: number;
|
|
105
|
+
/**
|
|
106
|
+
* @internal Override retry delay in milliseconds (for testing only).
|
|
107
|
+
* @default 5000
|
|
108
|
+
*/
|
|
109
|
+
_retryDelayMs?: number;
|
|
62
110
|
}
|
|
63
|
-
/**
|
|
111
|
+
/**
|
|
112
|
+
* Sleep for specified milliseconds.
|
|
113
|
+
* @internal Exported for testability — tests can jest.spyOn to avoid real delays.
|
|
114
|
+
*/
|
|
64
115
|
export declare const _testable: {
|
|
65
116
|
sleep(ms: number): Promise<void>;
|
|
66
117
|
};
|
|
67
118
|
/**
|
|
68
119
|
* Activates SnapStart on a Lambda function.
|
|
69
120
|
*
|
|
70
|
-
*
|
|
71
|
-
* 1.
|
|
72
|
-
* 2.
|
|
73
|
-
* 3.
|
|
74
|
-
* 4.
|
|
75
|
-
* 5.
|
|
76
|
-
* 6.
|
|
121
|
+
* This function performs the full SnapStart activation cycle:
|
|
122
|
+
* 1. Ensures function is Active
|
|
123
|
+
* 2. Enables SnapStart configuration
|
|
124
|
+
* 3. Waits for configuration update
|
|
125
|
+
* 4. Publishes new version (with retry on snapshot failure)
|
|
126
|
+
* 5. Waits for snapshot creation
|
|
127
|
+
* 6. Creates/updates alias
|
|
128
|
+
*
|
|
129
|
+
* Steps 3+4 are wrapped in a retry loop: on State: Failed, a new version
|
|
130
|
+
* is published (up to MAX_PUBLISH_RETRIES attempts) to handle transient
|
|
131
|
+
* initialization failures during snapshot creation.
|
|
77
132
|
*
|
|
78
|
-
*
|
|
133
|
+
* @param lambdaClient - AWS Lambda client
|
|
134
|
+
* @param functionName - Name or ARN of the Lambda function
|
|
135
|
+
* @param config - Optional configuration
|
|
136
|
+
* @returns Activation result with version and alias information
|
|
79
137
|
*/
|
|
80
138
|
export declare function activateSnapStart(lambdaClient: LambdaClient, functionName: string, config?: SnapStartActivatorConfig): Promise<SnapStartActivationResult>;
|
|
81
139
|
/**
|
|
82
|
-
*
|
|
140
|
+
* Lambda handler for CloudFormation Custom Resource.
|
|
83
141
|
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
* - On error + Update → SUCCESS (prevent rollback deadlock)
|
|
87
|
-
* - On error + Create → FAILED
|
|
142
|
+
* This handler is invoked by CloudFormation when the custom resource
|
|
143
|
+
* is created, updated, or deleted.
|
|
88
144
|
*/
|
|
89
145
|
export declare function handler(event: CustomResourceEvent): Promise<CustomResourceResponse>;
|
|
@@ -43,7 +43,7 @@ export interface SnapStartActivatorProps {
|
|
|
43
43
|
* 2. Enables SnapStart configuration (`ApplyOn: PublishedVersions`)
|
|
44
44
|
* 3. Publishes a new version (triggers snapshot creation)
|
|
45
45
|
* 4. Polls until the snapshot is ready (or timeout is reached)
|
|
46
|
-
* 5. Creates or updates an alias pointing to the new version
|
|
46
|
+
* 5. Creates or updates an alias pointing to the new version
|
|
47
47
|
*
|
|
48
48
|
* After deployment, the published version number and alias ARN are available
|
|
49
49
|
* as CloudFormation attributes via {@link versionRef} and {@link aliasArnRef}.
|
|
@@ -107,12 +107,6 @@ export declare class SnapStartActivator extends Construct {
|
|
|
107
107
|
*
|
|
108
108
|
* This is a self-contained version of the snapstart-activator logic
|
|
109
109
|
* that can be deployed as inline Lambda code.
|
|
110
|
-
*
|
|
111
|
-
* Matches the proven deploy_lambda.py reference:
|
|
112
|
-
* - ONE publish, poll, ALWAYS create alias regardless of snapshot outcome
|
|
113
|
-
* - No retries on Failed state
|
|
114
|
-
* - On Update errors → return SUCCESS (prevent rollback deadlock)
|
|
115
|
-
* - On Create errors → throw (return FAILED)
|
|
116
110
|
*/
|
|
117
111
|
private generateHandlerCode;
|
|
118
112
|
}
|
package/out/tsc/src/types.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lambda-kata/cdk",
|
|
3
|
-
"version": "0.1.3-rc.
|
|
3
|
+
"version": "0.1.3-rc.87",
|
|
4
4
|
"description": "AWS CDK integration for Lambda Kata - Node.js Lambdas running via Lambda Kata runtime",
|
|
5
5
|
"main": "out/dist/index.js",
|
|
6
6
|
"types": "out/tsc/src/index.d.ts",
|
|
7
7
|
"scripts": {
|
|
8
|
-
"build
|
|
9
|
-
"build": "rm -rf ./dist && rm -rf ./out && rm -rf ./lib && yarn run build:cdk && yarn run types && yarn run build:python",
|
|
8
|
+
"build": "rm -rf ./dist && rm -rf ./out && rm -rf ./lib && yarn run build:cdk && yarn run types",
|
|
10
9
|
"types": "tsc --emitDeclarationOnly && tsc-alias",
|
|
11
10
|
"build:cdk": "yarn run build:config && node dist/utils/build.js --target=cdk",
|
|
12
11
|
"build:minify": "yarn run build:config && node dist/utils/build.js",
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Lambda Kata Bootstrap Handler
|
|
3
|
-
|
|
4
|
-
Resilient entry point that delegates to lambdakata.optimized_handler
|
|
5
|
-
from the Lambda Kata Layer. Ensures SnapStart snapshot creation succeeds
|
|
6
|
-
by catching init errors gracefully.
|
|
7
|
-
|
|
8
|
-
Copyright (C) 2025-present Raman Marozau, Work Target Insight Function.
|
|
9
|
-
SPDX-License-Identifier: Apache-2.0
|
|
10
|
-
"""
|
|
11
|
-
|
|
12
|
-
import json
|
|
13
|
-
import os
|
|
14
|
-
import sys
|
|
15
|
-
import traceback
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
# ---------------------------------------------------------------------------
|
|
19
|
-
# INIT PHASE — executed once during cold start / SnapStart snapshot creation
|
|
20
|
-
# ---------------------------------------------------------------------------
|
|
21
|
-
|
|
22
|
-
_real_handler = None
|
|
23
|
-
_init_error = None
|
|
24
|
-
_init_diagnostics = {}
|
|
25
|
-
|
|
26
|
-
try:
|
|
27
|
-
_init_diagnostics = {
|
|
28
|
-
"python_version": sys.version,
|
|
29
|
-
"opt_contents": sorted(os.listdir("/opt")) if os.path.isdir("/opt") else [],
|
|
30
|
-
"opt_python_exists": os.path.isdir("/opt/python"),
|
|
31
|
-
"lambdakata_in_opt": (
|
|
32
|
-
os.path.isdir("/opt/lambdakata")
|
|
33
|
-
or os.path.isdir("/opt/python/lambdakata")
|
|
34
|
-
),
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
from lambdakata.optimized_handler import lambda_handler as _real_handler # type: ignore[import-untyped]
|
|
38
|
-
|
|
39
|
-
except ImportError as exc:
|
|
40
|
-
_init_error = exc
|
|
41
|
-
_init_diagnostics["import_error"] = str(exc)
|
|
42
|
-
_init_diagnostics["traceback"] = traceback.format_exc()
|
|
43
|
-
print(
|
|
44
|
-
f"[Lambda Kata] WARNING: Failed to import lambdakata.optimized_handler: {exc}",
|
|
45
|
-
file=sys.stderr,
|
|
46
|
-
)
|
|
47
|
-
|
|
48
|
-
except Exception as exc: # noqa: BLE001 — intentional broad catch for resilience
|
|
49
|
-
_init_error = exc
|
|
50
|
-
_init_diagnostics["init_error"] = str(exc)
|
|
51
|
-
_init_diagnostics["error_type"] = type(exc).__name__
|
|
52
|
-
_init_diagnostics["traceback"] = traceback.format_exc()
|
|
53
|
-
print(
|
|
54
|
-
f"[Lambda Kata] WARNING: Init error: {type(exc).__name__}: {exc}",
|
|
55
|
-
file=sys.stderr,
|
|
56
|
-
)
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
# ---------------------------------------------------------------------------
|
|
60
|
-
# HANDLER
|
|
61
|
-
# ---------------------------------------------------------------------------
|
|
62
|
-
|
|
63
|
-
def handler(event, context):
|
|
64
|
-
"""Delegate to the real Lambda Kata handler, or return diagnostics."""
|
|
65
|
-
if _real_handler is not None:
|
|
66
|
-
return _real_handler(event, context)
|
|
67
|
-
|
|
68
|
-
body = {
|
|
69
|
-
"error": "Lambda Kata runtime initialization failed",
|
|
70
|
-
"message": str(_init_error) if _init_error else "Unknown",
|
|
71
|
-
"error_type": type(_init_error).__name__ if _init_error else "Unknown",
|
|
72
|
-
"diagnostics": {
|
|
73
|
-
"lambdakata_in_opt": _init_diagnostics.get("lambdakata_in_opt", False),
|
|
74
|
-
"opt_python_exists": _init_diagnostics.get("opt_python_exists", False),
|
|
75
|
-
"opt_contents": _init_diagnostics.get("opt_contents", []),
|
|
76
|
-
},
|
|
77
|
-
}
|
|
78
|
-
print(
|
|
79
|
-
f"[Lambda Kata] Runtime not initialized: {json.dumps(body)}",
|
|
80
|
-
file=sys.stderr,
|
|
81
|
-
)
|
|
82
|
-
return {"statusCode": 503, "body": json.dumps(body)}
|