@liflig/cdk 2.18.5 → 2.18.7

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 (140) hide show
  1. package/assets/cloudtrail-slack-integration-lambda/main.py +267 -0
  2. package/assets/pipeline-slack-notification-lambda/index.py +300 -0
  3. package/assets/prepare-cdk-source-lambda/index.py +159 -0
  4. package/assets/slack-alarm-lambda/index.py +103 -0
  5. package/lib/alarms/database-alarms.d.ts +125 -0
  6. package/lib/alarms/database-alarms.js +171 -0
  7. package/lib/alarms/index.d.ts +3 -0
  8. package/lib/alarms/index.js +10 -0
  9. package/lib/alarms/service-alarms.d.ts +145 -0
  10. package/lib/alarms/service-alarms.js +148 -0
  11. package/lib/alarms/ses-alarms.d.ts +67 -0
  12. package/lib/alarms/ses-alarms.js +49 -0
  13. package/lib/alarms/slack-alarm.d.ts +25 -0
  14. package/lib/alarms/slack-alarm.js +47 -0
  15. package/lib/bastion-host.d.ts +41 -0
  16. package/lib/bastion-host.js +86 -0
  17. package/lib/bin/cdk-create-snapshots.d.ts +2 -0
  18. package/lib/bin/fetch-pipeline-variables.d.ts +2 -0
  19. package/lib/build-artifacts/index.d.ts +68 -0
  20. package/lib/build-artifacts/index.js +118 -0
  21. package/lib/cdk-deploy/cdk-deploy.d.ts +63 -0
  22. package/lib/cdk-deploy/cdk-deploy.js +175 -0
  23. package/lib/cdk-deploy/index.d.ts +1 -0
  24. package/lib/cdk-deploy/index.js +6 -0
  25. package/lib/cdk-deploy/start-deploy-handler.d.ts +8 -0
  26. package/lib/cdk-deploy/start-deploy-handler.js +72 -0
  27. package/lib/cdk-deploy/status-handler.d.ts +6 -0
  28. package/lib/cdk-deploy/status-handler.js +83 -0
  29. package/lib/cdk-pipelines/cloud-assembly-lookup-handler.d.ts +6 -0
  30. package/lib/cdk-pipelines/cloud-assembly-lookup-handler.js +63 -0
  31. package/lib/cdk-pipelines/index.d.ts +3 -0
  32. package/lib/cdk-pipelines/index.js +10 -0
  33. package/lib/cdk-pipelines/liflig-cdk-pipeline.d.ts +110 -0
  34. package/lib/cdk-pipelines/liflig-cdk-pipeline.js +232 -0
  35. package/lib/cdk-pipelines/slack-notification.d.ts +51 -0
  36. package/lib/cdk-pipelines/slack-notification.js +54 -0
  37. package/lib/cdk-pipelines/variables.d.ts +15 -0
  38. package/lib/cdk-pipelines/variables.js +80 -0
  39. package/lib/cloudtrail-slack-integration/cloudtrail-slack-integration.d.ts +47 -0
  40. package/lib/cloudtrail-slack-integration/cloudtrail-slack-integration.js +211 -0
  41. package/lib/cloudtrail-slack-integration/index.d.ts +1 -0
  42. package/lib/cloudtrail-slack-integration/index.js +6 -0
  43. package/lib/configure-parameters/configure-parameters.d.ts +61 -0
  44. package/lib/configure-parameters/configure-parameters.js +94 -0
  45. package/lib/configure-parameters/index.d.ts +1 -0
  46. package/lib/configure-parameters/index.js +6 -0
  47. package/lib/cross-region-ssm-parameter.d.ts +13 -0
  48. package/lib/cross-region-ssm-parameter.js +46 -0
  49. package/lib/ecs/cluster.d.ts +25 -0
  50. package/lib/ecs/cluster.js +70 -0
  51. package/lib/ecs/fargate-service.d.ts +63 -0
  52. package/lib/ecs/fargate-service.js +98 -0
  53. package/lib/ecs/index.d.ts +3 -0
  54. package/lib/ecs/index.js +10 -0
  55. package/lib/ecs/listener-rule.d.ts +25 -0
  56. package/lib/ecs/listener-rule.js +27 -0
  57. package/lib/ecs-update-image/artifact-status.d.ts +39 -0
  58. package/lib/ecs-update-image/artifact-status.js +41 -0
  59. package/lib/ecs-update-image/ecs-update-image.d.ts +41 -0
  60. package/lib/ecs-update-image/ecs-update-image.js +98 -0
  61. package/lib/ecs-update-image/index.d.ts +3 -0
  62. package/lib/ecs-update-image/index.js +10 -0
  63. package/lib/ecs-update-image/start-deploy-handler.d.ts +6 -0
  64. package/lib/ecs-update-image/start-deploy-handler.js +104 -0
  65. package/lib/ecs-update-image/status-handler.d.ts +11 -0
  66. package/lib/ecs-update-image/status-handler.js +74 -0
  67. package/lib/ecs-update-image/tag.d.ts +47 -0
  68. package/lib/ecs-update-image/tag.js +67 -0
  69. package/lib/feature-flags.d.ts +18 -0
  70. package/lib/feature-flags.js +48 -0
  71. package/lib/griid/artefact-bucket.d.ts +7 -0
  72. package/lib/griid/artefact-bucket.js +30 -0
  73. package/lib/griid/index.d.ts +4 -0
  74. package/lib/griid/index.js +18 -0
  75. package/lib/hosted-zone-with-param.d.ts +29 -0
  76. package/lib/hosted-zone-with-param.js +65 -0
  77. package/lib/index.d.ts +32 -0
  78. package/lib/kinesis/index.d.ts +1 -0
  79. package/lib/kinesis/index.js +6 -0
  80. package/lib/kinesis/kinesis-to-datadog-stream.d.ts +28 -0
  81. package/lib/kinesis/kinesis-to-datadog-stream.js +126 -0
  82. package/lib/load-balancer/index.d.ts +1 -0
  83. package/lib/load-balancer/index.js +6 -0
  84. package/lib/load-balancer/load-balancer.d.ts +16 -0
  85. package/lib/load-balancer/load-balancer.js +60 -0
  86. package/lib/pipelines/conventions.d.ts +14 -0
  87. package/lib/pipelines/conventions.js +24 -0
  88. package/lib/pipelines/deploy-env.d.ts +18 -0
  89. package/lib/pipelines/deploy-env.js +96 -0
  90. package/lib/pipelines/index.d.ts +2 -0
  91. package/lib/pipelines/index.js +8 -0
  92. package/lib/pipelines/liflig-cdk-deployer-deps.d.ts +13 -0
  93. package/lib/pipelines/liflig-cdk-deployer-deps.js +35 -0
  94. package/lib/pipelines/pipeline.d.ts +78 -0
  95. package/lib/pipelines/pipeline.js +224 -0
  96. package/lib/platform/index.d.ts +1 -0
  97. package/lib/platform/index.js +7 -0
  98. package/lib/platform/platform.d.ts +37 -0
  99. package/lib/platform/platform.js +57 -0
  100. package/lib/rds/database.d.ts +49 -0
  101. package/lib/rds/database.js +60 -0
  102. package/lib/rds/index.d.ts +1 -0
  103. package/lib/rds/index.js +6 -0
  104. package/lib/ses/configurationsetdeliveryoptions/index.d.ts +26 -0
  105. package/lib/ses/configurationsetdeliveryoptions/index.js +48 -0
  106. package/lib/ses/configurationsetsnsdestination/handler.d.ts +17 -0
  107. package/lib/ses/configurationsetsnsdestination/handler.js +75 -0
  108. package/lib/ses/configurationsetsnsdestination/index.d.ts +29 -0
  109. package/lib/ses/configurationsetsnsdestination/index.js +75 -0
  110. package/lib/ses/index.d.ts +4 -0
  111. package/lib/ses/index.js +12 -0
  112. package/lib/ses/sesdomain/handler.d.ts +10 -0
  113. package/lib/ses/sesdomain/handler.js +82 -0
  114. package/lib/ses/sesdomain/index.d.ts +57 -0
  115. package/lib/ses/sesdomain/index.js +94 -0
  116. package/lib/ses/sesverifyemail/handler.d.ts +9 -0
  117. package/lib/ses/sesverifyemail/handler.js +25 -0
  118. package/lib/ses/sesverifyemail/index.d.ts +13 -0
  119. package/lib/ses/sesverifyemail/index.js +51 -0
  120. package/lib/snapshots.d.ts +4 -0
  121. package/lib/snapshots.js +214 -0
  122. package/lib/ssm-parameter-backed-resource.d.ts +45 -0
  123. package/lib/ssm-parameter-backed-resource.js +67 -0
  124. package/lib/ssm-parameter-reader.d.ts +21 -0
  125. package/lib/ssm-parameter-reader.js +48 -0
  126. package/lib/tags.d.ts +8 -0
  127. package/lib/tags.js +36 -0
  128. package/lib/utils.d.ts +2 -0
  129. package/lib/utils.js +17 -0
  130. package/lib/webapp/index.d.ts +3 -0
  131. package/lib/webapp/index.js +10 -0
  132. package/lib/webapp/monitor.d.ts +187 -0
  133. package/lib/webapp/monitor.js +156 -0
  134. package/lib/webapp/security-headers.d.ts +38 -0
  135. package/lib/webapp/security-headers.js +129 -0
  136. package/lib/webapp/webapp.d.ts +116 -0
  137. package/lib/webapp/webapp.js +118 -0
  138. package/lib/webapp-deploy-via-role.d.ts +25 -0
  139. package/lib/webapp-deploy-via-role.js +32 -0
  140. package/package.json +4 -3
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createCloudAssemblySnapshot = void 0;
4
+ /* eslint-disable @typescript-eslint/no-unsafe-assignment */
5
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
6
+ /* eslint-disable @typescript-eslint/no-unsafe-return */
7
+ const cpy = require("cpy");
8
+ const del = require("del");
9
+ const fs = require("fs");
10
+ const glob = require("glob");
11
+ const path = require("path");
12
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
+ function removeVersion(data) {
14
+ const cp = {
15
+ ...data,
16
+ };
17
+ delete cp.version;
18
+ return cp;
19
+ }
20
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
+ function removeTrace(data) {
22
+ if (data instanceof Array) {
23
+ return data.map(removeTrace);
24
+ }
25
+ if (data === Object(data)) {
26
+ return Object.fromEntries(Object.entries(data)
27
+ .filter(([key]) => key !== "trace")
28
+ .map(([key, value]) => [key, removeTrace(value)]));
29
+ }
30
+ return data;
31
+ }
32
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
33
+ function removeRuntimeLibraries(data) {
34
+ const cp = {
35
+ ...data,
36
+ };
37
+ if (data.runtime) {
38
+ cp.runtime = {
39
+ ...data.runtime,
40
+ };
41
+ delete cp.runtime.libraries;
42
+ }
43
+ return cp;
44
+ }
45
+ const currentVersionRegex = /^(.+CurrentVersion[0-9A-F]{8})[0-9a-f]{32}$/;
46
+ /**
47
+ * Match a resource created by `lambda.Function.currentVersion`, which
48
+ * will include the asset hash as part of the reousrce name and return
49
+ * a snapshot-friendly version of it if found.
50
+ */
51
+ function rewriteCurrentVersionIfFound(value) {
52
+ const match = currentVersionRegex.exec(value);
53
+ return match ? `${match[1]}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx` : null;
54
+ }
55
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
56
+ function removeAssetDetailsFromTemplate(data) {
57
+ if (data instanceof Array) {
58
+ return data.map(removeAssetDetailsFromTemplate);
59
+ }
60
+ if (data === Object(data)) {
61
+ return Object.fromEntries(Object.entries(data)
62
+ .map(([key, value]) => {
63
+ const newCurrentVersion = rewriteCurrentVersionIfFound(key);
64
+ if (newCurrentVersion) {
65
+ return [newCurrentVersion, removeAssetDetailsFromTemplate(value)];
66
+ }
67
+ else if (key.includes("AssetParameter")) {
68
+ return null;
69
+ }
70
+ else if (key === "Ref" &&
71
+ typeof value === "string" &&
72
+ value.includes("AssetParameters")) {
73
+ return [key, "snapshot-value"];
74
+ }
75
+ else if (key === "aws:asset:path" &&
76
+ typeof value === "string" &&
77
+ /asset\.[0-9a-f]{64}/.test(value)) {
78
+ return [key, "asset.snapshot-value"];
79
+ }
80
+ else {
81
+ return [key, removeAssetDetailsFromTemplate(value)];
82
+ }
83
+ })
84
+ .filter((it) => it != null));
85
+ }
86
+ if (typeof data === "string") {
87
+ const newCurrentVersion = rewriteCurrentVersionIfFound(data);
88
+ if (newCurrentVersion) {
89
+ return newCurrentVersion;
90
+ }
91
+ // Handle typical content hashes.
92
+ return data.replace(/[0-9a-f]{64}/g, "snapshot-value");
93
+ }
94
+ return data;
95
+ }
96
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
97
+ function removeAssetDetailsFromManifest(data) {
98
+ if (data instanceof Array) {
99
+ return data.map(removeAssetDetailsFromManifest);
100
+ }
101
+ if (data === Object(data)) {
102
+ // aws:cdk:asset in metadata
103
+ if (data["type"] === "aws:cdk:asset" && "data" in data) {
104
+ return {
105
+ ...data,
106
+ data: "snapshot-value",
107
+ };
108
+ }
109
+ return Object.fromEntries(Object.entries(data)
110
+ .map(([key, value]) => {
111
+ if (key.includes("AssetParameters")) {
112
+ return null;
113
+ }
114
+ else {
115
+ return [key, removeAssetDetailsFromManifest(value)];
116
+ }
117
+ })
118
+ .filter((it) => it != null));
119
+ }
120
+ if (typeof data === "string") {
121
+ const newCurrentVersion = rewriteCurrentVersionIfFound(data);
122
+ if (newCurrentVersion) {
123
+ return newCurrentVersion;
124
+ }
125
+ // Handle typical content hashes.
126
+ return data.replace(/[0-9a-f]{64}/g, "snapshot-value");
127
+ }
128
+ return data;
129
+ }
130
+ /**
131
+ * Remove the CDKMetadata resources that is part of the synthesized
132
+ * template since CDK 1.63.0.
133
+ */
134
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
135
+ function removeCdkMetadataResourceFromTemplate(data) {
136
+ const cp = {
137
+ ...data,
138
+ Resources: {
139
+ ...data.Resources,
140
+ },
141
+ };
142
+ delete cp.Resources.CDKMetadata;
143
+ return cp;
144
+ }
145
+ function prepareManifestForSnapshot(content) {
146
+ const input = JSON.parse(content);
147
+ const output = [
148
+ removeVersion,
149
+ // Remove the runtime version information so it don't conflict with CI
150
+ // or other users generating the snapshots.
151
+ removeRuntimeLibraries,
152
+ // Remove the trace from manifest for now.
153
+ removeTrace,
154
+ // Avoid details (hashes) from assets.
155
+ removeAssetDetailsFromManifest,
156
+ ].reduce((acc, fn) => fn(acc), input);
157
+ return JSON.stringify(output, undefined, " ");
158
+ }
159
+ /**
160
+ * Transform the Cloud Assembly manifest file so that it can be persisted
161
+ * as a snapshot without causing invalidations for every synthesize.
162
+ */
163
+ async function prepareManifestFileForSnapshot(file) {
164
+ const result = prepareManifestForSnapshot(await fs.promises.readFile(file, "utf8"));
165
+ await fs.promises.writeFile(file, result);
166
+ }
167
+ function prepareTemplateForSnapshot(content) {
168
+ const input = JSON.parse(content);
169
+ const output = [
170
+ removeCdkMetadataResourceFromTemplate,
171
+ // Avoid details (hashes) from assets.
172
+ removeAssetDetailsFromTemplate,
173
+ ].reduce((acc, fn) => fn(acc), input);
174
+ return JSON.stringify(output, undefined, " ");
175
+ }
176
+ /**
177
+ * Transform a Cloud Assembly template file so that it can be persisted
178
+ * as a snapshot without causing invalidations for minor changes.
179
+ */
180
+ async function prepareTemplateFileForSnapshot(file) {
181
+ const result = prepareTemplateForSnapshot(await fs.promises.readFile(file, "utf8"));
182
+ await fs.promises.writeFile(file, result);
183
+ }
184
+ /**
185
+ * Convert a Cloud Assembly to a snapshot.
186
+ */
187
+ async function createCloudAssemblySnapshot(src, dst) {
188
+ const base = path.join(process.cwd(), dst);
189
+ await cpy(".", base, {
190
+ parents: true,
191
+ cwd: path.join(process.cwd(), src),
192
+ });
193
+ // Don't keep track of manifest version.
194
+ await del(path.join(dst, "**/cdk.out"));
195
+ // The tree file doesn't give us much value as part of the snapshot.
196
+ await del(path.join(dst, "tree.json"));
197
+ // Remove asset contents for now.
198
+ await del(path.join(dst, "**/asset.*"));
199
+ // Remove asset configs so we don't have to update
200
+ // snapshots for asset changes.
201
+ await del(path.join(dst, "**/*.assets.json"));
202
+ // Remove graphviz files generated when using CDK Pipelines
203
+ await del(path.join(dst, "**/*.dot"));
204
+ // Transform the manifest to be more snapshot friendly.
205
+ for (const file of glob.sync("**/manifest.json", { cwd: base })) {
206
+ await prepareManifestFileForSnapshot(path.join(base, file));
207
+ }
208
+ // Transform all templates.
209
+ for (const file of glob.sync("**/*.template.json", { cwd: base })) {
210
+ await prepareTemplateFileForSnapshot(path.join(base, file));
211
+ }
212
+ }
213
+ exports.createCloudAssemblySnapshot = createCloudAssemblySnapshot;
214
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcHNob3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NuYXBzaG90cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw0REFBNEQ7QUFDNUQsK0RBQStEO0FBQy9ELHdEQUF3RDtBQUN4RCwyQkFBMEI7QUFDMUIsMkJBQTBCO0FBQzFCLHlCQUF3QjtBQUN4Qiw2QkFBNEI7QUFDNUIsNkJBQTRCO0FBRTVCLDhEQUE4RDtBQUM5RCxTQUFTLGFBQWEsQ0FBQyxJQUFTO0lBQzlCLE1BQU0sRUFBRSxHQUFHO1FBQ1QsR0FBRyxJQUFJO0tBQ1IsQ0FBQTtJQUVELE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQTtJQUNqQixPQUFPLEVBQUUsQ0FBQTtBQUNYLENBQUM7QUFFRCw4REFBOEQ7QUFDOUQsU0FBUyxXQUFXLENBQUMsSUFBUztJQUM1QixJQUFJLElBQUksWUFBWSxLQUFLLEVBQUUsQ0FBQztRQUMxQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDOUIsQ0FBQztJQUVELElBQUksSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzFCLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FDdkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUErQixDQUFDO2FBQzVDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxPQUFPLENBQUM7YUFDbEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQ3BELENBQUE7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDO0FBRUQsOERBQThEO0FBQzlELFNBQVMsc0JBQXNCLENBQUMsSUFBUztJQUN2QyxNQUFNLEVBQUUsR0FBRztRQUNULEdB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QyxpQ0FBaUM7SUFDakMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQTtJQUV2QyxrREFBa0Q7SUFDbEQsK0JBQStCO0lBQy9CLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQTtJQUU3QywyREFBMkQ7SUFDM0QsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQTtJQUVyQyx1REFBdUQ7SUFDdkQsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUNoRSxNQUFNLDhCQUE4QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDN0QsQ0FBQztJQUVELDJCQUEyQjtJQUMzQixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ2xFLE1BQU0sOEJBQThCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUM3RCxDQUFDO0FBQ0gsQ0FBQztBQXBDRCxrRUFvQ0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnQgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1yZXR1cm4gKi9cbmltcG9ydCAqIGFzIGNweSBmcm9tIFwiY3B5XCJcbmltcG9ydCAqIGFzIGRlbCBmcm9tIFwiZGVsXCJcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiXG5pbXBvcnQgKiBhcyBnbG9iIGZyb20gXCJnbG9iXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIlxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZnVuY3Rpb24gcmVtb3ZlVmVyc2lvbihkYXRhOiBhbnkpOiBhbnkge1xuICBjb25zdCBjcCA9IHtcbiAgICAuLi5kYXRhLFxuICB9XG5cbiAgZGVsZXRlIGNwLnZlcnNpb25cbiAgcmV0dXJuIGNwXG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5mdW5jdGlvbiByZW1vdmVUcmFjZShkYXRhOiBhbnkpOiBhbnkge1xuICBpZiAoZGF0YSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgcmV0dXJuIGRhdGEubWFwKHJlbW92ZVRyYWNlKVxuICB9XG5cbiAgaWYgKGRhdGEgPT09IE9iamVjdChkYXRhKSkge1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgICAuZmlsdGVyKChba2V5XSkgPT4ga2V5ICE9PSBcInRyYWNlXCIpXG4gICAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW2tleSwgcmVtb3ZlVHJhY2UodmFsdWUpXSksXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIGRhdGFcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmZ1bmN0aW9uIHJlbW92ZVJ1bnRpbWVMaWJyYXJpZXMoZGF0YTogYW55KTogYW55IHtcbiAgY29uc3QgY3AgPSB7XG4gICAgLi4uZGF0YSxcbiAgfVxuXG4gIGlmIChkYXRhLnJ1bnRpbWUpIHtcbiAgICBjcC5ydW50aW1lID0ge1xuICAgICAgLi4uZGF0YS5ydW50aW1lLFxuICAgIH1cblxuICAgIGRlbGV0ZSBjcC5ydW50aW1lLmxpYnJhcmllc1xuICB9XG5cbiAgcmV0dXJuIGNwXG59XG5cbmNvbnN0IGN1cnJlbnRWZXJzaW9uUmVnZXggPSAvXiguK0N1cnJlbnRWZXJzaW9uWzAtOUEtRl17OH0pWzAtOWEtZl17MzJ9JC9cblxuLyoqXG4gKiBNYXRjaCBhIHJlc291cmNlIGNyZWF0ZWQgYnkgYGxhbWJkYS5GdW5jdGlvbi5jdXJyZW50VmVyc2lvbmAsIHdoaWNoXG4gKiB3aWxsIGluY2x1ZGUgdGhlIGFzc2V0IGhhc2ggYXMgcGFydCBvZiB0aGUgcmVvdXNyY2UgbmFtZSBhbmQgcmV0dXJuXG4gKiBhIHNuYXBzaG90LWZyaWVuZGx5IHZlcnNpb24gb2YgaXQgaWYgZm91bmQuXG4gKi9cbmZ1bmN0aW9uIHJld3JpdGVDdXJyZW50VmVyc2lvbklmRm91bmQodmFsdWU6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBtYXRjaCA9IGN1cnJlbnRWZXJzaW9uUmVnZXguZXhlYyh2YWx1ZSlcbiAgcmV0dXJuIG1hdGNoID8gYCR7bWF0Y2hbMV19eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhgIDogbnVsbFxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZnVuY3Rpb24gcmVtb3ZlQXNzZXREZXRhaWxzRnJvbVRlbXBsYXRlKGRhdGE6IGFueSk6IGFueSB7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICByZXR1cm4gZGF0YS5tYXAocmVtb3ZlQXNzZXREZXRhaWxzRnJvbVRlbXBsYXRlKVxuICB9XG5cbiAgaWYgKGRhdGEgPT09IE9iamVjdChkYXRhKSkge1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICBjb25zdCBuZXdDdXJyZW50VmVyc2lvbiA9IHJld3JpdGVDdXJyZW50VmVyc2lvbklmRm91bmQoa2V5KVxuICAgICAgICAgIGlmIChuZXdDdXJyZW50VmVyc2lvbikge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXdDdXJyZW50VmVyc2lvbiwgcmVtb3ZlQXNzZXREZXRhaWxzRnJvbVRlbXBsYXRlKHZhbHVlKV1cbiAgICAgICAgICB9IGVsc2UgaWYgKGtleS5pbmNsdWRlcyhcIkFzc2V0UGFyYW1ldGVyXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBrZXkgPT09IFwiUmVmXCIgJiZcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgdmFsdWUuaW5jbHVkZXMoXCJBc3NldFBhcmFtZXRlcnNcIilcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBba2V5LCBcInNuYXBzaG90LXZhbHVlXCJdXG4gICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIGtleSA9PT0gXCJhd3M6YXNzZXQ6cGF0aFwiICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgIC9hc3NldFxcLlswLTlhLWZdezY0fS8udGVzdCh2YWx1ZSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBba2V5LCBcImFzc2V0LnNuYXBzaG90LXZhbHVlXCJdXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBba2V5LCByZW1vdmVBc3NldERldGFpbHNGcm9tVGVtcGxhdGUodmFsdWUpXVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmZpbHRlcigoaXQpOiBpdCBpcyBbXSA9PiBpdCAhPSBudWxsKSxcbiAgICApXG4gIH1cblxuICBpZiAodHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCBuZXdDdXJyZW50VmVyc2lvbiA9IHJld3JpdGVDdXJyZW50VmVyc2lvbklmRm91bmQoZGF0YSlcbiAgICBpZiAobmV3Q3VycmVudFZlcnNpb24pIHtcbiAgICAgIHJldHVybiBuZXdDdXJyZW50VmVyc2lvblxuICAgIH1cblxuICAgIC8vIEhhbmRsZSB0eXBpY2FsIGNvbnRlbnQgaGFzaGVzLlxuICAgIHJldHVybiBkYXRhLnJlcGxhY2UoL1swLTlhLWZdezY0fS9nLCBcInNuYXBzaG90LXZhbHVlXCIpXG4gIH1cblxuICByZXR1cm4gZGF0YVxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZnVuY3Rpb24gcmVtb3ZlQXNzZXREZXRhaWxzRnJvbU1hbmlmZXN0KGRhdGE6IGFueSk6IGFueSB7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICByZXR1cm4gZGF0YS5tYXAocmVtb3ZlQXNzZXREZXRhaWxzRnJvbU1hbmlmZXN0KVxuICB9XG5cbiAgaWYgKGRhdGEgPT09IE9iamVjdChkYXRhKSkge1xuICAgIC8vIGF3czpjZGs6YXNzZXQgaW4gbWV0YWRhdGFcbiAgICBpZiAoZGF0YVtcInR5cGVcIl0gPT09IFwiYXdzOmNkazphc3NldFwiICYmIFwiZGF0YVwiIGluIGRhdGEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmRhdGEsXG4gICAgICAgIGRhdGE6IFwic25hcHNob3QtdmFsdWVcIixcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMoZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgaWYgKGtleS5pbmNsdWRlcyhcIkFzc2V0UGFyYW1ldGVyc1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFtrZXksIHJlbW92ZUFzc2V0RGV0YWlsc0Zyb21NYW5pZmVzdCh2YWx1ZSldXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKChpdCk6IGl0IGlzIFtdID0+IGl0ICE9IG51bGwpLFxuICAgIClcbiAgfVxuXG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IG5ld0N1cnJlbnRWZXJzaW9uID0gcmV3cml0ZUN1cnJlbnRWZXJzaW9uSWZGb3VuZChkYXRhKVxuICAgIGlmIChuZXdDdXJyZW50VmVyc2lvbikge1xuICAgICAgcmV0dXJuIG5ld0N1cnJlbnRWZXJzaW9uXG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHR5cGljYWwgY29udGVudCBoYXNoZXMuXG4gICAgcmV0dXJuIGRhdGEucmVwbGFjZSgvWzAtOWEtZl17NjR9L2csIFwic25hcHNob3QtdmFsdWVcIilcbiAgfVxuXG4gIHJldHVybiBkYXRhXG59XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBDREtNZXRhZGF0YSByZXNvdXJjZXMgdGhhdCBpcyBwYXJ0IG9mIHRoZSBzeW50aGVzaXplZFxuICogdGVtcGxhdGUgc2luY2UgQ0RLIDEuNjMuMC5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmZ1bmN0aW9uIHJlbW92ZUNka01ldGFkYXRhUmVzb3VyY2VGcm9tVGVtcGxhdGUoZGF0YTogYW55KTogYW55IHtcbiAgY29uc3QgY3AgPSB7XG4gICAgLi4uZGF0YSxcbiAgICBSZXNvdXJjZXM6IHtcbiAgICAgIC4uLmRhdGEuUmVzb3VyY2VzLFxuICAgIH0sXG4gIH1cblxuICBkZWxldGUgY3AuUmVzb3VyY2VzLkNES01ldGFkYXRhXG4gIHJldHVybiBjcFxufVxuXG5mdW5jdGlvbiBwcmVwYXJlTWFuaWZlc3RGb3JTbmFwc2hvdChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBpbnB1dCA9IEpTT04ucGFyc2UoY29udGVudClcbiAgY29uc3Qgb3V0cHV0ID0gW1xuICAgIHJlbW92ZVZlcnNpb24sXG4gICAgLy8gUmVtb3ZlIHRoZSBydW50aW1lIHZlcnNpb24gaW5mb3JtYXRpb24gc28gaXQgZG9uJ3QgY29uZmxpY3Qgd2l0aCBDSVxuICAgIC8vIG9yIG90aGVyIHVzZXJzIGdlbmVyYXRpbmcgdGhlIHNuYXBzaG90cy5cbiAgICByZW1vdmVSdW50aW1lTGlicmFyaWVzLFxuICAgIC8vIFJlbW92ZSB0aGUgdHJhY2UgZnJvbSBtYW5pZmVzdCBmb3Igbm93LlxuICAgIHJlbW92ZVRyYWNlLFxuICAgIC8vIEF2b2lkIGRldGFpbHMgKGhhc2hlcykgZnJvbSBhc3NldHMuXG4gICAgcmVtb3ZlQXNzZXREZXRhaWxzRnJvbU1hbmlmZXN0LFxuICBdLnJlZHVjZSgoYWNjLCBmbikgPT4gZm4oYWNjKSwgaW5wdXQpXG5cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG91dHB1dCwgdW5kZWZpbmVkLCBcIiAgXCIpXG59XG5cbi8qKlxuICogVHJhbnNmb3JtIHRoZSBDbG91ZCBBc3NlbWJseSBtYW5pZmVzdCBmaWxlIHNvIHRoYXQgaXQgY2FuIGJlIHBlcnNpc3RlZFxuICogYXMgYSBzbmFwc2hvdCB3aXRob3V0IGNhdXNpbmcgaW52YWxpZGF0aW9ucyBmb3IgZXZlcnkgc3ludGhlc2l6ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJlcGFyZU1hbmlmZXN0RmlsZUZvclNuYXBzaG90KGZpbGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZXN1bHQgPSBwcmVwYXJlTWFuaWZlc3RGb3JTbmFwc2hvdChcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlLCBcInV0ZjhcIiksXG4gIClcblxuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZSwgcmVzdWx0KVxufVxuXG5mdW5jdGlvbiBwcmVwYXJlVGVtcGxhdGVGb3JTbmFwc2hvdChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBpbnB1dCA9IEpTT04ucGFyc2UoY29udGVudClcbiAgY29uc3Qgb3V0cHV0ID0gW1xuICAgIHJlbW92ZUNka01ldGFkYXRhUmVzb3VyY2VGcm9tVGVtcGxhdGUsXG4gICAgLy8gQXZvaWQgZGV0YWlscyAoaGFzaGVzKSBmcm9tIGFzc2V0cy5cbiAgICByZW1vdmVBc3NldERldGFpbHNGcm9tVGVtcGxhdGUsXG4gIF0ucmVkdWNlKChhY2MsIGZuKSA9PiBmbihhY2MpLCBpbnB1dClcblxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob3V0cHV0LCB1bmRlZmluZWQsIFwiICBcIilcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm0gYSBDbG91ZCBBc3NlbWJseSB0ZW1wbGF0ZSBmaWxlIHNvIHRoYXQgaXQgY2FuIGJlIHBlcnNpc3RlZFxuICogYXMgYSBzbmFwc2hvdCB3aXRob3V0IGNhdXNpbmcgaW52YWxpZGF0aW9ucyBmb3IgbWlub3IgY2hhbmdlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJlcGFyZVRlbXBsYXRlRmlsZUZvclNuYXBzaG90KGZpbGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZXN1bHQgPSBwcmVwYXJlVGVtcGxhdGVGb3JTbmFwc2hvdChcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlLCBcInV0ZjhcIiksXG4gIClcblxuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZSwgcmVzdWx0KVxufVxuXG4vKipcbiAqIENvbnZlcnQgYSBDbG91ZCBBc3NlbWJseSB0byBhIHNuYXBzaG90LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlQ2xvdWRBc3NlbWJseVNuYXBzaG90KFxuICBzcmM6IHN0cmluZyxcbiAgZHN0OiBzdHJpbmcsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYmFzZSA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBkc3QpXG5cbiAgYXdhaXQgY3B5KFwiLlwiLCBiYXNlLCB7XG4gICAgcGFyZW50czogdHJ1ZSxcbiAgICBjd2Q6IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBzcmMpLFxuICB9KVxuXG4gIC8vIERvbid0IGtlZXAgdHJhY2sgb2YgbWFuaWZlc3QgdmVyc2lvbi5cbiAgYXdhaXQgZGVsKHBhdGguam9pbihkc3QsIFwiKiovY2RrLm91dFwiKSlcblxuICAvLyBUaGUgdHJlZSBmaWxlIGRvZXNuJ3QgZ2l2ZSB1cyBtdWNoIHZhbHVlIGFzIHBhcnQgb2YgdGhlIHNuYXBzaG90LlxuICBhd2FpdCBkZWwocGF0aC5qb2luKGRzdCwgXCJ0cmVlLmpzb25cIikpXG5cbiAgLy8gUmVtb3ZlIGFzc2V0IGNvbnRlbnRzIGZvciBub3cuXG4gIGF3YWl0IGRlbChwYXRoLmpvaW4oZHN0LCBcIioqL2Fzc2V0LipcIikpXG5cbiAgLy8gUmVtb3ZlIGFzc2V0IGNvbmZpZ3Mgc28gd2UgZG9uJ3QgaGF2ZSB0byB1cGRhdGVcbiAgLy8gc25hcHNob3RzIGZvciBhc3NldCBjaGFuZ2VzLlxuICBhd2FpdCBkZWwocGF0aC5qb2luKGRzdCwgXCIqKi8qLmFzc2V0cy5qc29uXCIpKVxuXG4gIC8vIFJlbW92ZSBncmFwaHZpeiBmaWxlcyBnZW5lcmF0ZWQgd2hlbiB1c2luZyBDREsgUGlwZWxpbmVzXG4gIGF3YWl0IGRlbChwYXRoLmpvaW4oZHN0LCBcIioqLyouZG90XCIpKVxuXG4gIC8vIFRyYW5zZm9ybSB0aGUgbWFuaWZlc3QgdG8gYmUgbW9yZSBzbmFwc2hvdCBmcmllbmRseS5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGdsb2Iuc3luYyhcIioqL21hbmlmZXN0Lmpzb25cIiwgeyBjd2Q6IGJhc2UgfSkpIHtcbiAgICBhd2FpdCBwcmVwYXJlTWFuaWZlc3RGaWxlRm9yU25hcHNob3QocGF0aC5qb2luKGJhc2UsIGZpbGUpKVxuICB9XG5cbiAgLy8gVHJhbnNmb3JtIGFsbCB0ZW1wbGF0ZXMuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBnbG9iLnN5bmMoXCIqKi8qLnRlbXBsYXRlLmpzb25cIiwgeyBjd2Q6IGJhc2UgfSkpIHtcbiAgICBhd2FpdCBwcmVwYXJlVGVtcGxhdGVGaWxlRm9yU25hcHNob3QocGF0aC5qb2luKGJhc2UsIGZpbGUpKVxuICB9XG59XG4iXX0=
@@ -0,0 +1,45 @@
1
+ import * as constructs from "constructs";
2
+ type ReferenceToResource<T> = (scope: constructs.Construct, id: string, reference: string) => T;
3
+ interface Props<T> {
4
+ /**
5
+ * The nonce can be used to force the stack to update to check
6
+ * for a new value.
7
+ *
8
+ * @default Date.now().toString()
9
+ */
10
+ nonce?: string;
11
+ parameterName: string;
12
+ resource: T;
13
+ resourceToReference(resource: T): string;
14
+ referenceToResource: ReferenceToResource<T>;
15
+ /**
16
+ * List of regions that can retrieve this resource from an SSM Parameter.
17
+ */
18
+ regions: string[];
19
+ }
20
+ /**
21
+ * Register SSM Parameters in other regions storing a reference to
22
+ * a resource, which can then be resolved in the other region by
23
+ * reading from the parameter.
24
+ *
25
+ * Storing the SSM Parameters in the other regions speeds up the
26
+ * resolving of parameters, since we can use CloudFormation SSM
27
+ * Parameters instead of custom resources.
28
+ *
29
+ * If the resource is in the same region, the resource will be returned
30
+ * like normally in CDK, causing an export/import if cross-stack.
31
+ */
32
+ export declare class SsmParameterBackedResource<T> extends constructs.Construct {
33
+ private readonly nonce;
34
+ private readonly parameterName;
35
+ private readonly resource;
36
+ private readonly referenceToResource;
37
+ private readonly regions;
38
+ constructor(scope: constructs.Construct, id: string, props: Props<T>);
39
+ /**
40
+ * Get the resource by resolving the value from SSM Parameter Store
41
+ * in case we are cross-region or cross-stage.
42
+ */
43
+ get(scope: constructs.Construct, id: string): T;
44
+ }
45
+ export {};
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SsmParameterBackedResource = void 0;
4
+ const constructs = require("constructs");
5
+ const ssm = require("aws-cdk-lib/aws-ssm");
6
+ const cdk = require("aws-cdk-lib");
7
+ const cross_region_ssm_parameter_1 = require("./cross-region-ssm-parameter");
8
+ const utils_1 = require("./utils");
9
+ /**
10
+ * Register SSM Parameters in other regions storing a reference to
11
+ * a resource, which can then be resolved in the other region by
12
+ * reading from the parameter.
13
+ *
14
+ * Storing the SSM Parameters in the other regions speeds up the
15
+ * resolving of parameters, since we can use CloudFormation SSM
16
+ * Parameters instead of custom resources.
17
+ *
18
+ * If the resource is in the same region, the resource will be returned
19
+ * like normally in CDK, causing an export/import if cross-stack.
20
+ */
21
+ class SsmParameterBackedResource extends constructs.Construct {
22
+ constructor(scope, id, props) {
23
+ var _a;
24
+ super(scope, id);
25
+ this.nonce = (_a = props.nonce) !== null && _a !== void 0 ? _a : Date.now().toString();
26
+ this.parameterName = props.parameterName;
27
+ this.resource = props.resource;
28
+ this.referenceToResource = props.referenceToResource;
29
+ this.regions = props.regions;
30
+ const value = props.resourceToReference(props.resource);
31
+ for (const region of props.regions) {
32
+ new cross_region_ssm_parameter_1.CrossRegionSsmParameter(this, `Param${region}`, {
33
+ name: this.parameterName,
34
+ region,
35
+ value,
36
+ });
37
+ }
38
+ }
39
+ /**
40
+ * Get the resource by resolving the value from SSM Parameter Store
41
+ * in case we are cross-region or cross-stage.
42
+ */
43
+ get(scope, id) {
44
+ const producerRegion = cdk.Stack.of(this).region;
45
+ const consumerRegion = cdk.Stack.of(scope).region;
46
+ const sameStageOrApp = (0, utils_1.getStageOrApp)(this) === (0, utils_1.getStageOrApp)(scope);
47
+ // Fast-path: Same region and parent stage/app.
48
+ if (producerRegion === consumerRegion && sameStageOrApp) {
49
+ return this.resource;
50
+ }
51
+ if (!this.regions.includes(consumerRegion)) {
52
+ throw new Error(`The region ${consumerRegion} is not registered for the parameter`);
53
+ }
54
+ // Only add dependency if within same app/stage. If not it
55
+ // is the caller responsibility to ensure deployment order.
56
+ if (sameStageOrApp) {
57
+ scope.node.addDependency(this);
58
+ }
59
+ new cdk.CfnParameter(scope, `${id}Nonce`, {
60
+ default: this.nonce,
61
+ });
62
+ const reference = ssm.StringParameter.valueForStringParameter(scope, this.parameterName);
63
+ return this.referenceToResource(scope, id, reference);
64
+ }
65
+ }
66
+ exports.SsmParameterBackedResource = SsmParameterBackedResource;
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3NtLXBhcmFtZXRlci1iYWNrZWQtcmVzb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3NtLXBhcmFtZXRlci1iYWNrZWQtcmVzb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQXdDO0FBQ3hDLDJDQUEwQztBQUMxQyxtQ0FBa0M7QUFDbEMsNkVBQXNFO0FBQ3RFLG1DQUF1QztBQTBCdkM7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFhLDBCQUE4QixTQUFRLFVBQVUsQ0FBQyxTQUFTO0lBT3JFLFlBQVksS0FBMkIsRUFBRSxFQUFVLEVBQUUsS0FBZTs7UUFDbEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUNoQixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQUEsS0FBSyxDQUFDLEtBQUssbUNBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFBO1FBQ2pELElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQTtRQUN4QyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUE7UUFDOUIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQTtRQUNwRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUE7UUFFNUIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUV2RCxLQUFLLE1BQU0sTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNuQyxJQUFJLG9EQUF1QixDQUFDLElBQUksRUFBRSxRQUFRLE1BQU0sRUFBRSxFQUFFO2dCQUNsRCxJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWE7Z0JBQ3hCLE1BQU07Z0JBQ04sS0FBSzthQUNOLENBQUMsQ0FBQTtRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksR0FBRyxDQUFDLEtBQTJCLEVBQUUsRUFBVTtRQUNoRCxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUE7UUFDaEQsTUFBTSxjQUFjLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFBO1FBRWpELE1BQU0sY0FBYyxHQUFHLElBQUEscUJBQWEsRUFBQyxJQUFJLENBQUMsS0FBSyxJQUFBLHFCQUFhLEVBQUMsS0FBSyxDQUFDLENBQUE7UUFFbkUsK0NBQStDO1FBQy9DLElBQUksY0FBYyxLQUFLLGNBQWMsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUN4RCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUE7UUFDdEIsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQzNDLE1BQU0sSUFBSSxLQUFLLENBQ2IsY0FBYyxjQUFjLHNDQUFzQyxDQUNuRSxDQUFBO1FBQ0gsQ0FBQztRQUVELDBEQUEwRDtRQUMxRCwyREFBMkQ7UUFDM0QsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNuQixLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNoQyxDQUFDO1FBRUQsSUFBSSxHQUFHLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFO1lBQ3hDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSztTQUNwQixDQUFDLENBQUE7UUFFRixNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDLHVCQUF1QixDQUMzRCxLQUFLLEVBQ0wsSUFBSSxDQUFDLGFBQWEsQ0FDbkIsQ0FBQTtRQUNELE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUE7SUFDdkQsQ0FBQztDQUNGO0FBL0RELGdFQStEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNvbnN0cnVjdHMgZnJvbSBcImNvbnN0cnVjdHNcIlxuaW1wb3J0ICogYXMgc3NtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc3NtXCJcbmltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIlxuaW1wb3J0IHsgQ3Jvc3NSZWdpb25Tc21QYXJhbWV0ZXIgfSBmcm9tIFwiLi9jcm9zcy1yZWdpb24tc3NtLXBhcmFtZXRlclwiXG5pbXBvcnQgeyBnZXRTdGFnZU9yQXBwIH0gZnJvbSBcIi4vdXRpbHNcIlxuXG50eXBlIFJlZmVyZW5jZVRvUmVzb3VyY2U8VD4gPSAoXG4gIHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCxcbiAgaWQ6IHN0cmluZyxcbiAgcmVmZXJlbmNlOiBzdHJpbmcsXG4pID0+IFRcblxuaW50ZXJmYWNlIFByb3BzPFQ+IHtcbiAgLyoqXG4gICAqIFRoZSBub25jZSBjYW4gYmUgdXNlZCB0byBmb3JjZSB0aGUgc3RhY2sgdG8gdXBkYXRlIHRvIGNoZWNrXG4gICAqIGZvciBhIG5ldyB2YWx1ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgRGF0ZS5ub3coKS50b1N0cmluZygpXG4gICAqL1xuICBub25jZT86IHN0cmluZ1xuICBwYXJhbWV0ZXJOYW1lOiBzdHJpbmdcbiAgcmVzb3VyY2U6IFRcbiAgcmVzb3VyY2VUb1JlZmVyZW5jZShyZXNvdXJjZTogVCk6IHN0cmluZ1xuICByZWZlcmVuY2VUb1Jlc291cmNlOiBSZWZlcmVuY2VUb1Jlc291cmNlPFQ+XG4gIC8qKlxuICAgKiBMaXN0IG9mIHJlZ2lvbnMgdGhhdCBjYW4gcmV0cmlldmUgdGhpcyByZXNvdXJjZSBmcm9tIGFuIFNTTSBQYXJhbWV0ZXIuXG4gICAqL1xuICByZWdpb25zOiBzdHJpbmdbXVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIFNTTSBQYXJhbWV0ZXJzIGluIG90aGVyIHJlZ2lvbnMgc3RvcmluZyBhIHJlZmVyZW5jZSB0b1xuICogYSByZXNvdXJjZSwgd2hpY2ggY2FuIHRoZW4gYmUgcmVzb2x2ZWQgaW4gdGhlIG90aGVyIHJlZ2lvbiBieVxuICogcmVhZGluZyBmcm9tIHRoZSBwYXJhbWV0ZXIuXG4gKlxuICogU3RvcmluZyB0aGUgU1NNIFBhcmFtZXRlcnMgaW4gdGhlIG90aGVyIHJlZ2lvbnMgc3BlZWRzIHVwIHRoZVxuICogcmVzb2x2aW5nIG9mIHBhcmFtZXRlcnMsIHNpbmNlIHdlIGNhbiB1c2UgQ2xvdWRGb3JtYXRpb24gU1NNXG4gKiBQYXJhbWV0ZXJzIGluc3RlYWQgb2YgY3VzdG9tIHJlc291cmNlcy5cbiAqXG4gKiBJZiB0aGUgcmVzb3VyY2UgaXMgaW4gdGhlIHNhbWUgcmVnaW9uLCB0aGUgcmVzb3VyY2Ugd2lsbCBiZSByZXR1cm5lZFxuICogbGlrZSBub3JtYWxseSBpbiBDREssIGNhdXNpbmcgYW4gZXhwb3J0L2ltcG9ydCBpZiBjcm9zcy1zdGFjay5cbiAqL1xuZXhwb3J0IGNsYXNzIFNzbVBhcmFtZXRlckJhY2tlZFJlc291cmNlPFQ+IGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IG5vbmNlOiBzdHJpbmdcbiAgcHJpdmF0ZSByZWFkb25seSBwYXJhbWV0ZXJOYW1lOiBzdHJpbmdcbiAgcHJpdmF0ZSByZWFkb25seSByZXNvdXJjZTogVFxuICBwcml2YXRlIHJlYWRvbmx5IHJlZmVyZW5jZVRvUmVzb3VyY2U6IFJlZmVyZW5jZVRvUmVzb3VyY2U8VD5cbiAgcHJpdmF0ZSByZWFkb25seSByZWdpb25zOiBzdHJpbmdbXVxuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFByb3BzPFQ+KSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuICAgIHRoaXMubm9uY2UgPSBwcm9wcy5ub25jZSA/PyBEYXRlLm5vdygpLnRvU3RyaW5nKClcbiAgICB0aGlzLnBhcmFtZXRlck5hbWUgPSBwcm9wcy5wYXJhbWV0ZXJOYW1lXG4gICAgdGhpcy5yZXNvdXJjZSA9IHByb3BzLnJlc291cmNlXG4gICAgdGhpcy5yZWZlcmVuY2VUb1Jlc291cmNlID0gcHJvcHMucmVmZXJlbmNlVG9SZXNvdXJjZVxuICAgIHRoaXMucmVnaW9ucyA9IHByb3BzLnJlZ2lvbnNcblxuICAgIGNvbnN0IHZhbHVlID0gcHJvcHMucmVzb3VyY2VUb1JlZmVyZW5jZShwcm9wcy5yZXNvdXJjZSlcblxuICAgIGZvciAoY29uc3QgcmVnaW9uIG9mIHByb3BzLnJlZ2lvbnMpIHtcbiAgICAgIG5ldyBDcm9zc1JlZ2lvblNzbVBhcmFtZXRlcih0aGlzLCBgUGFyYW0ke3JlZ2lvbn1gLCB7XG4gICAgICAgIG5hbWU6IHRoaXMucGFyYW1ldGVyTmFtZSxcbiAgICAgICAgcmVnaW9uLFxuICAgICAgICB2YWx1ZSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcmVzb3VyY2UgYnkgcmVzb2x2aW5nIHRoZSB2YWx1ZSBmcm9tIFNTTSBQYXJhbWV0ZXIgU3RvcmVcbiAgICogaW4gY2FzZSB3ZSBhcmUgY3Jvc3MtcmVnaW9uIG9yIGNyb3NzLXN0YWdlLlxuICAgKi9cbiAgcHVibGljIGdldChzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsIGlkOiBzdHJpbmcpOiBUIHtcbiAgICBjb25zdCBwcm9kdWNlclJlZ2lvbiA9IGNkay5TdGFjay5vZih0aGlzKS5yZWdpb25cbiAgICBjb25zdCBjb25zdW1lclJlZ2lvbiA9IGNkay5TdGFjay5vZihzY29wZSkucmVnaW9uXG5cbiAgICBjb25zdCBzYW1lU3RhZ2VPckFwcCA9IGdldFN0YWdlT3JBcHAodGhpcykgPT09IGdldFN0YWdlT3JBcHAoc2NvcGUpXG5cbiAgICAvLyBGYXN0LXBhdGg6IFNhbWUgcmVnaW9uIGFuZCBwYXJlbnQgc3RhZ2UvYXBwLlxuICAgIGlmIChwcm9kdWNlclJlZ2lvbiA9PT0gY29uc3VtZXJSZWdpb24gJiYgc2FtZVN0YWdlT3JBcHApIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc291cmNlXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnJlZ2lvbnMuaW5jbHVkZXMoY29uc3VtZXJSZWdpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgcmVnaW9uICR7Y29uc3VtZXJSZWdpb259IGlzIG5vdCByZWdpc3RlcmVkIGZvciB0aGUgcGFyYW1ldGVyYCxcbiAgICAgIClcbiAgICB9XG5cbiAgICAvLyBPbmx5IGFkZCBkZXBlbmRlbmN5IGlmIHdpdGhpbiBzYW1lIGFwcC9zdGFnZS4gSWYgbm90IGl0XG4gICAgLy8gaXMgdGhlIGNhbGxlciByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgZGVwbG95bWVudCBvcmRlci5cbiAgICBpZiAoc2FtZVN0YWdlT3JBcHApIHtcbiAgICAgIHNjb3BlLm5vZGUuYWRkRGVwZW5kZW5jeSh0aGlzKVxuICAgIH1cblxuICAgIG5ldyBjZGsuQ2ZuUGFyYW1ldGVyKHNjb3BlLCBgJHtpZH1Ob25jZWAsIHtcbiAgICAgIGRlZmF1bHQ6IHRoaXMubm9uY2UsXG4gICAgfSlcblxuICAgIGNvbnN0IHJlZmVyZW5jZSA9IHNzbS5TdHJpbmdQYXJhbWV0ZXIudmFsdWVGb3JTdHJpbmdQYXJhbWV0ZXIoXG4gICAgICBzY29wZSxcbiAgICAgIHRoaXMucGFyYW1ldGVyTmFtZSxcbiAgICApXG4gICAgcmV0dXJuIHRoaXMucmVmZXJlbmNlVG9SZXNvdXJjZShzY29wZSwgaWQsIHJlZmVyZW5jZSlcbiAgfVxufVxuIl19
@@ -0,0 +1,21 @@
1
+ import * as constructs from "constructs";
2
+ import * as cr from "aws-cdk-lib/custom-resources";
3
+ interface Props {
4
+ parameterName: string;
5
+ region: string;
6
+ /**
7
+ * Value that must be updated to check if the parameter has a new value.
8
+ *
9
+ * @default Date.now().toString()
10
+ */
11
+ nonce?: string;
12
+ }
13
+ /**
14
+ * Get value of a SSM parameter dynamically during deployment
15
+ * with support to read cross-region.
16
+ */
17
+ export declare class SsmParameterReader extends cr.AwsCustomResource {
18
+ constructor(scope: constructs.Construct, id: string, props: Props);
19
+ getParameterValue(): string;
20
+ }
21
+ export {};
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SsmParameterReader = void 0;
4
+ const cdk = require("aws-cdk-lib");
5
+ const cr = require("aws-cdk-lib/custom-resources");
6
+ function removeLeadingSlash(value) {
7
+ return value.slice(0, 1) == "/" ? value.slice(1) : value;
8
+ }
9
+ /**
10
+ * Get value of a SSM parameter dynamically during deployment
11
+ * with support to read cross-region.
12
+ */
13
+ class SsmParameterReader extends cr.AwsCustomResource {
14
+ constructor(scope, id, props) {
15
+ var _a;
16
+ super(scope, id, {
17
+ onUpdate: {
18
+ service: "SSM",
19
+ action: "getParameter",
20
+ parameters: {
21
+ Name: props.parameterName,
22
+ },
23
+ region: props.region,
24
+ // Update physical id to fetch the latest version.
25
+ physicalResourceId: cr.PhysicalResourceId.of(props.parameterName),
26
+ },
27
+ policy: cr.AwsCustomResourcePolicy.fromSdkCalls({
28
+ resources: [
29
+ cdk.Arn.format({
30
+ service: "ssm",
31
+ region: props.region,
32
+ resource: "parameter",
33
+ resourceName: removeLeadingSlash(props.parameterName),
34
+ }, cdk.Stack.of(scope)),
35
+ ],
36
+ }),
37
+ });
38
+ const r = this.node.findChild("Resource").node
39
+ .defaultChild;
40
+ r.cfnOptions.metadata = r.cfnOptions.metadata || {};
41
+ r.cfnOptions.metadata.Nonce = (_a = props.nonce) !== null && _a !== void 0 ? _a : Date.now().toString();
42
+ }
43
+ getParameterValue() {
44
+ return this.getResponseField("Parameter.Value");
45
+ }
46
+ }
47
+ exports.SsmParameterReader = SsmParameterReader;
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3NtLXBhcmFtZXRlci1yZWFkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3NtLXBhcmFtZXRlci1yZWFkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsbUNBQWtDO0FBQ2xDLG1EQUFrRDtBQWFsRCxTQUFTLGtCQUFrQixDQUFDLEtBQWE7SUFDdkMsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQTtBQUMxRCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBYSxrQkFBbUIsU0FBUSxFQUFFLENBQUMsaUJBQWlCO0lBQzFELFlBQVksS0FBMkIsRUFBRSxFQUFVLEVBQUUsS0FBWTs7UUFDL0QsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixRQUFRLEVBQUU7Z0JBQ1IsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsTUFBTSxFQUFFLGNBQWM7Z0JBQ3RCLFVBQVUsRUFBRTtvQkFDVixJQUFJLEVBQUUsS0FBSyxDQUFDLGFBQWE7aUJBQzFCO2dCQUNELE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtnQkFDcEIsa0RBQWtEO2dCQUNsRCxrQkFBa0IsRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUM7YUFDbEU7WUFDRCxNQUFNLEVBQUUsRUFBRSxDQUFDLHVCQUF1QixDQUFDLFlBQVksQ0FBQztnQkFDOUMsU0FBUyxFQUFFO29CQUNULEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUNaO3dCQUNFLE9BQU8sRUFBRSxLQUFLO3dCQUNkLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTt3QkFDcEIsUUFBUSxFQUFFLFdBQVc7d0JBQ3JCLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDO3FCQUN0RCxFQUNELEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUNwQjtpQkFDRjthQUNGLENBQUM7U0FDSCxDQUFDLENBQUE7UUFFRixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJO2FBQzNDLFlBQStCLENBQUE7UUFDbEMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFBO1FBQ25ELENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxNQUFBLEtBQUssQ0FBQyxLQUFLLG1DQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtJQUNwRSxDQUFDO0lBRU0saUJBQWlCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLENBQUE7SUFDakQsQ0FBQztDQUNGO0FBckNELGdEQXFDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNvbnN0cnVjdHMgZnJvbSBcImNvbnN0cnVjdHNcIlxuaW1wb3J0ICogYXMgY2RrIGZyb20gXCJhd3MtY2RrLWxpYlwiXG5pbXBvcnQgKiBhcyBjciBmcm9tIFwiYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlc1wiXG5cbmludGVyZmFjZSBQcm9wcyB7XG4gIHBhcmFtZXRlck5hbWU6IHN0cmluZ1xuICByZWdpb246IHN0cmluZ1xuICAvKipcbiAgICogVmFsdWUgdGhhdCBtdXN0IGJlIHVwZGF0ZWQgdG8gY2hlY2sgaWYgdGhlIHBhcmFtZXRlciBoYXMgYSBuZXcgdmFsdWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IERhdGUubm93KCkudG9TdHJpbmcoKVxuICAgKi9cbiAgbm9uY2U/OiBzdHJpbmdcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTGVhZGluZ1NsYXNoKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUuc2xpY2UoMCwgMSkgPT0gXCIvXCIgPyB2YWx1ZS5zbGljZSgxKSA6IHZhbHVlXG59XG5cbi8qKlxuICogR2V0IHZhbHVlIG9mIGEgU1NNIHBhcmFtZXRlciBkeW5hbWljYWxseSBkdXJpbmcgZGVwbG95bWVudFxuICogd2l0aCBzdXBwb3J0IHRvIHJlYWQgY3Jvc3MtcmVnaW9uLlxuICovXG5leHBvcnQgY2xhc3MgU3NtUGFyYW1ldGVyUmVhZGVyIGV4dGVuZHMgY3IuQXdzQ3VzdG9tUmVzb3VyY2Uge1xuICBjb25zdHJ1Y3RvcihzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgb25VcGRhdGU6IHtcbiAgICAgICAgc2VydmljZTogXCJTU01cIixcbiAgICAgICAgYWN0aW9uOiBcImdldFBhcmFtZXRlclwiLFxuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgTmFtZTogcHJvcHMucGFyYW1ldGVyTmFtZSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVnaW9uOiBwcm9wcy5yZWdpb24sXG4gICAgICAgIC8vIFVwZGF0ZSBwaHlzaWNhbCBpZCB0byBmZXRjaCB0aGUgbGF0ZXN0IHZlcnNpb24uXG4gICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogY3IuUGh5c2ljYWxSZXNvdXJjZUlkLm9mKHByb3BzLnBhcmFtZXRlck5hbWUpLFxuICAgICAgfSxcbiAgICAgIHBvbGljeTogY3IuQXdzQ3VzdG9tUmVzb3VyY2VQb2xpY3kuZnJvbVNka0NhbGxzKHtcbiAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgY2RrLkFybi5mb3JtYXQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHNlcnZpY2U6IFwic3NtXCIsXG4gICAgICAgICAgICAgIHJlZ2lvbjogcHJvcHMucmVnaW9uLFxuICAgICAgICAgICAgICByZXNvdXJjZTogXCJwYXJhbWV0ZXJcIixcbiAgICAgICAgICAgICAgcmVzb3VyY2VOYW1lOiByZW1vdmVMZWFkaW5nU2xhc2gocHJvcHMucGFyYW1ldGVyTmFtZSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2RrLlN0YWNrLm9mKHNjb3BlKSxcbiAgICAgICAgICApLFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgfSlcblxuICAgIGNvbnN0IHIgPSB0aGlzLm5vZGUuZmluZENoaWxkKFwiUmVzb3VyY2VcIikubm9kZVxuICAgICAgLmRlZmF1bHRDaGlsZCBhcyBjZGsuQ2ZuUmVzb3VyY2VcbiAgICByLmNmbk9wdGlvbnMubWV0YWRhdGEgPSByLmNmbk9wdGlvbnMubWV0YWRhdGEgfHwge31cbiAgICByLmNmbk9wdGlvbnMubWV0YWRhdGEuTm9uY2UgPSBwcm9wcy5ub25jZSA/PyBEYXRlLm5vdygpLnRvU3RyaW5nKClcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJhbWV0ZXJWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFJlc3BvbnNlRmllbGQoXCJQYXJhbWV0ZXIuVmFsdWVcIilcbiAgfVxufVxuIl19
package/lib/tags.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ import * as constructs from "constructs";
2
+ import * as cdk from "aws-cdk-lib";
3
+ /**
4
+ * Tag all supported resources within an application.
5
+ *
6
+ * CDK will propagate tags too all resources that support it.
7
+ */
8
+ export declare function tagResources(scope: constructs.Construct, tags: (stack: cdk.Stack) => Record<string, string>): void;
package/lib/tags.js ADDED
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.tagResources = void 0;
4
+ const cdk = require("aws-cdk-lib");
5
+ const cm = require("aws-cdk-lib/aws-certificatemanager");
6
+ function shouldTag(construct) {
7
+ // See https://github.com/aws/aws-cdk/issues/14519#issuecomment-833103147
8
+ if (construct instanceof cm.DnsValidatedCertificate) {
9
+ return false;
10
+ }
11
+ return true;
12
+ }
13
+ /**
14
+ * Tag all supported resources within an application.
15
+ *
16
+ * CDK will propagate tags too all resources that support it.
17
+ */
18
+ function tagResources(scope, tags) {
19
+ cdk.Aspects.of(scope).add({
20
+ visit(construct) {
21
+ if (cdk.TagManager.isTaggable(construct) && shouldTag(construct)) {
22
+ // We pick the last stack in chain to support stages where
23
+ // there are multiple stacks.
24
+ const allStacks = construct.node.scopes.filter((it) => cdk.Stack.isStack(it));
25
+ const stack = allStacks.length > 0 ? allStacks[allStacks.length - 1] : undefined;
26
+ if (stack != null) {
27
+ for (const [key, value] of Object.entries(tags(stack))) {
28
+ construct.tags.setTag(key, value, 100, true);
29
+ }
30
+ }
31
+ }
32
+ },
33
+ });
34
+ }
35
+ exports.tagResources = tagResources;
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90YWdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLG1DQUFrQztBQUNsQyx5REFBd0Q7QUFFeEQsU0FBUyxTQUFTLENBQUMsU0FBZ0M7SUFDakQseUVBQXlFO0lBQ3pFLElBQUksU0FBUyxZQUFZLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ3BELE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixZQUFZLENBQzFCLEtBQTJCLEVBQzNCLElBQWtEO0lBRWxELEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUN4QixLQUFLLENBQUMsU0FBZ0M7WUFDcEMsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDakUsMERBQTBEO2dCQUMxRCw2QkFBNkI7Z0JBQzdCLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBbUIsRUFBRSxDQUNyRSxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FDdEIsQ0FBQTtnQkFFRCxNQUFNLEtBQUssR0FDVCxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtnQkFDcEUsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ2xCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7d0JBQ3ZELFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFBO29CQUM5QyxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztLQUNGLENBQUMsQ0FBQTtBQUNKLENBQUM7QUF2QkQsb0NBdUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY29uc3RydWN0cyBmcm9tIFwiY29uc3RydWN0c1wiXG5pbXBvcnQgKiBhcyBjZGsgZnJvbSBcImF3cy1jZGstbGliXCJcbmltcG9ydCAqIGFzIGNtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyXCJcblxuZnVuY3Rpb24gc2hvdWxkVGFnKGNvbnN0cnVjdDogY29uc3RydWN0cy5JQ29uc3RydWN0KSB7XG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvaXNzdWVzLzE0NTE5I2lzc3VlY29tbWVudC04MzMxMDMxNDdcbiAgaWYgKGNvbnN0cnVjdCBpbnN0YW5jZW9mIGNtLkRuc1ZhbGlkYXRlZENlcnRpZmljYXRlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIFRhZyBhbGwgc3VwcG9ydGVkIHJlc291cmNlcyB3aXRoaW4gYW4gYXBwbGljYXRpb24uXG4gKlxuICogQ0RLIHdpbGwgcHJvcGFnYXRlIHRhZ3MgdG9vIGFsbCByZXNvdXJjZXMgdGhhdCBzdXBwb3J0IGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGFnUmVzb3VyY2VzKFxuICBzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsXG4gIHRhZ3M6IChzdGFjazogY2RrLlN0YWNrKSA9PiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuKTogdm9pZCB7XG4gIGNkay5Bc3BlY3RzLm9mKHNjb3BlKS5hZGQoe1xuICAgIHZpc2l0KGNvbnN0cnVjdDogY29uc3RydWN0cy5JQ29uc3RydWN0KSB7XG4gICAgICBpZiAoY2RrLlRhZ01hbmFnZXIuaXNUYWdnYWJsZShjb25zdHJ1Y3QpICYmIHNob3VsZFRhZyhjb25zdHJ1Y3QpKSB7XG4gICAgICAgIC8vIFdlIHBpY2sgdGhlIGxhc3Qgc3RhY2sgaW4gY2hhaW4gdG8gc3VwcG9ydCBzdGFnZXMgd2hlcmVcbiAgICAgICAgLy8gdGhlcmUgYXJlIG11bHRpcGxlIHN0YWNrcy5cbiAgICAgICAgY29uc3QgYWxsU3RhY2tzID0gY29uc3RydWN0Lm5vZGUuc2NvcGVzLmZpbHRlcigoaXQpOiBpdCBpcyBjZGsuU3RhY2sgPT5cbiAgICAgICAgICBjZGsuU3RhY2suaXNTdGFjayhpdCksXG4gICAgICAgIClcblxuICAgICAgICBjb25zdCBzdGFjayA9XG4gICAgICAgICAgYWxsU3RhY2tzLmxlbmd0aCA+IDAgPyBhbGxTdGFja3NbYWxsU3RhY2tzLmxlbmd0aCAtIDFdIDogdW5kZWZpbmVkXG4gICAgICAgIGlmIChzdGFjayAhPSBudWxsKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGFncyhzdGFjaykpKSB7XG4gICAgICAgICAgICBjb25zdHJ1Y3QudGFncy5zZXRUYWcoa2V5LCB2YWx1ZSwgMTAwLCB0cnVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gIH0pXG59XG4iXX0=
package/lib/utils.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ import * as constructs from "constructs";
2
+ export declare function getStageOrApp(scope: constructs.Construct): constructs.Construct;
package/lib/utils.js ADDED
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getStageOrApp = void 0;
4
+ const cdk = require("aws-cdk-lib");
5
+ function getStageOrApp(scope) {
6
+ const stage = cdk.Stage.of(scope);
7
+ if (stage != null) {
8
+ return stage;
9
+ }
10
+ const app = scope.node.root;
11
+ if (!cdk.App.isApp(app)) {
12
+ throw new Error(`Could not locate cdk App for ${scope.node.id}`);
13
+ }
14
+ return app;
15
+ }
16
+ exports.getStageOrApp = getStageOrApp;
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsbUNBQWtDO0FBRWxDLFNBQWdCLGFBQWEsQ0FDM0IsS0FBMkI7SUFFM0IsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDakMsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7UUFDbEIsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRUQsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUE7SUFDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQ2xFLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQTtBQUNaLENBQUM7QUFiRCxzQ0FhQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNvbnN0cnVjdHMgZnJvbSBcImNvbnN0cnVjdHNcIlxuaW1wb3J0ICogYXMgY2RrIGZyb20gXCJhd3MtY2RrLWxpYlwiXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGFnZU9yQXBwKFxuICBzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsXG4pOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCB7XG4gIGNvbnN0IHN0YWdlID0gY2RrLlN0YWdlLm9mKHNjb3BlKVxuICBpZiAoc3RhZ2UgIT0gbnVsbCkge1xuICAgIHJldHVybiBzdGFnZVxuICB9XG5cbiAgY29uc3QgYXBwID0gc2NvcGUubm9kZS5yb290XG4gIGlmICghY2RrLkFwcC5pc0FwcChhcHApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgbG9jYXRlIGNkayBBcHAgZm9yICR7c2NvcGUubm9kZS5pZH1gKVxuICB9XG4gIHJldHVybiBhcHBcbn1cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ export { Webapp, WebappProps } from "./webapp";
2
+ export { generateContentSecurityPolicyHeader } from "./security-headers";
3
+ export { WebappMonitor } from "./monitor";
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebappMonitor = exports.generateContentSecurityPolicyHeader = exports.Webapp = void 0;
4
+ var webapp_1 = require("./webapp");
5
+ Object.defineProperty(exports, "Webapp", { enumerable: true, get: function () { return webapp_1.Webapp; } });
6
+ var security_headers_1 = require("./security-headers");
7
+ Object.defineProperty(exports, "generateContentSecurityPolicyHeader", { enumerable: true, get: function () { return security_headers_1.generateContentSecurityPolicyHeader; } });
8
+ var monitor_1 = require("./monitor");
9
+ Object.defineProperty(exports, "WebappMonitor", { enumerable: true, get: function () { return monitor_1.WebappMonitor; } });
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2ViYXBwL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUE4QztBQUFyQyxnR0FBQSxNQUFNLE9BQUE7QUFDZix1REFBd0U7QUFBL0QsdUlBQUEsbUNBQW1DLE9BQUE7QUFDNUMscUNBQXlDO0FBQWhDLHdHQUFBLGFBQWEsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IFdlYmFwcCwgV2ViYXBwUHJvcHMgfSBmcm9tIFwiLi93ZWJhcHBcIlxuZXhwb3J0IHsgZ2VuZXJhdGVDb250ZW50U2VjdXJpdHlQb2xpY3lIZWFkZXIgfSBmcm9tIFwiLi9zZWN1cml0eS1oZWFkZXJzXCJcbmV4cG9ydCB7IFdlYmFwcE1vbml0b3IgfSBmcm9tIFwiLi9tb25pdG9yXCJcbiJdfQ==