@fjall/components-infrastructure 0.80.4 → 0.82.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.
Files changed (52) hide show
  1. package/dist/lib/__tests__/setup.js +1 -78
  2. package/dist/lib/app.d.ts +5 -0
  3. package/dist/lib/app.js +29 -1
  4. package/dist/lib/config/aws/ecrDefaultImage.js +23 -21
  5. package/dist/lib/patterns/aws/compute.d.ts +29 -21
  6. package/dist/lib/patterns/aws/compute.js +10 -3
  7. package/dist/lib/patterns/aws/database.d.ts +1 -0
  8. package/dist/lib/patterns/aws/database.js +33 -3
  9. package/dist/lib/patterns/aws/storage.d.ts +1 -0
  10. package/dist/lib/patterns/aws/storage.js +23 -1
  11. package/dist/lib/resources/aws/compute/ecs.d.ts +50 -2
  12. package/dist/lib/resources/aws/compute/ecs.js +134 -18
  13. package/dist/lib/resources/aws/compute/ecsFreeTier.d.ts +2 -1
  14. package/dist/lib/resources/aws/compute/ecsFreeTier.js +1 -352
  15. package/dist/lib/resources/aws/compute/ecsSpot.d.ts +2 -1
  16. package/dist/lib/resources/aws/compute/ecsSpot.js +1 -332
  17. package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.js +1 -180
  18. package/dist/lib/resources/aws/monitoring/monitoringRole.js +61 -4
  19. package/dist/lib/resources/aws/utilities/cfnOutput.js +1 -13
  20. package/package.json +3 -3
  21. package/dist/lib/patterns/aws/cdn.d.ts +0 -133
  22. package/dist/lib/patterns/aws/cdn.js +0 -216
  23. package/dist/lib/patterns/aws/dynamodb.d.ts +0 -66
  24. package/dist/lib/patterns/aws/dynamodb.js +0 -106
  25. package/dist/lib/patterns/aws/loadBalancer.d.ts +0 -163
  26. package/dist/lib/patterns/aws/loadBalancer.js +0 -278
  27. package/dist/lib/patterns/aws/queue.d.ts +0 -61
  28. package/dist/lib/patterns/aws/queue.js +0 -103
  29. package/dist/lib/resources/aws/cdn/cloudFront.d.ts +0 -65
  30. package/dist/lib/resources/aws/cdn/cloudFront.js +0 -135
  31. package/dist/lib/resources/aws/cdn/index.d.ts +0 -1
  32. package/dist/lib/resources/aws/cdn/index.js +0 -18
  33. package/dist/lib/resources/aws/compute/capacityProviderDrainWaiter.d.ts +0 -20
  34. package/dist/lib/resources/aws/compute/capacityProviderDrainWaiter.js +0 -180
  35. package/dist/lib/resources/aws/database/dynamodb.d.ts +0 -70
  36. package/dist/lib/resources/aws/database/dynamodb.js +0 -170
  37. package/dist/lib/resources/aws/database/rdsDeletionWaiter.d.ts +0 -33
  38. package/dist/lib/resources/aws/database/rdsDeletionWaiter.js +0 -74
  39. package/dist/lib/resources/aws/messaging/index.d.ts +0 -1
  40. package/dist/lib/resources/aws/messaging/index.js +0 -18
  41. package/dist/lib/resources/aws/messaging/sqs.d.ts +0 -65
  42. package/dist/lib/resources/aws/messaging/sqs.js +0 -195
  43. package/dist/lib/resources/aws/networking/vpcEndpoint.d.ts +0 -20
  44. package/dist/lib/resources/aws/networking/vpcEndpoint.js +0 -59
  45. package/dist/lib/resources/aws/networking/vpcEndpoints.d.ts +0 -71
  46. package/dist/lib/resources/aws/networking/vpcEndpoints.js +0 -125
  47. package/dist/lib/resources/aws/utilities/cfnOutput.test.d.ts +0 -1
  48. package/dist/lib/resources/aws/utilities/cfnOutput.test.js +0 -102
  49. package/dist/lib/utils/sanitizeCfnKey.d.ts +0 -5
  50. package/dist/lib/utils/sanitizeCfnKey.js +0 -11
  51. package/dist/lib/utils/tagResource.d.ts +0 -24
  52. 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
- }