@fjall/components-infrastructure 0.80.4 → 0.81.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/dist/lib/__tests__/setup.js +1 -78
- package/dist/lib/resources/aws/compute/ecsFreeTier.d.ts +2 -1
- package/dist/lib/resources/aws/compute/ecsFreeTier.js +1 -352
- package/dist/lib/resources/aws/compute/ecsSpot.d.ts +2 -1
- package/dist/lib/resources/aws/compute/ecsSpot.js +1 -332
- package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.js +1 -180
- package/dist/lib/resources/aws/utilities/cfnOutput.js +1 -13
- package/package.json +3 -3
- package/dist/lib/patterns/aws/cdn.d.ts +0 -133
- package/dist/lib/patterns/aws/cdn.js +0 -216
- package/dist/lib/patterns/aws/dynamodb.d.ts +0 -66
- package/dist/lib/patterns/aws/dynamodb.js +0 -106
- package/dist/lib/patterns/aws/loadBalancer.d.ts +0 -163
- package/dist/lib/patterns/aws/loadBalancer.js +0 -278
- package/dist/lib/patterns/aws/queue.d.ts +0 -61
- package/dist/lib/patterns/aws/queue.js +0 -103
- package/dist/lib/resources/aws/cdn/cloudFront.d.ts +0 -65
- package/dist/lib/resources/aws/cdn/cloudFront.js +0 -135
- package/dist/lib/resources/aws/cdn/index.d.ts +0 -1
- package/dist/lib/resources/aws/cdn/index.js +0 -18
- package/dist/lib/resources/aws/compute/capacityProviderDrainWaiter.d.ts +0 -20
- package/dist/lib/resources/aws/compute/capacityProviderDrainWaiter.js +0 -180
- package/dist/lib/resources/aws/database/dynamodb.d.ts +0 -70
- package/dist/lib/resources/aws/database/dynamodb.js +0 -170
- package/dist/lib/resources/aws/database/rdsDeletionWaiter.d.ts +0 -33
- package/dist/lib/resources/aws/database/rdsDeletionWaiter.js +0 -74
- package/dist/lib/resources/aws/messaging/index.d.ts +0 -1
- package/dist/lib/resources/aws/messaging/index.js +0 -18
- package/dist/lib/resources/aws/messaging/sqs.d.ts +0 -65
- package/dist/lib/resources/aws/messaging/sqs.js +0 -195
- package/dist/lib/resources/aws/networking/vpcEndpoint.d.ts +0 -20
- package/dist/lib/resources/aws/networking/vpcEndpoint.js +0 -59
- package/dist/lib/resources/aws/networking/vpcEndpoints.d.ts +0 -71
- package/dist/lib/resources/aws/networking/vpcEndpoints.js +0 -125
- package/dist/lib/resources/aws/utilities/cfnOutput.test.d.ts +0 -1
- package/dist/lib/resources/aws/utilities/cfnOutput.test.js +0 -102
- package/dist/lib/utils/sanitizeCfnKey.d.ts +0 -5
- package/dist/lib/utils/sanitizeCfnKey.js +0 -11
- package/dist/lib/utils/tagResource.d.ts +0 -24
- package/dist/lib/utils/tagResource.js +0 -30
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.QueueFactory = exports.Queue = void 0;
|
|
4
|
-
const sqs_1 = require("../../resources/aws/messaging/sqs");
|
|
5
|
-
/**
|
|
6
|
-
* Validates SQS props and logs warnings for misconfigured options.
|
|
7
|
-
*/
|
|
8
|
-
function validateSQSProps(props) {
|
|
9
|
-
// Validate visibility timeout range (0-43200 seconds = 12 hours)
|
|
10
|
-
if (props.visibilityTimeout !== undefined &&
|
|
11
|
-
(props.visibilityTimeout < 0 || props.visibilityTimeout > 43200)) {
|
|
12
|
-
throw new Error("visibilityTimeout must be between 0 and 43200 seconds (12 hours)");
|
|
13
|
-
}
|
|
14
|
-
// Validate message retention period (60-1209600 seconds = 1 minute to 14 days)
|
|
15
|
-
if (props.messageRetentionPeriod !== undefined &&
|
|
16
|
-
(props.messageRetentionPeriod < 60 || props.messageRetentionPeriod > 1209600)) {
|
|
17
|
-
throw new Error("messageRetentionPeriod must be between 60 and 1209600 seconds (1 minute to 14 days)");
|
|
18
|
-
}
|
|
19
|
-
// Warn about FIFO-specific options on standard queues
|
|
20
|
-
if (props.queueType !== "fifo") {
|
|
21
|
-
if (props.contentBasedDeduplication !== undefined) {
|
|
22
|
-
console.warn("[Fjall] Warning: 'contentBasedDeduplication' is only applicable to FIFO queues. " +
|
|
23
|
-
"This setting will be ignored for standard queues.");
|
|
24
|
-
}
|
|
25
|
-
if (props.fifoThroughputLimit !== undefined) {
|
|
26
|
-
console.warn("[Fjall] Warning: 'fifoThroughputLimit' is only applicable to FIFO queues. " +
|
|
27
|
-
"This setting will be ignored for standard queues.");
|
|
28
|
-
}
|
|
29
|
-
if (props.deduplicationScope !== undefined) {
|
|
30
|
-
console.warn("[Fjall] Warning: 'deduplicationScope' is only applicable to FIFO queues. " +
|
|
31
|
-
"This setting will be ignored for standard queues.");
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
// Validate KMS encryption
|
|
35
|
-
if (props.kmsKeyArn && props.encryption !== "SSE_KMS") {
|
|
36
|
-
console.warn("[Fjall] Warning: 'kmsKeyArn' provided but 'encryption' is not SSE_KMS. " +
|
|
37
|
-
"The KMS key will be ignored.");
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* SQS queue wrapper with grant methods and Fjall patterns.
|
|
42
|
-
*/
|
|
43
|
-
class Queue extends sqs_1.SQSQueue {
|
|
44
|
-
constructor(scope, id, props) {
|
|
45
|
-
const queueProps = {
|
|
46
|
-
queueType: props.queueType,
|
|
47
|
-
visibilityTimeout: props.visibilityTimeout,
|
|
48
|
-
messageRetentionPeriod: props.messageRetentionPeriod,
|
|
49
|
-
receiveMessageWaitTime: props.receiveMessageWaitTime,
|
|
50
|
-
maxMessageSize: props.maxMessageSize,
|
|
51
|
-
deliveryDelay: props.deliveryDelay,
|
|
52
|
-
deadLetterQueue: props.deadLetterQueue,
|
|
53
|
-
encryption: props.encryption,
|
|
54
|
-
kmsKeyArn: props.kmsKeyArn,
|
|
55
|
-
contentBasedDeduplication: props.contentBasedDeduplication,
|
|
56
|
-
fifoThroughputLimit: props.fifoThroughputLimit,
|
|
57
|
-
deduplicationScope: props.deduplicationScope,
|
|
58
|
-
removalPolicy: props.removalPolicy
|
|
59
|
-
};
|
|
60
|
-
super(scope, id, queueProps);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
exports.Queue = Queue;
|
|
64
|
-
/**
|
|
65
|
-
* Factory for creating SQS queues.
|
|
66
|
-
*
|
|
67
|
-
* @example
|
|
68
|
-
* // Standard queue with DLQ
|
|
69
|
-
* const notifications = app.addQueue(QueueFactory.build("Notifications", {
|
|
70
|
-
* queueType: "standard",
|
|
71
|
-
* deadLetterQueue: { enabled: true, maxReceiveCount: 3 }
|
|
72
|
-
* }));
|
|
73
|
-
*
|
|
74
|
-
* @example
|
|
75
|
-
* // FIFO queue for OpenNext revalidation
|
|
76
|
-
* const revalidation = app.addQueue(QueueFactory.build("Revalidation", {
|
|
77
|
-
* queueType: "fifo",
|
|
78
|
-
* visibilityTimeout: 300,
|
|
79
|
-
* contentBasedDeduplication: true
|
|
80
|
-
* }));
|
|
81
|
-
*
|
|
82
|
-
* @example
|
|
83
|
-
* // Grant permissions
|
|
84
|
-
* revalidation.grantSend(serverFunction);
|
|
85
|
-
* revalidation.grantConsume(revalidationFunction);
|
|
86
|
-
*/
|
|
87
|
-
class QueueFactory {
|
|
88
|
-
/**
|
|
89
|
-
* Build an SQS queue factory function.
|
|
90
|
-
*
|
|
91
|
-
* @param id - Unique identifier for the queue
|
|
92
|
-
* @param props - SQS queue configuration properties
|
|
93
|
-
* @returns Factory function that creates the queue when invoked
|
|
94
|
-
*/
|
|
95
|
-
static build(id, props = {}) {
|
|
96
|
-
return (_app, scope) => {
|
|
97
|
-
validateSQSProps(props);
|
|
98
|
-
return new Queue(scope, id, props);
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
exports.QueueFactory = QueueFactory;
|
|
103
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVldWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvcGF0dGVybnMvYXdzL3F1ZXVlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUtBLDJEQUFpRjtBQXFCakY7O0dBRUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLEtBQWdCO0lBQ3hDLGlFQUFpRTtJQUNqRSxJQUNFLEtBQUssQ0FBQyxpQkFBaUIsS0FBSyxTQUFTO1FBQ3JDLENBQUMsS0FBSyxDQUFDLGlCQUFpQixHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDLEVBQ2hFLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUNiLGtFQUFrRSxDQUNuRSxDQUFDO0lBQ0osQ0FBQztJQUVELCtFQUErRTtJQUMvRSxJQUNFLEtBQUssQ0FBQyxzQkFBc0IsS0FBSyxTQUFTO1FBQzFDLENBQUMsS0FBSyxDQUFDLHNCQUFzQixHQUFHLEVBQUUsSUFBSSxLQUFLLENBQUMsc0JBQXNCLEdBQUcsT0FBTyxDQUFDLEVBQzdFLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUNiLHFGQUFxRixDQUN0RixDQUFDO0lBQ0osQ0FBQztJQUVELHNEQUFzRDtJQUN0RCxJQUFJLEtBQUssQ0FBQyxTQUFTLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDL0IsSUFBSSxLQUFLLENBQUMseUJBQXlCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbEQsT0FBTyxDQUFDLElBQUksQ0FDVixrRkFBa0Y7Z0JBQ2hGLG1EQUFtRCxDQUN0RCxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLG1CQUFtQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVDLE9BQU8sQ0FBQyxJQUFJLENBQ1YsNEVBQTRFO2dCQUMxRSxtREFBbUQsQ0FDdEQsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMzQyxPQUFPLENBQUMsSUFBSSxDQUNWLDJFQUEyRTtnQkFDekUsbURBQW1ELENBQ3RELENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELDBCQUEwQjtJQUMxQixJQUFJLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN0RCxPQUFPLENBQUMsSUFBSSxDQUNWLHlFQUF5RTtZQUN2RSw4QkFBOEIsQ0FDakMsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLEtBQU0sU0FBUSxjQUFRO0lBQ2pDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBZ0I7UUFDeEQsTUFBTSxVQUFVLEdBQWtCO1lBQ2hDLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztZQUMxQixpQkFBaUIsRUFBRSxLQUFLLENBQUMsaUJBQWlCO1lBQzFDLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxzQkFBc0I7WUFDcEQsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLHNCQUFzQjtZQUNwRCxjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWM7WUFDcEMsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO1lBQ2xDLGVBQWUsRUFBRSxLQUFLLENBQUMsZUFBZTtZQUN0QyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7WUFDNUIsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO1lBQzFCLHlCQUF5QixFQUFFLEtBQUssQ0FBQyx5QkFBeUI7WUFDMUQsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLG1CQUFtQjtZQUM5QyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsa0JBQWtCO1lBQzVDLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYTtTQUNuQyxDQUFDO1FBQ0YsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDL0IsQ0FBQztDQUNGO0FBbkJELHNCQW1CQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBYSxZQUFZO0lBQ3ZCOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBVSxFQUFFLFFBQW1CLEVBQUU7UUFDNUMsT0FBTyxDQUFDLElBQVMsRUFBRSxLQUFnQixFQUFTLEVBQUU7WUFDNUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEIsT0FBTyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQWRELG9DQWNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IHR5cGUgSUdyYW50YWJsZSwgdHlwZSBHcmFudCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgeyB0eXBlIElRdWV1ZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc3FzXCI7XG5cbmltcG9ydCB0eXBlIEFwcCBmcm9tIFwiLi4vLi4vYXBwXCI7XG5pbXBvcnQgeyBTUVNRdWV1ZSwgdHlwZSBTUVNRdWV1ZVByb3BzIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvbWVzc2FnaW5nL3Nxc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElTUVNQcm9wcyB7XG4gIHF1ZXVlVHlwZT86IFwic3RhbmRhcmRcIiB8IFwiZmlmb1wiO1xuICB2aXNpYmlsaXR5VGltZW91dD86IG51bWJlcjtcbiAgbWVzc2FnZVJldGVudGlvblBlcmlvZD86IG51bWJlcjtcbiAgcmVjZWl2ZU1lc3NhZ2VXYWl0VGltZT86IG51bWJlcjtcbiAgbWF4TWVzc2FnZVNpemU/OiBudW1iZXI7XG4gIGRlbGl2ZXJ5RGVsYXk/OiBudW1iZXI7XG4gIGRlYWRMZXR0ZXJRdWV1ZT86IHtcbiAgICBlbmFibGVkOiBib29sZWFuO1xuICAgIG1heFJlY2VpdmVDb3VudD86IG51bWJlcjtcbiAgfTtcbiAgZW5jcnlwdGlvbj86IFwiU1NFX1NRU1wiIHwgXCJTU0VfS01TXCIgfCBcIk5PTkVcIjtcbiAga21zS2V5QXJuPzogc3RyaW5nO1xuICBjb250ZW50QmFzZWREZWR1cGxpY2F0aW9uPzogYm9vbGVhbjtcbiAgZmlmb1Rocm91Z2hwdXRMaW1pdD86IFwicGVyUXVldWVcIiB8IFwicGVyTWVzc2FnZUdyb3VwSWRcIjtcbiAgZGVkdXBsaWNhdGlvblNjb3BlPzogXCJxdWV1ZVwiIHwgXCJtZXNzYWdlR3JvdXBcIjtcbiAgcmVtb3ZhbFBvbGljeT86IFwiREVTVFJPWVwiIHwgXCJSRVRBSU5cIjtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgU1FTIHByb3BzIGFuZCBsb2dzIHdhcm5pbmdzIGZvciBtaXNjb25maWd1cmVkIG9wdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlU1FTUHJvcHMocHJvcHM6IElTUVNQcm9wcyk6IHZvaWQge1xuICAvLyBWYWxpZGF0ZSB2aXNpYmlsaXR5IHRpbWVvdXQgcmFuZ2UgKDAtNDMyMDAgc2Vjb25kcyA9IDEyIGhvdXJzKVxuICBpZiAoXG4gICAgcHJvcHMudmlzaWJpbGl0eVRpbWVvdXQgIT09IHVuZGVmaW5lZCAmJlxuICAgIChwcm9wcy52aXNpYmlsaXR5VGltZW91dCA8IDAgfHwgcHJvcHMudmlzaWJpbGl0eVRpbWVvdXQgPiA0MzIwMClcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJ2aXNpYmlsaXR5VGltZW91dCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNDMyMDAgc2Vjb25kcyAoMTIgaG91cnMpXCJcbiAgICApO1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgbWVzc2FnZSByZXRlbnRpb24gcGVyaW9kICg2MC0xMjA5NjAwIHNlY29uZHMgPSAxIG1pbnV0ZSB0byAxNCBkYXlzKVxuICBpZiAoXG4gICAgcHJvcHMubWVzc2FnZVJldGVudGlvblBlcmlvZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgKHByb3BzLm1lc3NhZ2VSZXRlbnRpb25QZXJpb2QgPCA2MCB8fCBwcm9wcy5tZXNzYWdlUmV0ZW50aW9uUGVyaW9kID4gMTIwOTYwMClcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJtZXNzYWdlUmV0ZW50aW9uUGVyaW9kIG11c3QgYmUgYmV0d2VlbiA2MCBhbmQgMTIwOTYwMCBzZWNvbmRzICgxIG1pbnV0ZSB0byAxNCBkYXlzKVwiXG4gICAgKTtcbiAgfVxuXG4gIC8vIFdhcm4gYWJvdXQgRklGTy1zcGVjaWZpYyBvcHRpb25zIG9uIHN0YW5kYXJkIHF1ZXVlc1xuICBpZiAocHJvcHMucXVldWVUeXBlICE9PSBcImZpZm9cIikge1xuICAgIGlmIChwcm9wcy5jb250ZW50QmFzZWREZWR1cGxpY2F0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJbRmphbGxdIFdhcm5pbmc6ICdjb250ZW50QmFzZWREZWR1cGxpY2F0aW9uJyBpcyBvbmx5IGFwcGxpY2FibGUgdG8gRklGTyBxdWV1ZXMuIFwiICtcbiAgICAgICAgICBcIlRoaXMgc2V0dGluZyB3aWxsIGJlIGlnbm9yZWQgZm9yIHN0YW5kYXJkIHF1ZXVlcy5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmZpZm9UaHJvdWdocHV0TGltaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIltGamFsbF0gV2FybmluZzogJ2ZpZm9UaHJvdWdocHV0TGltaXQnIGlzIG9ubHkgYXBwbGljYWJsZSB0byBGSUZPIHF1ZXVlcy4gXCIgK1xuICAgICAgICAgIFwiVGhpcyBzZXR0aW5nIHdpbGwgYmUgaWdub3JlZCBmb3Igc3RhbmRhcmQgcXVldWVzLlwiXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAocHJvcHMuZGVkdXBsaWNhdGlvblNjb3BlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJbRmphbGxdIFdhcm5pbmc6ICdkZWR1cGxpY2F0aW9uU2NvcGUnIGlzIG9ubHkgYXBwbGljYWJsZSB0byBGSUZPIHF1ZXVlcy4gXCIgK1xuICAgICAgICAgIFwiVGhpcyBzZXR0aW5nIHdpbGwgYmUgaWdub3JlZCBmb3Igc3RhbmRhcmQgcXVldWVzLlwiXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIFZhbGlkYXRlIEtNUyBlbmNyeXB0aW9uXG4gIGlmIChwcm9wcy5rbXNLZXlBcm4gJiYgcHJvcHMuZW5jcnlwdGlvbiAhPT0gXCJTU0VfS01TXCIpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBcIltGamFsbF0gV2FybmluZzogJ2ttc0tleUFybicgcHJvdmlkZWQgYnV0ICdlbmNyeXB0aW9uJyBpcyBub3QgU1NFX0tNUy4gXCIgK1xuICAgICAgICBcIlRoZSBLTVMga2V5IHdpbGwgYmUgaWdub3JlZC5cIlxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBTUVMgcXVldWUgd3JhcHBlciB3aXRoIGdyYW50IG1ldGhvZHMgYW5kIEZqYWxsIHBhdHRlcm5zLlxuICovXG5leHBvcnQgY2xhc3MgUXVldWUgZXh0ZW5kcyBTUVNRdWV1ZSB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJU1FTUHJvcHMpIHtcbiAgICBjb25zdCBxdWV1ZVByb3BzOiBTUVNRdWV1ZVByb3BzID0ge1xuICAgICAgcXVldWVUeXBlOiBwcm9wcy5xdWV1ZVR5cGUsXG4gICAgICB2aXNpYmlsaXR5VGltZW91dDogcHJvcHMudmlzaWJpbGl0eVRpbWVvdXQsXG4gICAgICBtZXNzYWdlUmV0ZW50aW9uUGVyaW9kOiBwcm9wcy5tZXNzYWdlUmV0ZW50aW9uUGVyaW9kLFxuICAgICAgcmVjZWl2ZU1lc3NhZ2VXYWl0VGltZTogcHJvcHMucmVjZWl2ZU1lc3NhZ2VXYWl0VGltZSxcbiAgICAgIG1heE1lc3NhZ2VTaXplOiBwcm9wcy5tYXhNZXNzYWdlU2l6ZSxcbiAgICAgIGRlbGl2ZXJ5RGVsYXk6IHByb3BzLmRlbGl2ZXJ5RGVsYXksXG4gICAgICBkZWFkTGV0dGVyUXVldWU6IHByb3BzLmRlYWRMZXR0ZXJRdWV1ZSxcbiAgICAgIGVuY3J5cHRpb246IHByb3BzLmVuY3J5cHRpb24sXG4gICAgICBrbXNLZXlBcm46IHByb3BzLmttc0tleUFybixcbiAgICAgIGNvbnRlbnRCYXNlZERlZHVwbGljYXRpb246IHByb3BzLmNvbnRlbnRCYXNlZERlZHVwbGljYXRpb24sXG4gICAgICBmaWZvVGhyb3VnaHB1dExpbWl0OiBwcm9wcy5maWZvVGhyb3VnaHB1dExpbWl0LFxuICAgICAgZGVkdXBsaWNhdGlvblNjb3BlOiBwcm9wcy5kZWR1cGxpY2F0aW9uU2NvcGUsXG4gICAgICByZW1vdmFsUG9saWN5OiBwcm9wcy5yZW1vdmFsUG9saWN5XG4gICAgfTtcbiAgICBzdXBlcihzY29wZSwgaWQsIHF1ZXVlUHJvcHMpO1xuICB9XG59XG5cbi8qKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgU1FTIHF1ZXVlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU3RhbmRhcmQgcXVldWUgd2l0aCBETFFcbiAqIGNvbnN0IG5vdGlmaWNhdGlvbnMgPSBhcHAuYWRkUXVldWUoUXVldWVGYWN0b3J5LmJ1aWxkKFwiTm90aWZpY2F0aW9uc1wiLCB7XG4gKiAgIHF1ZXVlVHlwZTogXCJzdGFuZGFyZFwiLFxuICogICBkZWFkTGV0dGVyUXVldWU6IHsgZW5hYmxlZDogdHJ1ZSwgbWF4UmVjZWl2ZUNvdW50OiAzIH1cbiAqIH0pKTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRklGTyBxdWV1ZSBmb3IgT3Blbk5leHQgcmV2YWxpZGF0aW9uXG4gKiBjb25zdCByZXZhbGlkYXRpb24gPSBhcHAuYWRkUXVldWUoUXVldWVGYWN0b3J5LmJ1aWxkKFwiUmV2YWxpZGF0aW9uXCIsIHtcbiAqICAgcXVldWVUeXBlOiBcImZpZm9cIixcbiAqICAgdmlzaWJpbGl0eVRpbWVvdXQ6IDMwMCxcbiAqICAgY29udGVudEJhc2VkRGVkdXBsaWNhdGlvbjogdHJ1ZVxuICogfSkpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBHcmFudCBwZXJtaXNzaW9uc1xuICogcmV2YWxpZGF0aW9uLmdyYW50U2VuZChzZXJ2ZXJGdW5jdGlvbik7XG4gKiByZXZhbGlkYXRpb24uZ3JhbnRDb25zdW1lKHJldmFsaWRhdGlvbkZ1bmN0aW9uKTtcbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXVlRmFjdG9yeSB7XG4gIC8qKlxuICAgKiBCdWlsZCBhbiBTUVMgcXVldWUgZmFjdG9yeSBmdW5jdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGlkIC0gVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gcHJvcHMgLSBTUVMgcXVldWUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzXG4gICAqIEByZXR1cm5zIEZhY3RvcnkgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIHRoZSBxdWV1ZSB3aGVuIGludm9rZWRcbiAgICovXG4gIHN0YXRpYyBidWlsZChpZDogc3RyaW5nLCBwcm9wczogSVNRU1Byb3BzID0ge30pIHtcbiAgICByZXR1cm4gKF9hcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCk6IFF1ZXVlID0+IHtcbiAgICAgIHZhbGlkYXRlU1FTUHJvcHMocHJvcHMpO1xuICAgICAgcmV0dXJuIG5ldyBRdWV1ZShzY29wZSwgaWQsIHByb3BzKTtcbiAgICB9O1xuICB9XG59XG5cbi8vIFJlLWV4cG9ydCB0eXBlcyBmb3IgY29udmVuaWVuY2VcbmV4cG9ydCB0eXBlIHsgU1FTUXVldWVQcm9wcyB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL21lc3NhZ2luZy9zcXNcIjtcbiJdfQ==
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { Construct } from "constructs";
|
|
2
|
-
import { Distribution, type ICachePolicy } from "aws-cdk-lib/aws-cloudfront";
|
|
3
|
-
import { type IBucket } from "aws-cdk-lib/aws-s3";
|
|
4
|
-
import { type IApplicationLoadBalancer } from "aws-cdk-lib/aws-elasticloadbalancingv2";
|
|
5
|
-
import { type ICertificate } from "aws-cdk-lib/aws-certificatemanager";
|
|
6
|
-
export type CachePolicyPreset = "CACHING_OPTIMIZED" | "CACHING_DISABLED" | "CACHING_OPTIMIZED_FOR_UNCOMPRESSED_OBJECTS";
|
|
7
|
-
export interface S3OriginConfig {
|
|
8
|
-
type: "s3";
|
|
9
|
-
bucket: IBucket;
|
|
10
|
-
originPath?: string;
|
|
11
|
-
}
|
|
12
|
-
export interface AlbOriginConfig {
|
|
13
|
-
type: "alb";
|
|
14
|
-
loadBalancer: IApplicationLoadBalancer;
|
|
15
|
-
protocolPolicy?: "HTTP_ONLY" | "HTTPS_ONLY" | "MATCH_VIEWER";
|
|
16
|
-
httpPort?: number;
|
|
17
|
-
httpsPort?: number;
|
|
18
|
-
}
|
|
19
|
-
export interface HttpOriginConfig {
|
|
20
|
-
type: "http";
|
|
21
|
-
domainName: string;
|
|
22
|
-
originPath?: string;
|
|
23
|
-
protocolPolicy?: "HTTP_ONLY" | "HTTPS_ONLY" | "MATCH_VIEWER";
|
|
24
|
-
httpPort?: number;
|
|
25
|
-
httpsPort?: number;
|
|
26
|
-
}
|
|
27
|
-
export type CdnOriginConfig = S3OriginConfig | AlbOriginConfig | HttpOriginConfig;
|
|
28
|
-
export interface CdnBehaviour {
|
|
29
|
-
pathPattern: string;
|
|
30
|
-
origin: CdnOriginConfig;
|
|
31
|
-
cachePolicy?: CachePolicyPreset | ICachePolicy;
|
|
32
|
-
allowedMethods?: "GET_HEAD" | "GET_HEAD_OPTIONS" | "ALL";
|
|
33
|
-
}
|
|
34
|
-
export interface CloudFrontDistributionProps {
|
|
35
|
-
defaultOrigin: CdnOriginConfig;
|
|
36
|
-
defaultCachePolicy?: CachePolicyPreset | ICachePolicy;
|
|
37
|
-
behaviours?: CdnBehaviour[];
|
|
38
|
-
domainNames?: string[];
|
|
39
|
-
certificate?: ICertificate;
|
|
40
|
-
comment?: string;
|
|
41
|
-
enableLogging?: boolean;
|
|
42
|
-
logBucket?: IBucket;
|
|
43
|
-
priceClass?: "PriceClass_100" | "PriceClass_200" | "PriceClass_All";
|
|
44
|
-
}
|
|
45
|
-
export declare class CloudFrontDistribution extends Construct {
|
|
46
|
-
readonly id: string;
|
|
47
|
-
private distribution;
|
|
48
|
-
constructor(scope: Construct, id: string, props: CloudFrontDistributionProps);
|
|
49
|
-
private createOrigin;
|
|
50
|
-
private resolveCachePolicy;
|
|
51
|
-
private resolveAllowedMethods;
|
|
52
|
-
private resolveOriginProtocolPolicy;
|
|
53
|
-
/**
|
|
54
|
-
* Get the CloudFront distribution domain name.
|
|
55
|
-
*/
|
|
56
|
-
getDistributionDomainName(): string;
|
|
57
|
-
/**
|
|
58
|
-
* Get the CloudFront distribution ID.
|
|
59
|
-
*/
|
|
60
|
-
getDistributionId(): string;
|
|
61
|
-
/**
|
|
62
|
-
* Get the underlying CDK Distribution construct.
|
|
63
|
-
*/
|
|
64
|
-
getDistribution(): Distribution;
|
|
65
|
-
}
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CloudFrontDistribution = void 0;
|
|
4
|
-
const constructs_1 = require("constructs");
|
|
5
|
-
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
6
|
-
const aws_cloudfront_1 = require("aws-cdk-lib/aws-cloudfront");
|
|
7
|
-
const aws_cloudfront_origins_1 = require("aws-cdk-lib/aws-cloudfront-origins");
|
|
8
|
-
class CloudFrontDistribution extends constructs_1.Construct {
|
|
9
|
-
constructor(scope, id, props) {
|
|
10
|
-
super(scope, id);
|
|
11
|
-
this.id = id;
|
|
12
|
-
const defaultOrigin = this.createOrigin(props.defaultOrigin);
|
|
13
|
-
const defaultCachePolicy = this.resolveCachePolicy(props.defaultCachePolicy);
|
|
14
|
-
const additionalBehaviors = {};
|
|
15
|
-
if (props.behaviours) {
|
|
16
|
-
for (const behaviour of props.behaviours) {
|
|
17
|
-
additionalBehaviors[behaviour.pathPattern] = {
|
|
18
|
-
origin: this.createOrigin(behaviour.origin),
|
|
19
|
-
cachePolicy: this.resolveCachePolicy(behaviour.cachePolicy),
|
|
20
|
-
viewerProtocolPolicy: aws_cloudfront_1.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
|
|
21
|
-
allowedMethods: this.resolveAllowedMethods(behaviour.allowedMethods)
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
this.distribution = new aws_cloudfront_1.Distribution(this, `${id}Distribution`, {
|
|
26
|
-
defaultBehavior: {
|
|
27
|
-
origin: defaultOrigin,
|
|
28
|
-
cachePolicy: defaultCachePolicy,
|
|
29
|
-
viewerProtocolPolicy: aws_cloudfront_1.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
|
|
30
|
-
originRequestPolicy: aws_cloudfront_1.OriginRequestPolicy.ALL_VIEWER_EXCEPT_HOST_HEADER
|
|
31
|
-
},
|
|
32
|
-
additionalBehaviors: Object.keys(additionalBehaviors).length > 0
|
|
33
|
-
? additionalBehaviors
|
|
34
|
-
: undefined,
|
|
35
|
-
domainNames: props.domainNames,
|
|
36
|
-
certificate: props.certificate,
|
|
37
|
-
comment: props.comment,
|
|
38
|
-
enableLogging: props.enableLogging,
|
|
39
|
-
logBucket: props.logBucket
|
|
40
|
-
});
|
|
41
|
-
new aws_cdk_lib_1.CfnOutput(this, `${id}DistributionDomainName`, {
|
|
42
|
-
key: `${id}DistributionDomainName`,
|
|
43
|
-
value: this.distribution.distributionDomainName,
|
|
44
|
-
description: `CloudFront distribution domain name for ${id}`
|
|
45
|
-
});
|
|
46
|
-
new aws_cdk_lib_1.CfnOutput(this, `${id}DistributionId`, {
|
|
47
|
-
key: `${id}DistributionId`,
|
|
48
|
-
value: this.distribution.distributionId,
|
|
49
|
-
description: `CloudFront distribution ID for ${id}`
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
createOrigin(config) {
|
|
53
|
-
switch (config.type) {
|
|
54
|
-
case "s3":
|
|
55
|
-
return aws_cloudfront_origins_1.S3BucketOrigin.withOriginAccessControl(config.bucket, {
|
|
56
|
-
originPath: config.originPath
|
|
57
|
-
});
|
|
58
|
-
case "alb":
|
|
59
|
-
return new aws_cloudfront_origins_1.LoadBalancerV2Origin(config.loadBalancer, {
|
|
60
|
-
httpPort: config.httpPort,
|
|
61
|
-
httpsPort: config.httpsPort,
|
|
62
|
-
protocolPolicy: this.resolveOriginProtocolPolicy(config.protocolPolicy)
|
|
63
|
-
});
|
|
64
|
-
case "http":
|
|
65
|
-
return new aws_cloudfront_origins_1.HttpOrigin(config.domainName, {
|
|
66
|
-
originPath: config.originPath,
|
|
67
|
-
httpPort: config.httpPort,
|
|
68
|
-
httpsPort: config.httpsPort,
|
|
69
|
-
protocolPolicy: this.resolveOriginProtocolPolicy(config.protocolPolicy)
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
resolveCachePolicy(policy) {
|
|
74
|
-
if (!policy) {
|
|
75
|
-
return aws_cloudfront_1.CachePolicy.CACHING_OPTIMIZED;
|
|
76
|
-
}
|
|
77
|
-
if (typeof policy === "string") {
|
|
78
|
-
switch (policy) {
|
|
79
|
-
case "CACHING_OPTIMIZED":
|
|
80
|
-
return aws_cloudfront_1.CachePolicy.CACHING_OPTIMIZED;
|
|
81
|
-
case "CACHING_DISABLED":
|
|
82
|
-
return aws_cloudfront_1.CachePolicy.CACHING_DISABLED;
|
|
83
|
-
case "CACHING_OPTIMIZED_FOR_UNCOMPRESSED_OBJECTS":
|
|
84
|
-
return aws_cloudfront_1.CachePolicy.CACHING_OPTIMIZED_FOR_UNCOMPRESSED_OBJECTS;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
return policy;
|
|
88
|
-
}
|
|
89
|
-
resolveAllowedMethods(methods) {
|
|
90
|
-
switch (methods) {
|
|
91
|
-
case "GET_HEAD":
|
|
92
|
-
return aws_cloudfront_1.AllowedMethods.ALLOW_GET_HEAD;
|
|
93
|
-
case "GET_HEAD_OPTIONS":
|
|
94
|
-
return aws_cloudfront_1.AllowedMethods.ALLOW_GET_HEAD_OPTIONS;
|
|
95
|
-
case "ALL":
|
|
96
|
-
return aws_cloudfront_1.AllowedMethods.ALLOW_ALL;
|
|
97
|
-
default:
|
|
98
|
-
return aws_cloudfront_1.AllowedMethods.ALLOW_GET_HEAD;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
resolveOriginProtocolPolicy(policy) {
|
|
102
|
-
// CDK import for OriginProtocolPolicy
|
|
103
|
-
const { OriginProtocolPolicy } = require("aws-cdk-lib/aws-cloudfront");
|
|
104
|
-
switch (policy) {
|
|
105
|
-
case "HTTP_ONLY":
|
|
106
|
-
return OriginProtocolPolicy.HTTP_ONLY;
|
|
107
|
-
case "HTTPS_ONLY":
|
|
108
|
-
return OriginProtocolPolicy.HTTPS_ONLY;
|
|
109
|
-
case "MATCH_VIEWER":
|
|
110
|
-
return OriginProtocolPolicy.MATCH_VIEWER;
|
|
111
|
-
default:
|
|
112
|
-
return OriginProtocolPolicy.HTTPS_ONLY;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Get the CloudFront distribution domain name.
|
|
117
|
-
*/
|
|
118
|
-
getDistributionDomainName() {
|
|
119
|
-
return this.distribution.distributionDomainName;
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* Get the CloudFront distribution ID.
|
|
123
|
-
*/
|
|
124
|
-
getDistributionId() {
|
|
125
|
-
return this.distribution.distributionId;
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Get the underlying CDK Distribution construct.
|
|
129
|
-
*/
|
|
130
|
-
getDistribution() {
|
|
131
|
-
return this.distribution;
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
exports.CloudFrontDistribution = CloudFrontDistribution;
|
|
135
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWRGcm9udC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi9yZXNvdXJjZXMvYXdzL2Nkbi9jbG91ZEZyb250LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUF1QztBQUN2Qyw2Q0FBd0M7QUFDeEMsK0RBU29DO0FBQ3BDLCtFQUk0QztBQXNENUMsTUFBYSxzQkFBdUIsU0FBUSxzQkFBUztJQUluRCxZQUNFLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixLQUFrQztRQUVsQyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBRWIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDN0QsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFN0UsTUFBTSxtQkFBbUIsR0FBb0MsRUFBRSxDQUFDO1FBQ2hFLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3JCLEtBQUssTUFBTSxTQUFTLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN6QyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEdBQUc7b0JBQzNDLE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7b0JBQzNDLFdBQVcsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQztvQkFDM0Qsb0JBQW9CLEVBQUUscUNBQW9CLENBQUMsaUJBQWlCO29CQUM1RCxjQUFjLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUM7aUJBQ3JFLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FB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dCI6WyJpbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgQ2ZuT3V0cHV0IH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQge1xuICBEaXN0cmlidXRpb24sXG4gIHR5cGUgSU9yaWdpbixcbiAgVmlld2VyUHJvdG9jb2xQb2xpY3ksXG4gIENhY2hlUG9saWN5LFxuICB0eXBlIElDYWNoZVBvbGljeSxcbiAgT3JpZ2luUmVxdWVzdFBvbGljeSxcbiAgQWxsb3dlZE1ldGhvZHMsXG4gIHR5cGUgQmVoYXZpb3JPcHRpb25zXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udFwiO1xuaW1wb3J0IHtcbiAgUzNCdWNrZXRPcmlnaW4sXG4gIExvYWRCYWxhbmNlclYyT3JpZ2luLFxuICBIdHRwT3JpZ2luXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udC1vcmlnaW5zXCI7XG5pbXBvcnQgeyB0eXBlIElCdWNrZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCI7XG5pbXBvcnQgeyB0eXBlIElBcHBsaWNhdGlvbkxvYWRCYWxhbmNlciB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWxhc3RpY2xvYWRiYWxhbmNpbmd2MlwiO1xuaW1wb3J0IHsgdHlwZSBJQ2VydGlmaWNhdGUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlclwiO1xuXG5leHBvcnQgdHlwZSBDYWNoZVBvbGljeVByZXNldCA9XG4gIHwgXCJDQUNISU5HX09QVElNSVpFRFwiXG4gIHwgXCJDQUNISU5HX0RJU0FCTEVEXCJcbiAgfCBcIkNBQ0hJTkdfT1BUSU1JWkVEX0ZPUl9VTkNPTVBSRVNTRURfT0JKRUNUU1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFMzT3JpZ2luQ29uZmlnIHtcbiAgdHlwZTogXCJzM1wiO1xuICBidWNrZXQ6IElCdWNrZXQ7XG4gIG9yaWdpblBhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWxiT3JpZ2luQ29uZmlnIHtcbiAgdHlwZTogXCJhbGJcIjtcbiAgbG9hZEJhbGFuY2VyOiBJQXBwbGljYXRpb25Mb2FkQmFsYW5jZXI7XG4gIHByb3RvY29sUG9saWN5PzogXCJIVFRQX09OTFlcIiB8IFwiSFRUUFNfT05MWVwiIHwgXCJNQVRDSF9WSUVXRVJcIjtcbiAgaHR0cFBvcnQ/OiBudW1iZXI7XG4gIGh0dHBzUG9ydD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIdHRwT3JpZ2luQ29uZmlnIHtcbiAgdHlwZTogXCJodHRwXCI7XG4gIGRvbWFpbk5hbWU6IHN0cmluZztcbiAgb3JpZ2luUGF0aD86IHN0cmluZztcbiAgcHJvdG9jb2xQb2xpY3k/OiBcIkhUVFBfT05MWVwiIHwgXCJIVFRQU19PTkxZXCIgfCBcIk1BVENIX1ZJRVdFUlwiO1xuICBodHRwUG9ydD86IG51bWJlcjtcbiAgaHR0cHNQb3J0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgdHlwZSBDZG5PcmlnaW5Db25maWcgPSBTM09yaWdpbkNvbmZpZyB8IEFsYk9yaWdpbkNvbmZpZyB8IEh0dHBPcmlnaW5Db25maWc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2RuQmVoYXZpb3VyIHtcbiAgcGF0aFBhdHRlcm46IHN0cmluZztcbiAgb3JpZ2luOiBDZG5PcmlnaW5Db25maWc7XG4gIGNhY2hlUG9saWN5PzogQ2FjaGVQb2xpY3lQcmVzZXQgfCBJQ2FjaGVQb2xpY3k7XG4gIGFsbG93ZWRNZXRob2RzPzogXCJHRVRfSEVBRFwiIHwgXCJHRVRfSEVBRF9PUFRJT05TXCIgfCBcIkFMTFwiO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENsb3VkRnJvbnREaXN0cmlidXRpb25Qcm9wcyB7XG4gIGRlZmF1bHRPcmlnaW46IENkbk9yaWdpbkNvbmZpZztcbiAgZGVmYXVsdENhY2hlUG9saWN5PzogQ2FjaGVQb2xpY3lQcmVzZXQgfCBJQ2FjaGVQb2xpY3k7XG4gIGJlaGF2aW91cnM/OiBDZG5CZWhhdmlvdXJbXTtcbiAgZG9tYWluTmFtZXM/OiBzdHJpbmdbXTtcbiAgY2VydGlmaWNhdGU/OiBJQ2VydGlmaWNhdGU7XG4gIGNvbW1lbnQ/OiBzdHJpbmc7XG4gIGVuYWJsZUxvZ2dpbmc/OiBib29sZWFuO1xuICBsb2dCdWNrZXQ/OiBJQnVja2V0O1xuICBwcmljZUNsYXNzPzogXCJQcmljZUNsYXNzXzEwMFwiIHwgXCJQcmljZUNsYXNzXzIwMFwiIHwgXCJQcmljZUNsYXNzX0FsbFwiO1xufVxuXG5leHBvcnQgY2xhc3MgQ2xvdWRGcm9udERpc3RyaWJ1dGlvbiBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBpZDogc3RyaW5nO1xuICBwcml2YXRlIGRpc3RyaWJ1dGlvbjogRGlzdHJpYnV0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogQ2xvdWRGcm9udERpc3RyaWJ1dGlvblByb3BzXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5pZCA9IGlkO1xuXG4gICAgY29uc3QgZGVmYXVsdE9yaWdpbiA9IHRoaXMuY3JlYXRlT3JpZ2luKHByb3BzLmRlZmF1bHRPcmlnaW4pO1xuICAgIGNvbnN0IGRlZmF1bHRDYWNoZVBvbGljeSA9IHRoaXMucmVzb2x2ZUNhY2hlUG9saWN5KHByb3BzLmRlZmF1bHRDYWNoZVBvbGljeSk7XG5cbiAgICBjb25zdCBhZGRpdGlvbmFsQmVoYXZpb3JzOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+ID0ge307XG4gICAgaWYgKHByb3BzLmJlaGF2aW91cnMpIHtcbiAgICAgIGZvciAoY29uc3QgYmVoYXZpb3VyIG9mIHByb3BzLmJlaGF2aW91cnMpIHtcbiAgICAgICAgYWRkaXRpb25hbEJlaGF2aW9yc1tiZWhhdmlvdXIucGF0aFBhdHRlcm5dID0ge1xuICAgICAgICAgIG9yaWdpbjogdGhpcy5jcmVhdGVPcmlnaW4oYmVoYXZpb3VyLm9yaWdpbiksXG4gICAgICAgICAgY2FjaGVQb2xpY3k6IHRoaXMucmVzb2x2ZUNhY2hlUG9saWN5KGJlaGF2aW91ci5jYWNoZVBvbGljeSksXG4gICAgICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IFZpZXdlclByb3RvY29sUG9saWN5LlJFRElSRUNUX1RPX0hUVFBTLFxuICAgICAgICAgIGFsbG93ZWRNZXRob2RzOiB0aGlzLnJlc29sdmVBbGxvd2VkTWV0aG9kcyhiZWhhdmlvdXIuYWxsb3dlZE1ldGhvZHMpXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5kaXN0cmlidXRpb24gPSBuZXcgRGlzdHJpYnV0aW9uKHRoaXMsIGAke2lkfURpc3RyaWJ1dGlvbmAsIHtcbiAgICAgIGRlZmF1bHRCZWhhdmlvcjoge1xuICAgICAgICBvcmlnaW46IGRlZmF1bHRPcmlnaW4sXG4gICAgICAgIGNhY2hlUG9saWN5OiBkZWZhdWx0Q2FjaGVQb2xpY3ksXG4gICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeTogT3JpZ2luUmVxdWVzdFBvbGljeS5BTExfVklFV0VSX0VYQ0VQVF9IT1NUX0hFQURFUlxuICAgICAgfSxcbiAgICAgIGFkZGl0aW9uYWxCZWhhdmlvcnM6XG4gICAgICAgIE9iamVjdC5rZXlzKGFkZGl0aW9uYWxCZWhhdmlvcnMpLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IGFkZGl0aW9uYWxCZWhhdmlvcnNcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGRvbWFpbk5hbWVzOiBwcm9wcy5kb21haW5OYW1lcyxcbiAgICAgIGNlcnRpZmljYXRlOiBwcm9wcy5jZXJ0aWZpY2F0ZSxcbiAgICAgIGNvbW1lbnQ6IHByb3BzLmNvbW1lbnQsXG4gICAgICBlbmFibGVMb2dnaW5nOiBwcm9wcy5lbmFibGVMb2dnaW5nLFxuICAgICAgbG9nQnVja2V0OiBwcm9wcy5sb2dCdWNrZXRcbiAgICB9KTtcblxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7aWR9RGlzdHJpYnV0aW9uRG9tYWluTmFtZWAsIHtcbiAgICAgIGtleTogYCR7aWR9RGlzdHJpYnV0aW9uRG9tYWluTmFtZWAsXG4gICAgICB2YWx1ZTogdGhpcy5kaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uRG9tYWluTmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gZG9tYWluIG5hbWUgZm9yICR7aWR9YFxuICAgIH0pO1xuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtpZH1EaXN0cmlidXRpb25JZGAsIHtcbiAgICAgIGtleTogYCR7aWR9RGlzdHJpYnV0aW9uSWRgLFxuICAgICAgdmFsdWU6IHRoaXMuZGlzdHJpYnV0aW9uLmRpc3RyaWJ1dGlvbklkLFxuICAgICAgZGVzY3JpcHRpb246IGBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiBJRCBmb3IgJHtpZH1gXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU9yaWdpbihjb25maWc6IENkbk9yaWdpbkNvbmZpZyk6IElPcmlnaW4ge1xuICAgIHN3aXRjaCAoY29uZmlnLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJzM1wiOlxuICAgICAgICByZXR1cm4gUzNCdWNrZXRPcmlnaW4ud2l0aE9yaWdpbkFjY2Vzc0NvbnRyb2woY29uZmlnLmJ1Y2tldCwge1xuICAgICAgICAgIG9yaWdpblBhdGg6IGNvbmZpZy5vcmlnaW5QYXRoXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlIFwiYWxiXCI6XG4gICAgICAgIHJldHVybiBuZXcgTG9hZEJhbGFuY2VyVjJPcmlnaW4oY29uZmlnLmxvYWRCYWxhbmNlciwge1xuICAgICAgICAgIGh0dHBQb3J0OiBjb25maWcuaHR0cFBvcnQsXG4gICAgICAgICAgaHR0cHNQb3J0OiBjb25maWcuaHR0cHNQb3J0LFxuICAgICAgICAgIHByb3RvY29sUG9saWN5OiB0aGlzLnJlc29sdmVPcmlnaW5Qcm90b2NvbFBvbGljeShcbiAgICAgICAgICAgIGNvbmZpZy5wcm90b2NvbFBvbGljeVxuICAgICAgICAgIClcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgXCJodHRwXCI6XG4gICAgICAgIHJldHVybiBuZXcgSHR0cE9yaWdpbihjb25maWcuZG9tYWluTmFtZSwge1xuICAgICAgICAgIG9yaWdpblBhdGg6IGNvbmZpZy5vcmlnaW5QYXRoLFxuICAgICAgICAgIGh0dHBQb3J0OiBjb25maWcuaHR0cFBvcnQsXG4gICAgICAgICAgaHR0cHNQb3J0OiBjb25maWcuaHR0cHNQb3J0LFxuICAgICAgICAgIHByb3RvY29sUG9saWN5OiB0aGlzLnJlc29sdmVPcmlnaW5Qcm90b2NvbFBvbGljeShcbiAgICAgICAgICAgIGNvbmZpZy5wcm90b2NvbFBvbGljeVxuICAgICAgICAgIClcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlQ2FjaGVQb2xpY3koXG4gICAgcG9saWN5PzogQ2FjaGVQb2xpY3lQcmVzZXQgfCBJQ2FjaGVQb2xpY3lcbiAgKTogSUNhY2hlUG9saWN5IHtcbiAgICBpZiAoIXBvbGljeSkge1xuICAgICAgcmV0dXJuIENhY2hlUG9saWN5LkNBQ0hJTkdfT1BUSU1JWkVEO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcG9saWN5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBzd2l0Y2ggKHBvbGljeSkge1xuICAgICAgICBjYXNlIFwiQ0FDSElOR19PUFRJTUlaRURcIjpcbiAgICAgICAgICByZXR1cm4gQ2FjaGVQb2xpY3kuQ0FDSElOR19PUFRJTUlaRUQ7XG4gICAgICAgIGNhc2UgXCJDQUNISU5HX0RJU0FCTEVEXCI6XG4gICAgICAgICAgcmV0dXJuIENhY2hlUG9saWN5LkNBQ0hJTkdfRElTQUJMRUQ7XG4gICAgICAgIGNhc2UgXCJDQUNISU5HX09QVElNSVpFRF9GT1JfVU5DT01QUkVTU0VEX09CSkVDVFNcIjpcbiAgICAgICAgICByZXR1cm4gQ2FjaGVQb2xpY3kuQ0FDSElOR19PUFRJTUlaRURfRk9SX1VOQ09NUFJFU1NFRF9PQkpFQ1RTO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwb2xpY3k7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVBbGxvd2VkTWV0aG9kcyhcbiAgICBtZXRob2RzPzogXCJHRVRfSEVBRFwiIHwgXCJHRVRfSEVBRF9PUFRJT05TXCIgfCBcIkFMTFwiXG4gICk6IEFsbG93ZWRNZXRob2RzIHtcbiAgICBzd2l0Y2ggKG1ldGhvZHMpIHtcbiAgICAgIGNhc2UgXCJHRVRfSEVBRFwiOlxuICAgICAgICByZXR1cm4gQWxsb3dlZE1ldGhvZHMuQUxMT1dfR0VUX0hFQUQ7XG4gICAgICBjYXNlIFwiR0VUX0hFQURfT1BUSU9OU1wiOlxuICAgICAgICByZXR1cm4gQWxsb3dlZE1ldGhvZHMuQUxMT1dfR0VUX0hFQURfT1BUSU9OUztcbiAgICAgIGNhc2UgXCJBTExcIjpcbiAgICAgICAgcmV0dXJuIEFsbG93ZWRNZXRob2RzLkFMTE9XX0FMTDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBBbGxvd2VkTWV0aG9kcy5BTExPV19HRVRfSEVBRDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVPcmlnaW5Qcm90b2NvbFBvbGljeShcbiAgICBwb2xpY3k/OiBcIkhUVFBfT05MWVwiIHwgXCJIVFRQU19PTkxZXCIgfCBcIk1BVENIX1ZJRVdFUlwiXG4gICkge1xuICAgIC8vIENESyBpbXBvcnQgZm9yIE9yaWdpblByb3RvY29sUG9saWN5XG4gICAgY29uc3QgeyBPcmlnaW5Qcm90b2NvbFBvbGljeSB9ID0gcmVxdWlyZShcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250XCIpO1xuXG4gICAgc3dpdGNoIChwb2xpY3kpIHtcbiAgICAgIGNhc2UgXCJIVFRQX09OTFlcIjpcbiAgICAgICAgcmV0dXJuIE9yaWdpblByb3RvY29sUG9saWN5LkhUVFBfT05MWTtcbiAgICAgIGNhc2UgXCJIVFRQU19PTkxZXCI6XG4gICAgICAgIHJldHVybiBPcmlnaW5Qcm90b2NvbFBvbGljeS5IVFRQU19PTkxZO1xuICAgICAgY2FzZSBcIk1BVENIX1ZJRVdFUlwiOlxuICAgICAgICByZXR1cm4gT3JpZ2luUHJvdG9jb2xQb2xpY3kuTUFUQ0hfVklFV0VSO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIE9yaWdpblByb3RvY29sUG9saWN5LkhUVFBTX09OTFk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gZG9tYWluIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0RGlzdHJpYnV0aW9uRG9tYWluTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRpc3RyaWJ1dGlvbi5kaXN0cmlidXRpb25Eb21haW5OYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gSUQuXG4gICAqL1xuICBwdWJsaWMgZ2V0RGlzdHJpYnV0aW9uSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uSWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB1bmRlcmx5aW5nIENESyBEaXN0cmlidXRpb24gY29uc3RydWN0LlxuICAgKi9cbiAgcHVibGljIGdldERpc3RyaWJ1dGlvbigpOiBEaXN0cmlidXRpb24ge1xuICAgIHJldHVybiB0aGlzLmRpc3RyaWJ1dGlvbjtcbiAgfVxufVxuIl19
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from "./cloudFront";
|
|
@@ -1,18 +0,0 @@
|
|
|
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
|
-
__exportStar(require("./cloudFront"), exports);
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9jZG4vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2Nsb3VkRnJvbnRcIjtcbiJdfQ==
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { Construct } from "constructs";
|
|
2
|
-
/**
|
|
3
|
-
* Props for CapacityProviderDrainWaiter
|
|
4
|
-
*/
|
|
5
|
-
interface CapacityProviderDrainWaiterProps {
|
|
6
|
-
/** The ECS cluster name */
|
|
7
|
-
clusterName: string;
|
|
8
|
-
/** The capacity provider name to wait for */
|
|
9
|
-
capacityProviderName: string;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Custom resource that waits for ECS services to drain before allowing
|
|
13
|
-
* capacity provider disassociation.
|
|
14
|
-
*
|
|
15
|
-
* @see https://github.com/aws/aws-cdk/issues/14732
|
|
16
|
-
*/
|
|
17
|
-
export declare class CapacityProviderDrainWaiter extends Construct {
|
|
18
|
-
constructor(scope: Construct, id: string, props: CapacityProviderDrainWaiterProps);
|
|
19
|
-
}
|
|
20
|
-
export {};
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CapacityProviderDrainWaiter = void 0;
|
|
4
|
-
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
|
-
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
|
|
6
|
-
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
|
|
7
|
-
const constructs_1 = require("constructs");
|
|
8
|
-
const customResource_1 = require("../utilities/customResource");
|
|
9
|
-
/**
|
|
10
|
-
* Custom resource that waits for ECS services to drain before allowing
|
|
11
|
-
* capacity provider disassociation.
|
|
12
|
-
*
|
|
13
|
-
* @see https://github.com/aws/aws-cdk/issues/14732
|
|
14
|
-
*/
|
|
15
|
-
class CapacityProviderDrainWaiter extends constructs_1.Construct {
|
|
16
|
-
constructor(scope, id, props) {
|
|
17
|
-
super(scope, id);
|
|
18
|
-
const { clusterName, capacityProviderName } = props;
|
|
19
|
-
// Lambda inline code for the custom resource handler
|
|
20
|
-
const handlerCode = `
|
|
21
|
-
const { ECSClient, ListServicesCommand, DescribeServicesCommand, PutClusterCapacityProvidersCommand, DescribeClustersCommand } = require("@aws-sdk/client-ecs");
|
|
22
|
-
|
|
23
|
-
const ecsClient = new ECSClient({});
|
|
24
|
-
const POLL_INTERVAL_MS = 5000;
|
|
25
|
-
const MAX_WAIT_MS = 300000; // 5 minutes
|
|
26
|
-
|
|
27
|
-
async function sleep(ms) {
|
|
28
|
-
return new Promise(resolve => setTimeout(resolve, ms));
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
async function getClusterCapacityProviders(clusterName) {
|
|
32
|
-
const response = await ecsClient.send(new DescribeClustersCommand({
|
|
33
|
-
clusters: [clusterName]
|
|
34
|
-
}));
|
|
35
|
-
return response.clusters?.[0]?.capacityProviders || [];
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
async function waitForServicesDrained(clusterName, capacityProviderName) {
|
|
39
|
-
const startTime = Date.now();
|
|
40
|
-
|
|
41
|
-
while (Date.now() - startTime < MAX_WAIT_MS) {
|
|
42
|
-
// List all services in the cluster
|
|
43
|
-
const listResponse = await ecsClient.send(new ListServicesCommand({
|
|
44
|
-
cluster: clusterName,
|
|
45
|
-
maxResults: 100
|
|
46
|
-
}));
|
|
47
|
-
|
|
48
|
-
const serviceArns = listResponse.serviceArns || [];
|
|
49
|
-
|
|
50
|
-
if (serviceArns.length === 0) {
|
|
51
|
-
console.log("No services found in cluster - drain complete");
|
|
52
|
-
return true;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// Describe services to check running counts
|
|
56
|
-
const describeResponse = await ecsClient.send(new DescribeServicesCommand({
|
|
57
|
-
cluster: clusterName,
|
|
58
|
-
services: serviceArns
|
|
59
|
-
}));
|
|
60
|
-
|
|
61
|
-
const activeServices = (describeResponse.services || []).filter(svc => {
|
|
62
|
-
// Check if service uses this capacity provider
|
|
63
|
-
const usesCapacityProvider = (svc.capacityProviderStrategy || [])
|
|
64
|
-
.some(strategy => strategy.capacityProvider === capacityProviderName);
|
|
65
|
-
|
|
66
|
-
// Only care about services using this capacity provider that still have running tasks
|
|
67
|
-
return usesCapacityProvider && svc.runningCount > 0;
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
if (activeServices.length === 0) {
|
|
71
|
-
console.log("All services using capacity provider have drained");
|
|
72
|
-
return true;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
console.log(\`Waiting for \${activeServices.length} services to drain: \${activeServices.map(s => s.serviceName).join(", ")}\`);
|
|
76
|
-
await sleep(POLL_INTERVAL_MS);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
console.log("Timeout waiting for services to drain, proceeding anyway");
|
|
80
|
-
return false;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
async function disassociateCapacityProvider(clusterName, capacityProviderName) {
|
|
84
|
-
try {
|
|
85
|
-
// Get current capacity providers
|
|
86
|
-
const currentProviders = await getClusterCapacityProviders(clusterName);
|
|
87
|
-
|
|
88
|
-
// Filter out the one we want to remove
|
|
89
|
-
const remainingProviders = currentProviders.filter(cp => cp !== capacityProviderName);
|
|
90
|
-
|
|
91
|
-
if (remainingProviders.length === currentProviders.length) {
|
|
92
|
-
console.log(\`Capacity provider \${capacityProviderName} not associated with cluster\`);
|
|
93
|
-
return true;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// Ensure we keep at least FARGATE as a provider (required by ECS)
|
|
97
|
-
if (remainingProviders.length === 0) {
|
|
98
|
-
remainingProviders.push("FARGATE");
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
console.log(\`Disassociating \${capacityProviderName} from cluster. Remaining: \${remainingProviders.join(", ")}\`);
|
|
102
|
-
|
|
103
|
-
await ecsClient.send(new PutClusterCapacityProvidersCommand({
|
|
104
|
-
cluster: clusterName,
|
|
105
|
-
capacityProviders: remainingProviders,
|
|
106
|
-
defaultCapacityProviderStrategy: []
|
|
107
|
-
}));
|
|
108
|
-
|
|
109
|
-
console.log("Successfully disassociated capacity provider");
|
|
110
|
-
return true;
|
|
111
|
-
} catch (error) {
|
|
112
|
-
// If cluster or capacity provider doesn't exist, that's fine (already deleted)
|
|
113
|
-
if (error.name === "ClusterNotFoundException" ||
|
|
114
|
-
error.name === "ResourceNotFoundException" ||
|
|
115
|
-
error.message?.includes("does not exist")) {
|
|
116
|
-
console.log("Cluster or capacity provider not found - already cleaned up");
|
|
117
|
-
return true;
|
|
118
|
-
}
|
|
119
|
-
throw error;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
exports.handler = async (event) => {
|
|
124
|
-
console.log("Event:", JSON.stringify(event, null, 2));
|
|
125
|
-
|
|
126
|
-
const clusterName = event.ResourceProperties.ClusterName;
|
|
127
|
-
const capacityProviderName = event.ResourceProperties.CapacityProviderName;
|
|
128
|
-
const requestType = event.RequestType;
|
|
129
|
-
|
|
130
|
-
try {
|
|
131
|
-
if (requestType === "Delete") {
|
|
132
|
-
console.log(\`Handling DELETE for capacity provider \${capacityProviderName} in cluster \${clusterName}\`);
|
|
133
|
-
|
|
134
|
-
// Wait for services to drain
|
|
135
|
-
await waitForServicesDrained(clusterName, capacityProviderName);
|
|
136
|
-
|
|
137
|
-
// Disassociate capacity provider from cluster
|
|
138
|
-
await disassociateCapacityProvider(clusterName, capacityProviderName);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
// Return success for all request types
|
|
142
|
-
return {
|
|
143
|
-
PhysicalResourceId: \`\${clusterName}-\${capacityProviderName}-drain-waiter\`,
|
|
144
|
-
Data: {
|
|
145
|
-
Message: \`\${requestType} completed successfully\`
|
|
146
|
-
}
|
|
147
|
-
};
|
|
148
|
-
} catch (error) {
|
|
149
|
-
console.error("Error:", error);
|
|
150
|
-
throw error;
|
|
151
|
-
}
|
|
152
|
-
};
|
|
153
|
-
`;
|
|
154
|
-
new customResource_1.CustomResource(this, "DrainWaiter", {
|
|
155
|
-
runtime: aws_lambda_1.Runtime.NODEJS_22_X,
|
|
156
|
-
inlineCode: handlerCode,
|
|
157
|
-
timeout: aws_cdk_lib_1.Duration.minutes(6),
|
|
158
|
-
lambdaDescription: `Waits for ECS services to drain before capacity provider disassociation`,
|
|
159
|
-
roleDescription: `Role for ${clusterName} capacity provider drain waiter`,
|
|
160
|
-
inlinePolicy: [
|
|
161
|
-
new aws_iam_1.PolicyStatement({
|
|
162
|
-
effect: aws_iam_1.Effect.ALLOW,
|
|
163
|
-
actions: [
|
|
164
|
-
"ecs:ListServices",
|
|
165
|
-
"ecs:DescribeServices",
|
|
166
|
-
"ecs:DescribeClusters",
|
|
167
|
-
"ecs:PutClusterCapacityProviders"
|
|
168
|
-
],
|
|
169
|
-
resources: ["*"]
|
|
170
|
-
})
|
|
171
|
-
],
|
|
172
|
-
properties: {
|
|
173
|
-
ClusterName: clusterName,
|
|
174
|
-
CapacityProviderName: capacityProviderName
|
|
175
|
-
}
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
exports.CapacityProviderDrainWaiter = CapacityProviderDrainWaiter;
|
|
180
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FwYWNpdHlQcm92aWRlckRyYWluV2FpdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9jYXBhY2l0eVByb3ZpZGVyRHJhaW5XYWl0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQXVDO0FBQ3ZDLGlEQUE4RDtBQUM5RCx1REFBaUQ7QUFDakQsMkNBQXVDO0FBQ3ZDLGdFQUE2RDtBQVk3RDs7Ozs7R0FLRztBQUNILE1BQWEsMkJBQTRCLFNBQVEsc0JBQVM7SUFDeEQsWUFDRSxLQUFnQixFQUNoQixFQUFVLEVBQ1YsS0FBdUM7UUFFdkMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLEVBQUUsV0FBVyxFQUFFLG9CQUFvQixFQUFFLEdBQUcsS0FBSyxDQUFDO1FBRXBELHFEQUFxRDtRQUNyRCxNQUFNLFdBQVcsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQXFJdkIsQ0FBQztRQUVFLElBQUksK0JBQWMsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFO1lBQ3RDLE9BQU8sRUFBRSxvQkFBTyxDQUFDLFdBQVc7WUFDNUIsVUFBVSxFQUFFLFdBQVc7WUFDdkIsT0FBTyxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUM1QixpQkFBaUIsRUFBRSx5RUFBeUU7WUFDNUYsZUFBZSxFQUFFLFlBQVksV0FBVyxpQ0FBaUM7WUFDekUsWUFBWSxFQUFFO2dCQUNaLElBQUkseUJBQWUsQ0FBQztvQkFDbEIsTUFBTSxFQUFFLGdCQUFNLENBQUMsS0FBSztvQkFDcEIsT0FBTyxFQUFFO3dCQUNQLGtCQUFrQjt3QkFDbEIsc0JBQXNCO3dCQUN0QixzQkFBc0I7d0JBQ3RCLGlDQUFpQztxQkFDbEM7b0JBQ0QsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDO2lCQUNqQixDQUFDO2FBQ0g7WUFDRCxVQUFVLEVBQUU7Z0JBQ1YsV0FBVyxFQUFFLFdBQVc7Z0JBQ3hCLG9CQUFvQixFQUFFLG9CQUFvQjthQUMzQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQTFLRCxrRUEwS0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgUG9saWN5U3RhdGVtZW50LCBFZmZlY3QgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0IHsgUnVudGltZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgQ3VzdG9tUmVzb3VyY2UgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2N1c3RvbVJlc291cmNlXCI7XG5cbi8qKlxuICogUHJvcHMgZm9yIENhcGFjaXR5UHJvdmlkZXJEcmFpbldhaXRlclxuICovXG5pbnRlcmZhY2UgQ2FwYWNpdHlQcm92aWRlckRyYWluV2FpdGVyUHJvcHMge1xuICAvKiogVGhlIEVDUyBjbHVzdGVyIG5hbWUgKi9cbiAgY2x1c3Rlck5hbWU6IHN0cmluZztcbiAgLyoqIFRoZSBjYXBhY2l0eSBwcm92aWRlciBuYW1lIHRvIHdhaXQgZm9yICovXG4gIGNhcGFjaXR5UHJvdmlkZXJOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ3VzdG9tIHJlc291cmNlIHRoYXQgd2FpdHMgZm9yIEVDUyBzZXJ2aWNlcyB0byBkcmFpbiBiZWZvcmUgYWxsb3dpbmdcbiAqIGNhcGFjaXR5IHByb3ZpZGVyIGRpc2Fzc29jaWF0aW9uLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy8xNDczMlxuICovXG5leHBvcnQgY2xhc3MgQ2FwYWNpdHlQcm92aWRlckRyYWluV2FpdGVyIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBDYXBhY2l0eVByb3ZpZGVyRHJhaW5XYWl0ZXJQcm9wc1xuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgeyBjbHVzdGVyTmFtZSwgY2FwYWNpdHlQcm92aWRlck5hbWUgfSA9IHByb3BzO1xuXG4gICAgLy8gTGFtYmRhIGlubGluZSBjb2RlIGZvciB0aGUgY3VzdG9tIHJlc291cmNlIGhhbmRsZXJcbiAgICBjb25zdCBoYW5kbGVyQ29kZSA9IGBcbmNvbnN0IHsgRUNTQ2xpZW50LCBMaXN0U2VydmljZXNDb21tYW5kLCBEZXNjcmliZVNlcnZpY2VzQ29tbWFuZCwgUHV0Q2x1c3RlckNhcGFjaXR5UHJvdmlkZXJzQ29tbWFuZCwgRGVzY3JpYmVDbHVzdGVyc0NvbW1hbmQgfSA9IHJlcXVpcmUoXCJAYXdzLXNkay9jbGllbnQtZWNzXCIpO1xuXG5jb25zdCBlY3NDbGllbnQgPSBuZXcgRUNTQ2xpZW50KHt9KTtcbmNvbnN0IFBPTExfSU5URVJWQUxfTVMgPSA1MDAwO1xuY29uc3QgTUFYX1dBSVRfTVMgPSAzMDAwMDA7IC8vIDUgbWludXRlc1xuXG5hc3luYyBmdW5jdGlvbiBzbGVlcChtcykge1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldENsdXN0ZXJDYXBhY2l0eVByb3ZpZGVycyhjbHVzdGVyTmFtZSkge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGVjc0NsaWVudC5zZW5kKG5ldyBEZXNjcmliZUNsdXN0ZXJzQ29tbWFuZCh7XG4gICAgY2x1c3RlcnM6IFtjbHVzdGVyTmFtZV1cbiAgfSkpO1xuICByZXR1cm4gcmVzcG9uc2UuY2x1c3RlcnM/LlswXT8uY2FwYWNpdHlQcm92aWRlcnMgfHwgW107XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JTZXJ2aWNlc0RyYWluZWQoY2x1c3Rlck5hbWUsIGNhcGFjaXR5UHJvdmlkZXJOYW1lKSB7XG4gIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydFRpbWUgPCBNQVhfV0FJVF9NUykge1xuICAgIC8vIExpc3QgYWxsIHNlcnZpY2VzIGluIHRoZSBjbHVzdGVyXG4gICAgY29uc3QgbGlzdFJlc3BvbnNlID0gYXdhaXQgZWNzQ2xpZW50LnNlbmQobmV3IExpc3RTZXJ2aWNlc0NvbW1hbmQoe1xuICAgICAgY2x1c3RlcjogY2x1c3Rlck5hbWUsXG4gICAgICBtYXhSZXN1bHRzOiAxMDBcbiAgICB9KSk7XG5cbiAgICBjb25zdCBzZXJ2aWNlQXJucyA9IGxpc3RSZXNwb25zZS5zZXJ2aWNlQXJucyB8fCBbXTtcblxuICAgIGlmIChzZXJ2aWNlQXJucy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiTm8gc2VydmljZXMgZm91bmQgaW4gY2x1c3RlciAtIGRyYWluIGNvbXBsZXRlXCIpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gRGVzY3JpYmUgc2VydmljZXMgdG8gY2hlY2sgcnVubmluZyBjb3VudHNcbiAgICBjb25zdCBkZXNjcmliZVJlc3BvbnNlID0gYXdhaXQgZWNzQ2xpZW50LnNlbmQobmV3IERlc2NyaWJlU2VydmljZXNDb21tYW5kKHtcbiAgICAgIGNsdXN0ZXI6IGNsdXN0ZXJOYW1lLFxuICAgICAgc2VydmljZXM6IHNlcnZpY2VBcm5zXG4gICAgfSkpO1xuXG4gICAgY29uc3QgYWN0aXZlU2VydmljZXMgPSAoZGVzY3JpYmVSZXNwb25zZS5zZXJ2aWNlcyB8fCBbXSkuZmlsdGVyKHN2YyA9PiB7XG4gICAgICAvLyBDaGVjayBpZiBzZXJ2aWNlIHVzZXMgdGhpcyBjYXBhY2l0eSBwcm92aWRlclxuICAgICAgY29uc3QgdXNlc0NhcGFjaXR5UHJvdmlkZXIgPSAoc3ZjLmNhcGFjaXR5UHJvdmlkZXJTdHJhdGVneSB8fCBbXSlcbiAgICAgICAgLnNvbWUoc3RyYXRlZ3kgPT4gc3RyYXRlZ3kuY2FwYWNpdHlQcm92aWRlciA9PT0gY2FwYWNpdHlQcm92aWRlck5hbWUpO1xuXG4gICAgICAvLyBPbmx5IGNhcmUgYWJvdXQgc2VydmljZXMgdXNpbmcgdGhpcyBjYXBhY2l0eSBwcm92aWRlciB0aGF0IHN0aWxsIGhhdmUgcnVubmluZyB0YXNrc1xuICAgICAgcmV0dXJuIHVzZXNDYXBhY2l0eVByb3ZpZGVyICYmIHN2Yy5ydW5uaW5nQ291bnQgPiAwO1xuICAgIH0pO1xuXG4gICAgaWYgKGFjdGl2ZVNlcnZpY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5sb2coXCJBbGwgc2VydmljZXMgdXNpbmcgY2FwYWNpdHkgcHJvdmlkZXIgaGF2ZSBkcmFpbmVkXCIpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coXFxgV2FpdGluZyBmb3IgXFwke2FjdGl2ZVNlcnZpY2VzLmxlbmd0aH0gc2VydmljZXMgdG8gZHJhaW46IFxcJHthY3RpdmVTZXJ2aWNlcy5tYXAocyA9PiBzLnNlcnZpY2VOYW1lKS5qb2luKFwiLCBcIil9XFxgKTtcbiAgICBhd2FpdCBzbGVlcChQT0xMX0lOVEVSVkFMX01TKTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKFwiVGltZW91dCB3YWl0aW5nIGZvciBzZXJ2aWNlcyB0byBkcmFpbiwgcHJvY2VlZGluZyBhbnl3YXlcIik7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGlzYXNzb2NpYXRlQ2FwYWNpdHlQcm92aWRlcihjbHVzdGVyTmFtZSwgY2FwYWNpdHlQcm92aWRlck5hbWUpIHtcbiAgdHJ5IHtcbiAgICAvLyBHZXQgY3VycmVudCBjYXBhY2l0eSBwcm92aWRlcnNcbiAgICBjb25zdCBjdXJyZW50UHJvdmlkZXJzID0gYXdhaXQgZ2V0Q2x1c3RlckNhcGFjaXR5UHJvdmlkZXJzKGNsdXN0ZXJOYW1lKTtcblxuICAgIC8vIEZpbHRlciBvdXQgdGhlIG9uZSB3ZSB3YW50IHRvIHJlbW92ZVxuICAgIGNvbnN0IHJlbWFpbmluZ1Byb3ZpZGVycyA9IGN1cnJlbnRQcm92aWRlcnMuZmlsdGVyKGNwID0+IGNwICE9PSBjYXBhY2l0eVByb3ZpZGVyTmFtZSk7XG5cbiAgICBpZiAocmVtYWluaW5nUHJvdmlkZXJzLmxlbmd0aCA9PT0gY3VycmVudFByb3ZpZGVycy5sZW5ndGgpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxcYENhcGFjaXR5IHByb3ZpZGVyIFxcJHtjYXBhY2l0eVByb3ZpZGVyTmFtZX0gbm90IGFzc29jaWF0ZWQgd2l0aCBjbHVzdGVyXFxgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSB3ZSBrZWVwIGF0IGxlYXN0IEZBUkdBVEUgYXMgYSBwcm92aWRlciAocmVxdWlyZWQgYnkgRUNTKVxuICAgIGlmIChyZW1haW5pbmdQcm92aWRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZW1haW5pbmdQcm92aWRlcnMucHVzaChcIkZBUkdBVEVcIik7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coXFxgRGlzYXNzb2NpYXRpbmcgXFwke2NhcGFjaXR5UHJvdmlkZXJOYW1lfSBmcm9tIGNsdXN0ZXIuIFJlbWFpbmluZzogXFwke3JlbWFpbmluZ1Byb3ZpZGVycy5qb2luKFwiLCBcIil9XFxgKTtcblxuICAgIGF3YWl0IGVjc0NsaWVudC5zZW5kKG5ldyBQdXRDbHVzdGVyQ2FwYWNpdHlQcm92aWRlcnNDb21tYW5kKHtcbiAgICAgIGNsdXN0ZXI6IGNsdXN0ZXJOYW1lLFxuICAgICAgY2FwYWNpdHlQcm92aWRlcnM6IHJlbWFpbmluZ1Byb3ZpZGVycyxcbiAgICAgIGRlZmF1bHRDYXBhY2l0eVByb3ZpZGVyU3RyYXRlZ3k6IFtdXG4gICAgfSkpO1xuXG4gICAgY29uc29sZS5sb2coXCJTdWNjZXNzZnVsbHkgZGlzYXNzb2NpYXRlZCBjYXBhY2l0eSBwcm92aWRlclwiKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBJZiBjbHVzdGVyIG9yIGNhcGFjaXR5IHByb3ZpZGVyIGRvZXNuJ3QgZXhpc3QsIHRoYXQncyBmaW5lIChhbHJlYWR5IGRlbGV0ZWQpXG4gICAgaWYgKGVycm9yLm5hbWUgPT09IFwiQ2x1c3Rlck5vdEZvdW5kRXhjZXB0aW9uXCIgfHxcbiAgICAgICAgZXJyb3IubmFtZSA9PT0gXCJSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uXCIgfHxcbiAgICAgICAgZXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoXCJkb2VzIG5vdCBleGlzdFwiKSkge1xuICAgICAgY29uc29sZS5sb2coXCJDbHVzdGVyIG9yIGNhcGFjaXR5IHByb3ZpZGVyIG5vdCBmb3VuZCAtIGFscmVhZHkgY2xlYW5lZCB1cFwiKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoZXZlbnQpID0+IHtcbiAgY29uc29sZS5sb2coXCJFdmVudDpcIiwgSlNPTi5zdHJpbmdpZnkoZXZlbnQsIG51bGwsIDIpKTtcblxuICBjb25zdCBjbHVzdGVyTmFtZSA9IGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5DbHVzdGVyTmFtZTtcbiAgY29uc3QgY2FwYWNpdHlQcm92aWRlck5hbWUgPSBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuQ2FwYWNpdHlQcm92aWRlck5hbWU7XG4gIGNvbnN0IHJlcXVlc3RUeXBlID0gZXZlbnQuUmVxdWVzdFR5cGU7XG5cbiAgdHJ5IHtcbiAgICBpZiAocmVxdWVzdFR5cGUgPT09IFwiRGVsZXRlXCIpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxcYEhhbmRsaW5nIERFTEVURSBmb3IgY2FwYWNpdHkgcHJvdmlkZXIgXFwke2NhcGFjaXR5UHJvdmlkZXJOYW1lfSBpbiBjbHVzdGVyIFxcJHtjbHVzdGVyTmFtZX1cXGApO1xuXG4gICAgICAvLyBXYWl0IGZvciBzZXJ2aWNlcyB0byBkcmFpblxuICAgICAgYXdhaXQgd2FpdEZvclNlcnZpY2VzRHJhaW5lZChjbHVzdGVyTmFtZSwgY2FwYWNpdHlQcm92aWRlck5hbWUpO1xuXG4gICAgICAvLyBEaXNhc3NvY2lhdGUgY2FwYWNpdHkgcHJvdmlkZXIgZnJvbSBjbHVzdGVyXG4gICAgICBhd2FpdCBkaXNhc3NvY2lhdGVDYXBhY2l0eVByb3ZpZGVyKGNsdXN0ZXJOYW1lLCBjYXBhY2l0eVByb3ZpZGVyTmFtZSk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHN1Y2Nlc3MgZm9yIGFsbCByZXF1ZXN0IHR5cGVzXG4gICAgcmV0dXJuIHtcbiAgICAgIFBoeXNpY2FsUmVzb3VyY2VJZDogXFxgXFwke2NsdXN0ZXJOYW1lfS1cXCR7Y2FwYWNpdHlQcm92aWRlck5hbWV9LWRyYWluLXdhaXRlclxcYCxcbiAgICAgIERhdGE6IHtcbiAgICAgICAgTWVzc2FnZTogXFxgXFwke3JlcXVlc3RUeXBlfSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5XFxgXG4gICAgICB9XG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3I6XCIsIGVycm9yKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcbmA7XG5cbiAgICBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgXCJEcmFpbldhaXRlclwiLCB7XG4gICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgaW5saW5lQ29kZTogaGFuZGxlckNvZGUsXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDYpLFxuICAgICAgbGFtYmRhRGVzY3JpcHRpb246IGBXYWl0cyBmb3IgRUNTIHNlcnZpY2VzIHRvIGRyYWluIGJlZm9yZSBjYXBhY2l0eSBwcm92aWRlciBkaXNhc3NvY2lhdGlvbmAsXG4gICAgICByb2xlRGVzY3JpcHRpb246IGBSb2xlIGZvciAke2NsdXN0ZXJOYW1lfSBjYXBhY2l0eSBwcm92aWRlciBkcmFpbiB3YWl0ZXJgLFxuICAgICAgaW5saW5lUG9saWN5OiBbXG4gICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgIFwiZWNzOkxpc3RTZXJ2aWNlc1wiLFxuICAgICAgICAgICAgXCJlY3M6RGVzY3JpYmVTZXJ2aWNlc1wiLFxuICAgICAgICAgICAgXCJlY3M6RGVzY3JpYmVDbHVzdGVyc1wiLFxuICAgICAgICAgICAgXCJlY3M6UHV0Q2x1c3RlckNhcGFjaXR5UHJvdmlkZXJzXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIHJlc291cmNlczogW1wiKlwiXVxuICAgICAgICB9KVxuICAgICAgXSxcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgQ2x1c3Rlck5hbWU6IGNsdXN0ZXJOYW1lLFxuICAgICAgICBDYXBhY2l0eVByb3ZpZGVyTmFtZTogY2FwYWNpdHlQcm92aWRlck5hbWVcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import { Construct } from "constructs";
|
|
2
|
-
import { type ITable } from "aws-cdk-lib/aws-dynamodb";
|
|
3
|
-
import { type IGrantable, type Grant } from "aws-cdk-lib/aws-iam";
|
|
4
|
-
export type DynamoDBAttributeType = "S" | "N" | "B";
|
|
5
|
-
export interface DynamoDBKeySchema {
|
|
6
|
-
name: string;
|
|
7
|
-
type: DynamoDBAttributeType;
|
|
8
|
-
}
|
|
9
|
-
export interface DynamoDBGlobalSecondaryIndex {
|
|
10
|
-
indexName: string;
|
|
11
|
-
partitionKey: DynamoDBKeySchema;
|
|
12
|
-
sortKey?: DynamoDBKeySchema;
|
|
13
|
-
projectionType?: "ALL" | "KEYS_ONLY" | "INCLUDE";
|
|
14
|
-
nonKeyAttributes?: string[];
|
|
15
|
-
}
|
|
16
|
-
export interface DynamoDBTableProps {
|
|
17
|
-
tableName?: string;
|
|
18
|
-
partitionKey: DynamoDBKeySchema;
|
|
19
|
-
sortKey?: DynamoDBKeySchema;
|
|
20
|
-
billingMode?: "PAY_PER_REQUEST" | "PROVISIONED";
|
|
21
|
-
readCapacity?: number;
|
|
22
|
-
writeCapacity?: number;
|
|
23
|
-
globalSecondaryIndexes?: DynamoDBGlobalSecondaryIndex[];
|
|
24
|
-
timeToLiveAttribute?: string;
|
|
25
|
-
stream?: "NEW_IMAGE" | "OLD_IMAGE" | "NEW_AND_OLD_IMAGES" | "KEYS_ONLY";
|
|
26
|
-
pointInTimeRecovery?: boolean;
|
|
27
|
-
encryption?: "AWS_OWNED" | "AWS_MANAGED" | "CUSTOMER_MANAGED";
|
|
28
|
-
removalPolicy?: "DESTROY" | "RETAIN" | "SNAPSHOT";
|
|
29
|
-
}
|
|
30
|
-
export declare class DynamoDBTable extends Construct {
|
|
31
|
-
readonly id: string;
|
|
32
|
-
private table;
|
|
33
|
-
constructor(scope: Construct, id: string, props: DynamoDBTableProps);
|
|
34
|
-
/**
|
|
35
|
-
* Get the DynamoDB table name.
|
|
36
|
-
*/
|
|
37
|
-
getTableName(): string;
|
|
38
|
-
/**
|
|
39
|
-
* Get the DynamoDB table ARN.
|
|
40
|
-
*/
|
|
41
|
-
getTableArn(): string;
|
|
42
|
-
/**
|
|
43
|
-
* Get the DynamoDB table stream ARN (if streaming is enabled).
|
|
44
|
-
*/
|
|
45
|
-
getTableStreamArn(): string | undefined;
|
|
46
|
-
/**
|
|
47
|
-
* Get the underlying CDK Table construct.
|
|
48
|
-
*/
|
|
49
|
-
getTable(): ITable;
|
|
50
|
-
/**
|
|
51
|
-
* Grant read permissions to the grantee.
|
|
52
|
-
*/
|
|
53
|
-
grantRead(grantee: IGrantable): Grant;
|
|
54
|
-
/**
|
|
55
|
-
* Grant write permissions to the grantee.
|
|
56
|
-
*/
|
|
57
|
-
grantWrite(grantee: IGrantable): Grant;
|
|
58
|
-
/**
|
|
59
|
-
* Grant read and write permissions to the grantee.
|
|
60
|
-
*/
|
|
61
|
-
grantReadWrite(grantee: IGrantable): Grant;
|
|
62
|
-
/**
|
|
63
|
-
* Grant full access (read, write, delete) to the grantee.
|
|
64
|
-
*/
|
|
65
|
-
grantFullAccess(grantee: IGrantable): Grant;
|
|
66
|
-
/**
|
|
67
|
-
* Grant stream read permissions to the grantee.
|
|
68
|
-
*/
|
|
69
|
-
grantStreamRead(grantee: IGrantable): Grant;
|
|
70
|
-
}
|