@liflig/cdk 2.17.1 → 2.18.1

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/package.json +10 -10
  2. package/assets/cloudtrail-slack-integration-lambda/main.py +0 -267
  3. package/assets/pipeline-slack-notification-lambda/index.py +0 -300
  4. package/assets/prepare-cdk-source-lambda/index.py +0 -159
  5. package/assets/slack-alarm-lambda/index.py +0 -103
  6. package/lib/alarms/database-alarms.d.ts +0 -125
  7. package/lib/alarms/database-alarms.js +0 -171
  8. package/lib/alarms/index.d.ts +0 -3
  9. package/lib/alarms/index.js +0 -10
  10. package/lib/alarms/service-alarms.d.ts +0 -145
  11. package/lib/alarms/service-alarms.js +0 -148
  12. package/lib/alarms/ses-alarms.d.ts +0 -67
  13. package/lib/alarms/ses-alarms.js +0 -49
  14. package/lib/alarms/slack-alarm.d.ts +0 -25
  15. package/lib/alarms/slack-alarm.js +0 -47
  16. package/lib/bastion-host.d.ts +0 -41
  17. package/lib/bastion-host.js +0 -86
  18. package/lib/bin/cdk-create-snapshots.d.ts +0 -2
  19. package/lib/bin/fetch-pipeline-variables.d.ts +0 -2
  20. package/lib/build-artifacts/index.d.ts +0 -68
  21. package/lib/build-artifacts/index.js +0 -118
  22. package/lib/cdk-deploy/cdk-deploy.d.ts +0 -63
  23. package/lib/cdk-deploy/cdk-deploy.js +0 -175
  24. package/lib/cdk-deploy/index.d.ts +0 -1
  25. package/lib/cdk-deploy/index.js +0 -6
  26. package/lib/cdk-deploy/start-deploy-handler.d.ts +0 -8
  27. package/lib/cdk-deploy/start-deploy-handler.js +0 -72
  28. package/lib/cdk-deploy/status-handler.d.ts +0 -6
  29. package/lib/cdk-deploy/status-handler.js +0 -83
  30. package/lib/cdk-pipelines/cloud-assembly-lookup-handler.d.ts +0 -6
  31. package/lib/cdk-pipelines/cloud-assembly-lookup-handler.js +0 -63
  32. package/lib/cdk-pipelines/index.d.ts +0 -3
  33. package/lib/cdk-pipelines/index.js +0 -10
  34. package/lib/cdk-pipelines/liflig-cdk-pipeline.d.ts +0 -110
  35. package/lib/cdk-pipelines/liflig-cdk-pipeline.js +0 -232
  36. package/lib/cdk-pipelines/slack-notification.d.ts +0 -51
  37. package/lib/cdk-pipelines/slack-notification.js +0 -54
  38. package/lib/cdk-pipelines/variables.d.ts +0 -15
  39. package/lib/cdk-pipelines/variables.js +0 -80
  40. package/lib/cloudtrail-slack-integration/cloudtrail-slack-integration.d.ts +0 -47
  41. package/lib/cloudtrail-slack-integration/cloudtrail-slack-integration.js +0 -211
  42. package/lib/cloudtrail-slack-integration/index.d.ts +0 -1
  43. package/lib/cloudtrail-slack-integration/index.js +0 -6
  44. package/lib/configure-parameters/configure-parameters.d.ts +0 -61
  45. package/lib/configure-parameters/configure-parameters.js +0 -94
  46. package/lib/configure-parameters/index.d.ts +0 -1
  47. package/lib/configure-parameters/index.js +0 -6
  48. package/lib/cross-region-ssm-parameter.d.ts +0 -13
  49. package/lib/cross-region-ssm-parameter.js +0 -46
  50. package/lib/ecs/cluster.d.ts +0 -25
  51. package/lib/ecs/cluster.js +0 -70
  52. package/lib/ecs/fargate-service.d.ts +0 -62
  53. package/lib/ecs/fargate-service.js +0 -99
  54. package/lib/ecs/index.d.ts +0 -3
  55. package/lib/ecs/index.js +0 -10
  56. package/lib/ecs/listener-rule.d.ts +0 -25
  57. package/lib/ecs/listener-rule.js +0 -27
  58. package/lib/ecs-update-image/artifact-status.d.ts +0 -39
  59. package/lib/ecs-update-image/artifact-status.js +0 -41
  60. package/lib/ecs-update-image/ecs-update-image.d.ts +0 -41
  61. package/lib/ecs-update-image/ecs-update-image.js +0 -98
  62. package/lib/ecs-update-image/index.d.ts +0 -3
  63. package/lib/ecs-update-image/index.js +0 -10
  64. package/lib/ecs-update-image/start-deploy-handler.d.ts +0 -6
  65. package/lib/ecs-update-image/start-deploy-handler.js +0 -104
  66. package/lib/ecs-update-image/status-handler.d.ts +0 -11
  67. package/lib/ecs-update-image/status-handler.js +0 -74
  68. package/lib/ecs-update-image/tag.d.ts +0 -47
  69. package/lib/ecs-update-image/tag.js +0 -67
  70. package/lib/feature-flags.d.ts +0 -18
  71. package/lib/feature-flags.js +0 -48
  72. package/lib/griid/artefact-bucket.d.ts +0 -7
  73. package/lib/griid/artefact-bucket.js +0 -30
  74. package/lib/griid/index.d.ts +0 -4
  75. package/lib/griid/index.js +0 -18
  76. package/lib/hosted-zone-with-param.d.ts +0 -29
  77. package/lib/hosted-zone-with-param.js +0 -65
  78. package/lib/index.d.ts +0 -32
  79. package/lib/kinesis/index.d.ts +0 -1
  80. package/lib/kinesis/index.js +0 -6
  81. package/lib/kinesis/kinesis-to-datadog-stream.d.ts +0 -28
  82. package/lib/kinesis/kinesis-to-datadog-stream.js +0 -126
  83. package/lib/load-balancer/index.d.ts +0 -1
  84. package/lib/load-balancer/index.js +0 -6
  85. package/lib/load-balancer/load-balancer.d.ts +0 -16
  86. package/lib/load-balancer/load-balancer.js +0 -60
  87. package/lib/pipelines/conventions.d.ts +0 -14
  88. package/lib/pipelines/conventions.js +0 -24
  89. package/lib/pipelines/deploy-env.d.ts +0 -18
  90. package/lib/pipelines/deploy-env.js +0 -96
  91. package/lib/pipelines/index.d.ts +0 -2
  92. package/lib/pipelines/index.js +0 -8
  93. package/lib/pipelines/liflig-cdk-deployer-deps.d.ts +0 -13
  94. package/lib/pipelines/liflig-cdk-deployer-deps.js +0 -35
  95. package/lib/pipelines/pipeline.d.ts +0 -78
  96. package/lib/pipelines/pipeline.js +0 -224
  97. package/lib/platform/index.d.ts +0 -1
  98. package/lib/platform/index.js +0 -7
  99. package/lib/platform/platform.d.ts +0 -37
  100. package/lib/platform/platform.js +0 -57
  101. package/lib/rds/database.d.ts +0 -49
  102. package/lib/rds/database.js +0 -60
  103. package/lib/rds/index.d.ts +0 -1
  104. package/lib/rds/index.js +0 -6
  105. package/lib/ses/configurationsetdeliveryoptions/index.d.ts +0 -26
  106. package/lib/ses/configurationsetdeliveryoptions/index.js +0 -48
  107. package/lib/ses/configurationsetsnsdestination/handler.d.ts +0 -17
  108. package/lib/ses/configurationsetsnsdestination/handler.js +0 -75
  109. package/lib/ses/configurationsetsnsdestination/index.d.ts +0 -29
  110. package/lib/ses/configurationsetsnsdestination/index.js +0 -75
  111. package/lib/ses/index.d.ts +0 -4
  112. package/lib/ses/index.js +0 -12
  113. package/lib/ses/sesdomain/handler.d.ts +0 -10
  114. package/lib/ses/sesdomain/handler.js +0 -82
  115. package/lib/ses/sesdomain/index.d.ts +0 -57
  116. package/lib/ses/sesdomain/index.js +0 -94
  117. package/lib/ses/sesverifyemail/handler.d.ts +0 -9
  118. package/lib/ses/sesverifyemail/handler.js +0 -25
  119. package/lib/ses/sesverifyemail/index.d.ts +0 -13
  120. package/lib/ses/sesverifyemail/index.js +0 -51
  121. package/lib/snapshots.d.ts +0 -4
  122. package/lib/snapshots.js +0 -214
  123. package/lib/ssm-parameter-backed-resource.d.ts +0 -45
  124. package/lib/ssm-parameter-backed-resource.js +0 -67
  125. package/lib/ssm-parameter-reader.d.ts +0 -21
  126. package/lib/ssm-parameter-reader.js +0 -48
  127. package/lib/tags.d.ts +0 -8
  128. package/lib/tags.js +0 -36
  129. package/lib/utils.d.ts +0 -2
  130. package/lib/utils.js +0 -17
  131. package/lib/webapp/index.d.ts +0 -3
  132. package/lib/webapp/index.js +0 -10
  133. package/lib/webapp/monitor.d.ts +0 -187
  134. package/lib/webapp/monitor.js +0 -156
  135. package/lib/webapp/security-headers.d.ts +0 -38
  136. package/lib/webapp/security-headers.js +0 -129
  137. package/lib/webapp/webapp.d.ts +0 -116
  138. package/lib/webapp/webapp.js +0 -118
  139. package/lib/webapp-deploy-via-role.d.ts +0 -25
  140. package/lib/webapp-deploy-via-role.js +0 -32
@@ -1,232 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LifligCdkPipeline = void 0;
4
- const constructs = require("constructs");
5
- const codepipeline = require("aws-cdk-lib/aws-codepipeline");
6
- const codepipelineActions = require("aws-cdk-lib/aws-codepipeline-actions");
7
- const iam = require("aws-cdk-lib/aws-iam");
8
- const lambda = require("aws-cdk-lib/aws-lambda");
9
- const events = require("aws-cdk-lib/aws-events");
10
- const targets = require("aws-cdk-lib/aws-events-targets");
11
- const cdk = require("aws-cdk-lib");
12
- const pipelines = require("aws-cdk-lib/pipelines");
13
- const fs = require("fs");
14
- const path = require("path");
15
- const artefact_bucket_1 = require("../griid/artefact-bucket");
16
- const cloud_assembly_lookup_handler_1 = require("./cloud-assembly-lookup-handler");
17
- const slack_notification_1 = require("./slack-notification");
18
- /**
19
- * CDK Pipeline for Liflig.
20
- *
21
- * Avoid putting multiple pipelines in a stack, since the pipeline
22
- * will also keep the hosting stack up-to-date.
23
- *
24
- * The pipeline is executed by writing an empty file to
25
- * s3://<artifacts-bucket>/pipelines/<pipeline-name>/trigger
26
- *
27
- * Configuration files are read from S3 at the path
28
- * s3://<artifacts-bucket>/pipelines/<pipeline-name>/
29
- *
30
- * For upload type "cdk-source":
31
- *
32
- * - cdk-source.json holding a pointer to the active CDK source
33
- * that should be used. Schema:
34
- *
35
- * {
36
- * bucketName: string
37
- * bucketKey: string
38
- * }
39
- *
40
- * - variables*.json which can be zero or more files
41
- * with string-string map holding variables that will
42
- * be written to variables.json and can be read by the
43
- * the CDK application during synthesize.
44
- *
45
- * For upload type "cloud-assembly":
46
- *
47
- * - cloud-assembly.json holding a pointer to the active
48
- * CDK Cloud Assembly that should be used: Schema:
49
- *
50
- * {
51
- * cloudAssemblyBucketName: string
52
- * cloudAssemblyBucketKey: string
53
- * }
54
- *
55
- * Variables enables separation of IaC code and application code if
56
- * they are not colocated in the same repository.
57
- */
58
- class LifligCdkPipeline extends constructs.Construct {
59
- /**
60
- * Path on S3 for pipeline configuration.
61
- */
62
- static pipelineS3Prefix(pipelineName) {
63
- return `pipelines/${pipelineName}/`;
64
- }
65
- /**
66
- * Key in S3 bucket used to trigger pipeline.
67
- *
68
- * This is an empty file within the pipeline path.
69
- */
70
- static pipelineS3TriggerKey(pipelineName) {
71
- return `pipelines/${pipelineName}/trigger`;
72
- }
73
- constructor(scope, id, props) {
74
- var _a, _b;
75
- super(scope, id);
76
- this.artifactsBucket = (_a = props.artifactsBucket) !== null && _a !== void 0 ? _a : (0, artefact_bucket_1.getGriidArtefactBucket)(this);
77
- const cloudAssemblyArtifact = new codepipeline.Artifact();
78
- let synth;
79
- let stages;
80
- switch (props.sourceType) {
81
- case "cloud-assembly":
82
- const cloudAssembly = this.cloudAssemblyStage(cloudAssemblyArtifact, this.artifactsBucket, props.pipelineName);
83
- synth = cloudAssembly.synth;
84
- stages = cloudAssembly.stages;
85
- break;
86
- case "cdk-source":
87
- const cdkSource = this.cdkSourceStage(cloudAssemblyArtifact, this.artifactsBucket, props.pipelineName, (_b = props.parametersNamespace) !== null && _b !== void 0 ? _b : "default");
88
- synth = cdkSource.synth;
89
- stages = cdkSource.stages;
90
- break;
91
- }
92
- const dummyArtifact = new codepipeline.Artifact();
93
- this.triggerObjectKey = LifligCdkPipeline.pipelineS3TriggerKey(props.pipelineName);
94
- this.codePipeline = new codepipeline.Pipeline(this, "CodePipeline", {
95
- pipelineName: props.pipelineName,
96
- stages: [
97
- {
98
- stageName: "Source",
99
- actions: [
100
- new codepipelineActions.S3SourceAction({
101
- actionName: "source",
102
- bucket: this.artifactsBucket,
103
- trigger: codepipelineActions.S3Trigger.NONE,
104
- bucketKey: this.triggerObjectKey,
105
- output: dummyArtifact,
106
- }),
107
- ],
108
- },
109
- ...stages,
110
- ],
111
- restartExecutionOnUpdate: true,
112
- });
113
- new events.Rule(this, "PipelineTrigger", {
114
- eventPattern: {
115
- source: ["aws.s3"],
116
- detailType: ["Object Created"],
117
- detail: {
118
- bucket: {
119
- name: [this.artifactsBucket.bucketName],
120
- },
121
- object: {
122
- key: [this.triggerObjectKey],
123
- },
124
- },
125
- },
126
- targets: [new targets.CodePipeline(this.codePipeline)],
127
- });
128
- this.cdkPipeline = new pipelines.CodePipeline(this, "CdkPipeline", {
129
- synth,
130
- useChangeSets: false,
131
- codePipeline: this.codePipeline,
132
- });
133
- }
134
- static getAwsCdkPackageJsonFile() {
135
- // Also look up the tree a bit to handle yarn workspaces.
136
- const candidates = [
137
- path.join(process.cwd(), "node_modules/aws-cdk/package.json"),
138
- path.join(process.cwd(), "../node_modules/aws-cdk/package.json"),
139
- path.join(process.cwd(), "../../node_modules/aws-cdk/package.json"),
140
- path.join(process.cwd(), "../../../node_modules/aws-cdk/package.json"),
141
- ];
142
- for (const candidate of candidates) {
143
- if (fs.existsSync(candidate)) {
144
- return candidate;
145
- }
146
- }
147
- return undefined;
148
- }
149
- cloudAssemblyStage(cloudAssemblyArtifact, cdkBucket, pipelineName) {
150
- const cloudAssemblyLookupFn = new lambda.Function(this, "CloudAssemblyLookupFn", {
151
- code: new lambda.InlineCode(`exports.handler = ${cloud_assembly_lookup_handler_1.cloudAssemblyLookupHandler.toString()};`),
152
- handler: "index.handler",
153
- runtime: lambda.Runtime.NODEJS_16_X,
154
- timeout: cdk.Duration.minutes(1),
155
- memorySize: 512,
156
- });
157
- cdkBucket.grantReadWrite(cloudAssemblyLookupFn);
158
- const userParameters = {
159
- bucketName: cdkBucket.bucketName,
160
- objectKey: `pipelines/${pipelineName}/cloud-assembly.json`,
161
- };
162
- const synth = pipelines.CodePipelineFileSet.fromArtifact(cloudAssemblyArtifact);
163
- const stages = [
164
- {
165
- stageName: "PrepareCloudAssembly",
166
- actions: [
167
- new codepipelineActions.LambdaInvokeAction({
168
- actionName: "cloud-assembly-lookup",
169
- lambda: cloudAssemblyLookupFn,
170
- outputs: [cloudAssemblyArtifact],
171
- userParameters,
172
- }),
173
- ],
174
- },
175
- ];
176
- return { stages, synth };
177
- }
178
- cdkSourceStage(cloudAssemblyArtifact, cdkBucket, pipelineName, parametersNamespace) {
179
- const prepareCdkSourceFn = new lambda.Function(this, "PrepareCdkSourceFn", {
180
- code: lambda.Code.fromAsset(path.join(__dirname, "../../assets/prepare-cdk-source-lambda")),
181
- handler: "index.handler",
182
- // Using python instead if NodeJS due to zip-support in stdlib.
183
- runtime: lambda.Runtime.PYTHON_3_8,
184
- timeout: cdk.Duration.minutes(1),
185
- memorySize: 512,
186
- });
187
- const account = cdk.Stack.of(this).account;
188
- const region = cdk.Stack.of(this).region;
189
- prepareCdkSourceFn.grantPrincipal.addToPrincipalPolicy(new iam.PolicyStatement({
190
- actions: ["ssm:GetParametersByPath"],
191
- resources: [
192
- `arn:aws:ssm:${region}:${account}:parameter/liflig-cdk/*/pipeline-variables/*`,
193
- ],
194
- }));
195
- cdkBucket.grantReadWrite(prepareCdkSourceFn);
196
- const cdkSourceArtifact = new codepipeline.Artifact();
197
- const userParameters = {
198
- bucketName: cdkBucket.bucketName,
199
- prefix: `pipelines/${pipelineName}/`,
200
- parametersNamespace: parametersNamespace,
201
- };
202
- const synth = new pipelines.ShellStep("GenerateCloudAssembly", {
203
- input: pipelines.CodePipelineFileSet.fromArtifact(cdkSourceArtifact),
204
- installCommands: ["npm ci"],
205
- commands: ["npx cdk synth"],
206
- });
207
- const stages = [
208
- {
209
- stageName: "PrepareCdkSource",
210
- actions: [
211
- new codepipelineActions.LambdaInvokeAction({
212
- actionName: "prepare-cdk-source",
213
- lambda: prepareCdkSourceFn,
214
- outputs: [cdkSourceArtifact],
215
- userParameters,
216
- }),
217
- ],
218
- },
219
- ];
220
- return { stages, synth };
221
- }
222
- addSlackNotification(props) {
223
- new slack_notification_1.SlackNotification(this, "Slack", {
224
- pipeline: this.codePipeline,
225
- artifactsBucket: this.artifactsBucket,
226
- triggerObjectKey: this.triggerObjectKey,
227
- ...props,
228
- });
229
- }
230
- }
231
- exports.LifligCdkPipeline = LifligCdkPipeline;
232
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlmbGlnLWNkay1waXBlbGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jZGstcGlwZWxpbmVzL2xpZmxpZy1jZGstcGlwZWxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQXdDO0FBQ3hDLDZEQUE0RDtBQUM1RCw0RUFBMkU7QUFDM0UsMkNBQTBDO0FBQzFDLGlEQUFnRDtBQUNoRCxpREFBZ0Q7QUFDaEQsMERBQXlEO0FBRXpELG1DQUFrQztBQUNsQyxtREFBa0Q7QUFDbEQseUJBQXdCO0FBQ3hCLDZCQUE0QjtBQUM1Qiw4REFBaUU7QUFDakUsbUZBR3dDO0FBQ3hDLDZEQUFnRjtBQStDaEY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVDRztBQUNILE1BQWEsaUJBQWtCLFNBQVEsVUFBVSxDQUFDLFNBQVM7SUFDekQ7O09BRUc7SUFDSCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsWUFBb0I7UUFDMUMsT0FBTyxhQUFhLFlBQVksR0FBRyxDQUFBO0lBQ3JDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLG9CQUFvQixDQUFDLFlBQW9CO1FBQzlDLE9BQU8sYUFBYSxZQUFZLFVBQVUsQ0FBQTtJQUM1QyxDQUFDO0lBT0QsWUFDRSxLQUEyQixFQUMzQixFQUFVLEVBQ1YsS0FBNkI7O1FBRTdCLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFaEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFBLEtBQUssQ0FBQyxlQUFlLG1DQUFJLElBQUEsd0NBQXNCLEVBQUMsSUFBSSxDQUFDLENBQUE7UUFFNUUsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQTtRQUV6RCxJQUFJLEtBQWlDLENBQUE7UUFDckMsSUFBSSxNQUFpQyxDQUFBO1FBRXJDLFFBQVEsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3pCLEtBQUss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QW9QQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNvbnN0cnVjdHMgZnJvbSBcImNvbnN0cnVjdHNcIlxuaW1wb3J0ICogYXMgY29kZXBpcGVsaW5lIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY29kZXBpcGVsaW5lXCJcbmltcG9ydCAqIGFzIGNvZGVwaXBlbGluZUFjdGlvbnMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1jb2RlcGlwZWxpbmUtYWN0aW9uc1wiXG5pbXBvcnQgKiBhcyBpYW0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIlxuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCJcbmltcG9ydCAqIGFzIGV2ZW50cyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50c1wiXG5pbXBvcnQgKiBhcyB0YXJnZXRzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZXZlbnRzLXRhcmdldHNcIlxuaW1wb3J0ICogYXMgczMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiXG5pbXBvcnQgKiBhcyBjZGsgZnJvbSBcImF3cy1jZGstbGliXCJcbmltcG9ydCAqIGFzIHBpcGVsaW5lcyBmcm9tIFwiYXdzLWNkay1saWIvcGlwZWxpbmVzXCJcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCB7IGdldEdyaWlkQXJ0ZWZhY3RCdWNrZXQgfSBmcm9tIFwiLi4vZ3JpaWQvYXJ0ZWZhY3QtYnVja2V0XCJcbmltcG9ydCB7XG4gIGNsb3VkQXNzZW1ibHlMb29rdXBIYW5kbGVyLFxuICBDbG91ZEFzc2VtYmx5TG9va3VwVXNlclBhcmFtZXRlcnMsXG59IGZyb20gXCIuL2Nsb3VkLWFzc2VtYmx5LWxvb2t1cC1oYW5kbGVyXCJcbmltcG9ydCB7IFNsYWNrTm90aWZpY2F0aW9uLCBTbGFja05vdGlmaWNhdGlvblByb3BzIH0gZnJvbSBcIi4vc2xhY2stbm90aWZpY2F0aW9uXCJcblxuZXhwb3J0IGludGVyZmFjZSBMaWZsaWdDZGtQaXBlbGluZVByb3BzIHtcbiAgLyoqXG4gICAqIEJ1Y2tldCBob2xkaW5nIHBpcGVsaW5lIGNvbmZpZ3VyYXRpb24gYW5kIHRyaWdnZXIgZmlsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB1c2UgZXhpc3RpbmcgYnVja2V0IGJhc2VkIG9uIEdyaWlkIGNvbnZlbnRpb25zXG4gICAqL1xuICBhcnRpZmFjdHNCdWNrZXQ/OiBzMy5JQnVja2V0XG4gIC8qKlxuICAgKiBOYW1lIG9mIHBpcGVsaW5lLiBUaGlzIGlzIHVzZWQgZm9yIHRoZSBwYXRoIHdoZXJlIGNvbmZpZ3VyYXRpb25cbiAgICogaXMgc3RvcmVkIGluIFMzLlxuICAgKi9cbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmdcbiAgLyoqXG4gICAqIFR5cGUgb2YgdXBsb2FkZWQgYXJ0aWZhY3QuIFRoaXMgY2hhbmdlcyB0aGUgYmVoYXZpb3VyIG9mIHRoZVxuICAgKiBwaXBlbGluZSBhbmQgd2hhdCBraW5kIG9mIHByb2Nlc3MgaXQgcGVyZm9ybXMuXG4gICAqXG4gICAqIFR3byB0eXBlcyBhcmUgc3VwcG9ydGVkOlxuICAgKlxuICAgKiAgIC0gY2RrLXNvdXJjZTogVGhlIHVwbG9hZGVkIGFydGlmYWN0IHJlcHJlc2VudHMgYSBDREsgYXBwbGljYXRpb25cbiAgICogICAgIGFzIHNvdXJjZSBjb2RlLiBBIGJ1aWxkIHN0ZXAgd2lsbCBjb21waWxlIHRoaXMgaW50byBhXG4gICAqICAgICBDREsgQ2xvdWQgQXNzZW1ibHkuXG4gICAqXG4gICAqICAgICBBcyBwYXJ0IG9mIHN5bnRoZXNpemluZyB0aGlzIGludG8gYSBDREsgQ2xvdWQgQXNzZW1ibHksXG4gICAqICAgICBhIGZpbGUgXCJ2YXJpYWJsZXMuanNvblwiIHdpbGwgYmUgd3JpdHRlbiBmb3IgdGhlXG4gICAqICAgICBDREsgYXBwbGljYXRpb24gdG8gcGFyYW1ldGVyaXplIHRoZSBidWlsZCBpZiBhbnlcbiAgICogICAgIHZhcmlhYmxlcyBhcmUgZm91bmQgaW4gdGhlIHBpcGVsaW5lIHNvdXJjZS5cbiAgICpcbiAgICogICAtIGNsb3VkLWFzc2VtYmx5OiBUaGUgdXBsb2FkZWQgYXJ0aWZhY3QgcmVwcmVzZW50cyBhXG4gICAqICAgICBDREsgQ2xvdWQgQXNzZW1ibHkgd2hpY2ggaXMgcmVhZHkgZm9yIGRlcGxveW1lbnQuXG4gICAqXG4gICAqICAgICBUaGlzIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyB2YXJpYWJsZXMgYXQgdGhlIGN1cnJlbnQgdGltZVxuICAgKiAgICAgc2luY2UgQ0RLIFBpcGVsaW5lcyBkb24ndCBzdXBwb3J0IHBhcmFtZXRlcml6ZWQgZGVwbG95cy5cbiAgICogICAgIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvaXNzdWVzLzk1NjBcbiAgICovXG4gIHNvdXJjZVR5cGU6IFwiY2RrLXNvdXJjZVwiIHwgXCJjbG91ZC1hc3NlbWJseVwiXG4gIC8qKlxuICAgKiBUaGUgbmFtZXNwYWNlIHVzZWQgZm9yIHBhcmFtZXRlcnMgaW4gUGFyYW1ldGVyIFN0b3JlLlxuICAgKlxuICAgKiBPbmx5IHJlbGV2YW50IGZvciBzb3VyY2VUeXBlIG9mIFwiY2RrLXNvcnVjZVwiLlxuICAgKlxuICAgKiBAZGVmYXVsdCBkZWZhdWx0XG4gICAqL1xuICBwYXJhbWV0ZXJzTmFtZXNwYWNlPzogc3RyaW5nXG59XG5cbi8qKlxuICogQ0RLIFBpcGVsaW5lIGZvciBMaWZsaWcuXG4gKlxuICogQXZvaWQgcHV0dGluZyBtdWx0aXBsZSBwaXBlbGluZXMgaW4gYSBzdGFjaywgc2luY2UgdGhlIHBpcGVsaW5lXG4gKiB3aWxsIGFsc28ga2VlcCB0aGUgaG9zdGluZyBzdGFjayB1cC10by1kYXRlLlxuICpcbiAqIFRoZSBwaXBlbGluZSBpcyBleGVjdXRlZCBieSB3cml0aW5nIGFuIGVtcHR5IGZpbGUgdG9cbiAqIHMzOi8vPGFydGlmYWN0cy1idWNrZXQ+L3BpcGVsaW5lcy88cGlwZWxpbmUtbmFtZT4vdHJpZ2dlclxuICpcbiAqIENvbmZpZ3VyYXRpb24gZmlsZXMgYXJlIHJlYWQgZnJvbSBTMyBhdCB0aGUgcGF0aFxuICogczM6Ly88YXJ0aWZhY3RzLWJ1Y2tldD4vcGlwZWxpbmVzLzxwaXBlbGluZS1uYW1lPi9cbiAqXG4gKiBGb3IgdXBsb2FkIHR5cGUgXCJjZGstc291cmNlXCI6XG4gKlxuICogICAtIGNkay1zb3VyY2UuanNvbiBob2xkaW5nIGEgcG9pbnRlciB0byB0aGUgYWN0aXZlIENESyBzb3VyY2VcbiAqICAgICB0aGF0IHNob3VsZCBiZSB1c2VkLiBTY2hlbWE6XG4gKlxuICogICAgIHtcbiAqICAgICAgIGJ1Y2tldE5hbWU6IHN0cmluZ1xuICogICAgICAgYnVja2V0S2V5OiBzdHJpbmdcbiAqICAgICB9XG4gKlxuICogICAtIHZhcmlhYmxlcyouanNvbiB3aGljaCBjYW4gYmUgemVybyBvciBtb3JlIGZpbGVzXG4gKiAgICAgd2l0aCBzdHJpbmctc3RyaW5nIG1hcCBob2xkaW5nIHZhcmlhYmxlcyB0aGF0IHdpbGxcbiAqICAgICBiZSB3cml0dGVuIHRvIHZhcmlhYmxlcy5qc29uIGFuZCBjYW4gYmUgcmVhZCBieSB0aGVcbiAqICAgICB0aGUgQ0RLIGFwcGxpY2F0aW9uIGR1cmluZyBzeW50aGVzaXplLlxuICpcbiAqIEZvciB1cGxvYWQgdHlwZSBcImNsb3VkLWFzc2VtYmx5XCI6XG4gKlxuICogICAtIGNsb3VkLWFzc2VtYmx5Lmpzb24gaG9sZGluZyBhIHBvaW50ZXIgdG8gdGhlIGFjdGl2ZVxuICogICAgIENESyBDbG91ZCBBc3NlbWJseSB0aGF0IHNob3VsZCBiZSB1c2VkOiBTY2hlbWE6XG4gKlxuICogICAgIHtcbiAqICAgICAgIGNsb3VkQXNzZW1ibHlCdWNrZXROYW1lOiBzdHJpbmdcbiAqICAgICAgIGNsb3VkQXNzZW1ibHlCdWNrZXRLZXk6IHN0cmluZ1xuICogICAgIH1cbiAqXG4gKiBWYXJpYWJsZXMgZW5hYmxlcyBzZXBhcmF0aW9uIG9mIElhQyBjb2RlIGFuZCBhcHBsaWNhdGlvbiBjb2RlIGlmXG4gKiB0aGV5IGFyZSBub3QgY29sb2NhdGVkIGluIHRoZSBzYW1lIHJlcG9zaXRvcnkuXG4gKi9cbmV4cG9ydCBjbGFzcyBMaWZsaWdDZGtQaXBlbGluZSBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFBhdGggb24gUzMgZm9yIHBpcGVsaW5lIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzdGF0aWMgcGlwZWxpbmVTM1ByZWZpeChwaXBlbGluZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBwaXBlbGluZXMvJHtwaXBlbGluZU5hbWV9L2BcbiAgfVxuXG4gIC8qKlxuICAgKiBLZXkgaW4gUzMgYnVja2V0IHVzZWQgdG8gdHJpZ2dlciBwaXBlbGluZS5cbiAgICpcbiAgICogVGhpcyBpcyBhbiBlbXB0eSBmaWxlIHdpdGhpbiB0aGUgcGlwZWxpbmUgcGF0aC5cbiAgICovXG4gIHN0YXRpYyBwaXBlbGluZVMzVHJpZ2dlcktleShwaXBlbGluZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBwaXBlbGluZXMvJHtwaXBlbGluZU5hbWV9L3RyaWdnZXJgXG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgY2RrUGlwZWxpbmU6IHBpcGVsaW5lcy5Db2RlUGlwZWxpbmVcbiAgcHVibGljIHJlYWRvbmx5IGNvZGVQaXBlbGluZTogY29kZXBpcGVsaW5lLlBpcGVsaW5lXG4gIHB1YmxpYyByZWFkb25seSBhcnRpZmFjdHNCdWNrZXQ6IHMzLklCdWNrZXRcbiAgcHVibGljIHJlYWRvbmx5IHRyaWdnZXJPYmplY3RLZXk6IHN0cmluZ1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBMaWZsaWdDZGtQaXBlbGluZVByb3BzLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICB0aGlzLmFydGlmYWN0c0J1Y2tldCA9IHByb3BzLmFydGlmYWN0c0J1Y2tldCA/PyBnZXRHcmlpZEFydGVmYWN0QnVja2V0KHRoaXMpXG5cbiAgICBjb25zdCBjbG91ZEFzc2VtYmx5QXJ0aWZhY3QgPSBuZXcgY29kZXBpcGVsaW5lLkFydGlmYWN0KClcblxuICAgIGxldCBzeW50aDogcGlwZWxpbmVzLklGaWxlU2V0UHJvZHVjZXJcbiAgICBsZXQgc3RhZ2VzOiBjb2RlcGlwZWxpbmUuU3RhZ2VQcm9wc1tdXG5cbiAgICBzd2l0Y2ggKHByb3BzLnNvdXJjZVR5cGUpIHtcbiAgICAgIGNhc2UgXCJjbG91ZC1hc3NlbWJseVwiOlxuICAgICAgICBjb25zdCBjbG91ZEFzc2VtYmx5ID0gdGhpcy5jbG91ZEFzc2VtYmx5U3RhZ2UoXG4gICAgICAgICAgY2xvdWRBc3NlbWJseUFydGlmYWN0LFxuICAgICAgICAgIHRoaXMuYXJ0aWZhY3RzQnVja2V0LFxuICAgICAgICAgIHByb3BzLnBpcGVsaW5lTmFtZSxcbiAgICAgICAgKVxuICAgICAgICBzeW50aCA9IGNsb3VkQXNzZW1ibHkuc3ludGhcbiAgICAgICAgc3RhZ2VzID0gY2xvdWRBc3NlbWJseS5zdGFnZXNcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJjZGstc291cmNlXCI6XG4gICAgICAgIGNvbnN0IGNka1NvdXJjZSA9IHRoaXMuY2RrU291cmNlU3RhZ2UoXG4gICAgICAgICAgY2xvdWRBc3NlbWJseUFydGlmYWN0LFxuICAgICAgICAgIHRoaXMuYXJ0aWZhY3RzQnVja2V0LFxuICAgICAgICAgIHByb3BzLnBpcGVsaW5lTmFtZSxcbiAgICAgICAgICBwcm9wcy5wYXJhbWV0ZXJzTmFtZXNwYWNlID8/IFwiZGVmYXVsdFwiLFxuICAgICAgICApXG4gICAgICAgIHN5bnRoID0gY2RrU291cmNlLnN5bnRoXG4gICAgICAgIHN0YWdlcyA9IGNka1NvdXJjZS5zdGFnZXNcbiAgICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBjb25zdCBkdW1teUFydGlmYWN0ID0gbmV3IGNvZGVwaXBlbGluZS5BcnRpZmFjdCgpXG5cbiAgICB0aGlzLnRyaWdnZXJPYmplY3RLZXkgPSBMaWZsaWdDZGtQaXBlbGluZS5waXBlbGluZVMzVHJpZ2dlcktleShcbiAgICAgIHByb3BzLnBpcGVsaW5lTmFtZSxcbiAgICApXG5cbiAgICB0aGlzLmNvZGVQaXBlbGluZSA9IG5ldyBjb2RlcGlwZWxpbmUuUGlwZWxpbmUodGhpcywgXCJDb2RlUGlwZWxpbmVcIiwge1xuICAgICAgcGlwZWxpbmVOYW1lOiBwcm9wcy5waXBlbGluZU5hbWUsXG4gICAgICBzdGFnZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHN0YWdlTmFtZTogXCJTb3VyY2VcIixcbiAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICBuZXcgY29kZXBpcGVsaW5lQWN0aW9ucy5TM1NvdXJjZUFjdGlvbih7XG4gICAgICAgICAgICAgIGFjdGlvbk5hbWU6IFwic291cmNlXCIsXG4gICAgICAgICAgICAgIGJ1Y2tldDogdGhpcy5hcnRpZmFjdHNCdWNrZXQsXG4gICAgICAgICAgICAgIHRyaWdnZXI6IGNvZGVwaXBlbGluZUFjdGlvbnMuUzNUcmlnZ2VyLk5PTkUsXG4gICAgICAgICAgICAgIGJ1Y2tldEtleTogdGhpcy50cmlnZ2VyT2JqZWN0S2V5LFxuICAgICAgICAgICAgICBvdXRwdXQ6IGR1bW15QXJ0aWZhY3QsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICAuLi5zdGFnZXMsXG4gICAgICBdLFxuICAgICAgcmVzdGFydEV4ZWN1dGlvbk9uVXBkYXRlOiB0cnVlLFxuICAgIH0pXG5cbiAgICBuZXcgZXZlbnRzLlJ1bGUodGhpcywgXCJQaXBlbGluZVRyaWdnZXJcIiwge1xuICAgICAgZXZlbnRQYXR0ZXJuOiB7XG4gICAgICAgIHNvdXJjZTogW1wiYXdzLnMzXCJdLFxuICAgICAgICBkZXRhaWxUeXBlOiBbXCJPYmplY3QgQ3JlYXRlZFwiXSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgYnVja2V0OiB7XG4gICAgICAgICAgICBuYW1lOiBbdGhpcy5hcnRpZmFjdHNCdWNrZXQuYnVja2V0TmFtZV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvYmplY3Q6IHtcbiAgICAgICAgICAgIGtleTogW3RoaXMudHJpZ2dlck9iamVjdEtleV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0YXJnZXRzOiBbbmV3IHRhcmdldHMuQ29kZVBpcGVsaW5lKHRoaXMuY29kZVBpcGVsaW5lKV0sXG4gICAgfSlcblxuICAgIHRoaXMuY2RrUGlwZWxpbmUgPSBuZXcgcGlwZWxpbmVzLkNvZGVQaXBlbGluZSh0aGlzLCBcIkNka1BpcGVsaW5lXCIsIHtcbiAgICAgIHN5bnRoLFxuICAgICAgdXNlQ2hhbmdlU2V0czogZmFsc2UsXG4gICAgICBjb2RlUGlwZWxpbmU6IHRoaXMuY29kZVBpcGVsaW5lLFxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRBd3NDZGtQYWNrYWdlSnNvbkZpbGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBBbHNvIGxvb2sgdXAgdGhlIHRyZWUgYSBiaXQgdG8gaGFuZGxlIHlhcm4gd29ya3NwYWNlcy5cbiAgICBjb25zdCBjYW5kaWRhdGVzID0gW1xuICAgICAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwibm9kZV9tb2R1bGVzL2F3cy1jZGsvcGFja2FnZS5qc29uXCIpLFxuICAgICAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwiLi4vbm9kZV9tb2R1bGVzL2F3cy1jZGsvcGFja2FnZS5qc29uXCIpLFxuICAgICAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwiLi4vLi4vbm9kZV9tb2R1bGVzL2F3cy1jZGsvcGFja2FnZS5qc29uXCIpLFxuICAgICAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F3cy1jZGsvcGFja2FnZS5qc29uXCIpLFxuICAgIF1cblxuICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIHByaXZhdGUgY2xvdWRBc3NlbWJseVN0YWdlKFxuICAgIGNsb3VkQXNzZW1ibHlBcnRpZmFjdDogY29kZXBpcGVsaW5lLkFydGlmYWN0LFxuICAgIGNka0J1Y2tldDogczMuSUJ1Y2tldCxcbiAgICBwaXBlbGluZU5hbWU6IHN0cmluZyxcbiAgKTogeyBzdGFnZXM6IGNvZGVwaXBlbGluZS5TdGFnZVByb3BzW107IHN5bnRoOiBwaXBlbGluZXMuSUZpbGVTZXRQcm9kdWNlciB9IHtcbiAgICBjb25zdCBjbG91ZEFzc2VtYmx5TG9va3VwRm4gPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKFxuICAgICAgdGhpcyxcbiAgICAgIFwiQ2xvdWRBc3NlbWJseUxvb2t1cEZuXCIsXG4gICAgICB7XG4gICAgICAgIGNvZGU6IG5ldyBsYW1iZGEuSW5saW5lQ29kZShcbiAgICAgICAgICBgZXhwb3J0cy5oYW5kbGVyID0gJHtjbG91ZEFzc2VtYmx5TG9va3VwSGFuZGxlci50b1N0cmluZygpfTtgLFxuICAgICAgICApLFxuICAgICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE2X1gsXG4gICAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5taW51dGVzKDEpLFxuICAgICAgICBtZW1vcnlTaXplOiA1MTIsXG4gICAgICB9LFxuICAgIClcblxuICAgIGNka0J1Y2tldC5ncmFudFJlYWRXcml0ZShjbG91ZEFzc2VtYmx5TG9va3VwRm4pXG5cbiAgICBjb25zdCB1c2VyUGFyYW1ldGVyczogQ2xvdWRBc3NlbWJseUxvb2t1cFVzZXJQYXJhbWV0ZXJzID0ge1xuICAgICAgYnVja2V0TmFtZTogY2RrQnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgICBvYmplY3RLZXk6IGBwaXBlbGluZXMvJHtwaXBlbGluZU5hbWV9L2Nsb3VkLWFzc2VtYmx5Lmpzb25gLFxuICAgIH1cblxuICAgIGNvbnN0IHN5bnRoID0gcGlwZWxpbmVzLkNvZGVQaXBlbGluZUZpbGVTZXQuZnJvbUFydGlmYWN0KFxuICAgICAgY2xvdWRBc3NlbWJseUFydGlmYWN0LFxuICAgIClcblxuICAgIGNvbnN0IHN0YWdlcyA9IFtcbiAgICAgIHtcbiAgICAgICAgc3RhZ2VOYW1lOiBcIlByZXBhcmVDbG91ZEFzc2VtYmx5XCIsXG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICBuZXcgY29kZXBpcGVsaW5lQWN0aW9ucy5MYW1iZGFJbnZva2VBY3Rpb24oe1xuICAgICAgICAgICAgYWN0aW9uTmFtZTogXCJjbG91ZC1hc3NlbWJseS1sb29rdXBcIixcbiAgICAgICAgICAgIGxhbWJkYTogY2xvdWRBc3NlbWJseUxvb2t1cEZuLFxuICAgICAgICAgICAgb3V0cHV0czogW2Nsb3VkQXNzZW1ibHlBcnRpZmFjdF0sXG4gICAgICAgICAgICB1c2VyUGFyYW1ldGVycyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgXVxuICAgIHJldHVybiB7IHN0YWdlcywgc3ludGggfVxuICB9XG5cbiAgcHJpdmF0ZSBjZGtTb3VyY2VTdGFnZShcbiAgICBjbG91ZEFzc2VtYmx5QXJ0aWZhY3Q6IGNvZGVwaXBlbGluZS5BcnRpZmFjdCxcbiAgICBjZGtCdWNrZXQ6IHMzLklCdWNrZXQsXG4gICAgcGlwZWxpbmVOYW1lOiBzdHJpbmcsXG4gICAgcGFyYW1ldGVyc05hbWVzcGFjZTogc3RyaW5nLFxuICApOiB7IHN0YWdlczogY29kZXBpcGVsaW5lLlN0YWdlUHJvcHNbXTsgc3ludGg6IHBpcGVsaW5lcy5JRmlsZVNldFByb2R1Y2VyIH0ge1xuICAgIGNvbnN0IHByZXBhcmVDZGtTb3VyY2VGbiA9IG5ldyBsYW1iZGEuRnVuY3Rpb24odGhpcywgXCJQcmVwYXJlQ2RrU291cmNlRm5cIiwge1xuICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KFxuICAgICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uLy4uL2Fzc2V0cy9wcmVwYXJlLWNkay1zb3VyY2UtbGFtYmRhXCIpLFxuICAgICAgKSxcbiAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgLy8gVXNpbmcgcHl0aG9uIGluc3RlYWQgaWYgTm9kZUpTIGR1ZSB0byB6aXAtc3VwcG9ydCBpbiBzdGRsaWIuXG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5QWVRIT05fM184LFxuICAgICAgdGltZW91dDogY2RrLkR1cmF0aW9uLm1pbnV0ZXMoMSksXG4gICAgICBtZW1vcnlTaXplOiA1MTIsXG4gICAgfSlcblxuICAgIGNvbnN0IGFjY291bnQgPSBjZGsuU3RhY2sub2YodGhpcykuYWNjb3VudFxuICAgIGNvbnN0IHJlZ2lvbiA9IGNkay5TdGFjay5vZih0aGlzKS5yZWdpb25cblxuICAgIHByZXBhcmVDZGtTb3VyY2VGbi5ncmFudFByaW5jaXBhbC5hZGRUb1ByaW5jaXBhbFBvbGljeShcbiAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogW1wic3NtOkdldFBhcmFtZXRlcnNCeVBhdGhcIl0sXG4gICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgIGBhcm46YXdzOnNzbToke3JlZ2lvbn06JHthY2NvdW50fTpwYXJhbWV0ZXIvbGlmbGlnLWNkay8qL3BpcGVsaW5lLXZhcmlhYmxlcy8qYCxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgIClcblxuICAgIGNka0J1Y2tldC5ncmFudFJlYWRXcml0ZShwcmVwYXJlQ2RrU291cmNlRm4pXG5cbiAgICBjb25zdCBjZGtTb3VyY2VBcnRpZmFjdCA9IG5ldyBjb2RlcGlwZWxpbmUuQXJ0aWZhY3QoKVxuXG4gICAgY29uc3QgdXNlclBhcmFtZXRlcnM6IFByZXBhcmVDZGtTb3VyY2VVc2VyUGFyYW1ldGVycyA9IHtcbiAgICAgIGJ1Y2tldE5hbWU6IGNka0J1Y2tldC5idWNrZXROYW1lLFxuICAgICAgcHJlZml4OiBgcGlwZWxpbmVzLyR7cGlwZWxpbmVOYW1lfS9gLFxuICAgICAgcGFyYW1ldGVyc05hbWVzcGFjZTogcGFyYW1ldGVyc05hbWVzcGFjZSxcbiAgICB9XG5cbiAgICBjb25zdCBzeW50aCA9IG5ldyBwaXBlbGluZXMuU2hlbGxTdGVwKFwiR2VuZXJhdGVDbG91ZEFzc2VtYmx5XCIsIHtcbiAgICAgIGlucHV0OiBwaXBlbGluZXMuQ29kZVBpcGVsaW5lRmlsZVNldC5mcm9tQXJ0aWZhY3QoY2RrU291cmNlQXJ0aWZhY3QpLFxuICAgICAgaW5zdGFsbENvbW1hbmRzOiBbXCJucG0gY2lcIl0sXG4gICAgICBjb21tYW5kczogW1wibnB4IGNkayBzeW50aFwiXSxcbiAgICB9KVxuICAgIGNvbnN0IHN0YWdlcyA9IFtcbiAgICAgIHtcbiAgICAgICAgc3RhZ2VOYW1lOiBcIlByZXBhcmVDZGtTb3VyY2VcIixcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgIG5ldyBjb2RlcGlwZWxpbmVBY3Rpb25zLkxhbWJkYUludm9rZUFjdGlvbih7XG4gICAgICAgICAgICBhY3Rpb25OYW1lOiBcInByZXBhcmUtY2RrLXNvdXJjZVwiLFxuICAgICAgICAgICAgbGFtYmRhOiBwcmVwYXJlQ2RrU291cmNlRm4sXG4gICAgICAgICAgICBvdXRwdXRzOiBbY2RrU291cmNlQXJ0aWZhY3RdLFxuICAgICAgICAgICAgdXNlclBhcmFtZXRlcnMsXG4gICAgICAgICAgfSksXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIF1cbiAgICByZXR1cm4geyBzdGFnZXMsIHN5bnRoIH1cbiAgfVxuXG4gIGFkZFNsYWNrTm90aWZpY2F0aW9uKFxuICAgIHByb3BzOiBPbWl0PFxuICAgICAgU2xhY2tOb3RpZmljYXRpb25Qcm9wcyxcbiAgICAgIFwicGlwZWxpbmVcIiB8IFwiYXJ0aWZhY3RzQnVja2V0XCIgfCBcInRyaWdnZXJPYmplY3RLZXlcIlxuICAgID4sXG4gICk6IHZvaWQge1xuICAgIG5ldyBTbGFja05vdGlmaWNhdGlvbih0aGlzLCBcIlNsYWNrXCIsIHtcbiAgICAgIHBpcGVsaW5lOiB0aGlzLmNvZGVQaXBlbGluZSxcbiAgICAgIGFydGlmYWN0c0J1Y2tldDogdGhpcy5hcnRpZmFjdHNCdWNrZXQsXG4gICAgICB0cmlnZ2VyT2JqZWN0S2V5OiB0aGlzLnRyaWdnZXJPYmplY3RLZXksXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KVxuICB9XG59XG5cbmludGVyZmFjZSBQcmVwYXJlQ2RrU291cmNlVXNlclBhcmFtZXRlcnMge1xuICBidWNrZXROYW1lOiBzdHJpbmdcbiAgcHJlZml4OiBzdHJpbmdcbiAgcGFyYW1ldGVyc05hbWVzcGFjZTogc3RyaW5nXG59XG4iXX0=
@@ -1,51 +0,0 @@
1
- import * as constructs from "constructs";
2
- import * as codepipeline from "aws-cdk-lib/aws-codepipeline";
3
- import * as s3 from "aws-cdk-lib/aws-s3";
4
- import * as secretsmanager from "aws-cdk-lib/aws-secretsmanager";
5
- export interface SlackNotificationProps {
6
- /**
7
- * CodePipeline to monitor.
8
- */
9
- pipeline: codepipeline.IPipeline;
10
- /**
11
- * Artifacts bucket used by pipeline
12
- */
13
- artifactsBucket: s3.IBucket;
14
- /**
15
- * A plaintext secret containing the URL of a Slack incoming webhook.
16
- * The webhook should be created through a Slack app, and only allows posting to one specific Slack channel.
17
- * See Slack's official documentation (e.g., https://api.slack.com/messaging/webhooks) for more details.
18
- *
19
- * NOTE: Incoming webhooks created through legacy custom integrations in Slack are not supported.
20
- */
21
- slackWebhookUrlSecret: secretsmanager.ISecret;
22
- /**
23
- * An optional friendly name that will be used in the Slack notifications instead of the AWS account ID
24
- */
25
- accountFriendlyName?: string;
26
- /**
27
- * Control the amount and types of notifications being sent to Slack.
28
- * "WARN" is the least verbose, while "DEBUG" is the most verbose.
29
- *
30
- * "WARN" - Includes notifications related to the failure of a pipeline execution.
31
- * "INFO" - Adds notifications for the success of a pipeline execution.
32
- * "DEBUG" - Adds notifications for the start and superseding of a pipeline execution.
33
- *
34
- * @default "WARN"
35
- */
36
- notificationLevel?: "WARN" | "INFO" | "DEBUG";
37
- /**
38
- * The key of the object (e.g., `my-prefix/my-file.json`) that triggers the S3 Source Action associated with the pipeline.
39
- * By configuring this parameter you can specify which objects the Lambda function that sends messages to Slack can access in the artifacts bucket.
40
- *
41
- * @default - the Lambda function can read all objects in the artifacts bucket.
42
- */
43
- triggerObjectKey?: string;
44
- }
45
- /**
46
- * Monitor a CodePipeline and send message to Slack on failure
47
- * and some succeeded events.
48
- */
49
- export declare class SlackNotification extends constructs.Construct {
50
- constructor(scope: constructs.Construct, id: string, props: SlackNotificationProps);
51
- }
@@ -1,54 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SlackNotification = void 0;
4
- const constructs = require("constructs");
5
- const eventsTargets = require("aws-cdk-lib/aws-events-targets");
6
- const iam = require("aws-cdk-lib/aws-iam");
7
- const lambda = require("aws-cdk-lib/aws-lambda");
8
- const cdk = require("aws-cdk-lib");
9
- const path = require("path");
10
- /**
11
- * Monitor a CodePipeline and send message to Slack on failure
12
- * and some succeeded events.
13
- */
14
- class SlackNotification extends constructs.Construct {
15
- constructor(scope, id, props) {
16
- var _a;
17
- super(scope, id);
18
- const environment = {
19
- SLACK_URL_SECRET_NAME: props.slackWebhookUrlSecret.secretName,
20
- NOTIFICATION_LEVEL: (_a = props.notificationLevel) !== null && _a !== void 0 ? _a : "WARN",
21
- };
22
- if (props.accountFriendlyName != null) {
23
- environment.ACCOUNT_FRIENDLY_NAME = props.accountFriendlyName;
24
- }
25
- const reportFunction = new lambda.Function(this, "Function", {
26
- code: lambda.Code.fromAsset(path.join(__dirname, "../../assets/pipeline-slack-notification-lambda")),
27
- handler: "index.handler",
28
- runtime: lambda.Runtime.PYTHON_3_11,
29
- timeout: cdk.Duration.seconds(10),
30
- environment,
31
- description: "Handle CodePipeline pipeline state change and report to Slack",
32
- });
33
- reportFunction.grantPrincipal.addToPrincipalPolicy(new iam.PolicyStatement({
34
- actions: [
35
- "codepipeline:ListActionExecutions",
36
- "codepipeline:ListPipelineExecutions",
37
- ],
38
- resources: [props.pipeline.pipelineArn],
39
- }));
40
- props.slackWebhookUrlSecret.grantRead(reportFunction);
41
- props.artifactsBucket.grantRead(reportFunction, props.triggerObjectKey);
42
- props.pipeline.onStateChange(`Event${id}`, {
43
- eventPattern: {
44
- detail: {
45
- // Available states: https://docs.aws.amazon.com/codepipeline/latest/userguide/detect-state-changes-cloudwatch-events.html
46
- state: ["SUCCEEDED", "FAILED", "STARTED", "SUPERSEDED"],
47
- },
48
- },
49
- target: new eventsTargets.LambdaFunction(reportFunction),
50
- });
51
- }
52
- }
53
- exports.SlackNotification = SlackNotification;
54
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhY2stbm90aWZpY2F0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Nkay1waXBlbGluZXMvc2xhY2stbm90aWZpY2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUF3QztBQUV4QyxnRUFBK0Q7QUFDL0QsMkNBQTBDO0FBQzFDLGlEQUFnRDtBQUNoRCxtQ0FBa0M7QUFDbEMsNkJBQTRCO0FBNkM1Qjs7O0dBR0c7QUFDSCxNQUFhLGlCQUFrQixTQUFRLFVBQVUsQ0FBQyxTQUFTO0lBQ3pELFlBQ0UsS0FBMkIsRUFDM0IsRUFBVSxFQUNWLEtBQTZCOztRQUU3QixLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRWhCLE1BQU0sV0FBVyxHQUEyQjtZQUMxQyxxQkFBcUIsRUFBRSxLQUFLLENBQUMscUJBQXFCLENBQUMsVUFBVTtZQUM3RCxrQkFBa0IsRUFBRSxNQUFBLEtBQUssQ0FBQyxpQkFBaUIsbUNBQUksTUFBTTtTQUN0RCxDQUFBO1FBRUQsSUFBSSxLQUFLLENBQUMsbUJBQW1CLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdEMsV0FBVyxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQTtRQUMvRCxDQUFDO1FBRUQsTUFBTSxjQUFjLEdBQUcsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDM0QsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxpREFBaUQsQ0FBQyxDQUN4RTtZQUNELE9BQU8sRUFBRSxlQUFlO1lBQ3hCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVc7WUFDbkMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNqQyxXQUFXO1lBQ1gsV0FBVyxFQUNULCtEQUErRDtTQUNsRSxDQUFDLENBQUE7UUFFRixjQUFjLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUNoRCxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUM7WUFDdEIsT0FBTyxFQUFFO2dCQUNQLG1DQUFtQztnQkFDbkMscUNBQXFDO2FBQ3RDO1lBQ0QsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7U0FDeEMsQ0FBQyxDQUNILENBQUE7UUFFRCxLQUFLLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBRXJELEtBQUssQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtRQUV2RSxLQUFLLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFO1lBQ3pDLFlBQVksRUFBRTtnQkFDWixNQUFNLEVBQUU7b0JBQ04sMEhBQTBIO29CQUMxSCxLQUFLLEVBQUUsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUM7aUJBQ3hEO2FBQ0Y7WUFDRCxNQUFNLEVBQUUsSUFBSSxhQUFhLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQztTQUN6RCxDQUFDLENBQUE7SUFDSixDQUFDO0NBQ0Y7QUFyREQsOENBcURDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY29uc3RydWN0cyBmcm9tIFwiY29uc3RydWN0c1wiXG5pbXBvcnQgKiBhcyBjb2RlcGlwZWxpbmUgZnJvbSBcImF3cy1jZGstbGliL2F3cy1jb2RlcGlwZWxpbmVcIlxuaW1wb3J0ICogYXMgZXZlbnRzVGFyZ2V0cyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzXCJcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiXG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIlxuaW1wb3J0ICogYXMgY2RrIGZyb20gXCJhd3MtY2RrLWxpYlwiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCAqIGFzIHMzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIlxuaW1wb3J0ICogYXMgc2VjcmV0c21hbmFnZXIgZnJvbSBcImF3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlclwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgU2xhY2tOb3RpZmljYXRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBDb2RlUGlwZWxpbmUgdG8gbW9uaXRvci5cbiAgICovXG4gIHBpcGVsaW5lOiBjb2RlcGlwZWxpbmUuSVBpcGVsaW5lXG4gIC8qKlxuICAgKiBBcnRpZmFjdHMgYnVja2V0IHVzZWQgYnkgcGlwZWxpbmVcbiAgICovXG4gIGFydGlmYWN0c0J1Y2tldDogczMuSUJ1Y2tldFxuICAvKipcbiAgICogQSBwbGFpbnRleHQgc2VjcmV0IGNvbnRhaW5pbmcgdGhlIFVSTCBvZiBhIFNsYWNrIGluY29taW5nIHdlYmhvb2suXG4gICAqIFRoZSB3ZWJob29rIHNob3VsZCBiZSBjcmVhdGVkIHRocm91Z2ggYSBTbGFjayBhcHAsIGFuZCBvbmx5IGFsbG93cyBwb3N0aW5nIHRvIG9uZSBzcGVjaWZpYyBTbGFjayBjaGFubmVsLlxuICAgKiBTZWUgU2xhY2sncyBvZmZpY2lhbCBkb2N1bWVudGF0aW9uIChlLmcuLCBodHRwczovL2FwaS5zbGFjay5jb20vbWVzc2FnaW5nL3dlYmhvb2tzKSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKlxuICAgKiBOT1RFOiBJbmNvbWluZyB3ZWJob29rcyBjcmVhdGVkIHRocm91Z2ggbGVnYWN5IGN1c3RvbSBpbnRlZ3JhdGlvbnMgaW4gU2xhY2sgYXJlIG5vdCBzdXBwb3J0ZWQuXG4gICAqL1xuICBzbGFja1dlYmhvb2tVcmxTZWNyZXQ6IHNlY3JldHNtYW5hZ2VyLklTZWNyZXRcbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIGZyaWVuZGx5IG5hbWUgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIFNsYWNrIG5vdGlmaWNhdGlvbnMgaW5zdGVhZCBvZiB0aGUgQVdTIGFjY291bnQgSURcbiAgICovXG4gIGFjY291bnRGcmllbmRseU5hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIENvbnRyb2wgdGhlIGFtb3VudCBhbmQgdHlwZXMgb2Ygbm90aWZpY2F0aW9ucyBiZWluZyBzZW50IHRvIFNsYWNrLlxuICAgKiBcIldBUk5cIiBpcyB0aGUgbGVhc3QgdmVyYm9zZSwgd2hpbGUgXCJERUJVR1wiIGlzIHRoZSBtb3N0IHZlcmJvc2UuXG4gICAqXG4gICAqIFwiV0FSTlwiIC0gSW5jbHVkZXMgbm90aWZpY2F0aW9ucyByZWxhdGVkIHRvIHRoZSBmYWlsdXJlIG9mIGEgcGlwZWxpbmUgZXhlY3V0aW9uLlxuICAgKiBcIklORk9cIiAtIEFkZHMgbm90aWZpY2F0aW9ucyBmb3IgdGhlIHN1Y2Nlc3Mgb2YgYSBwaXBlbGluZSBleGVjdXRpb24uXG4gICAqIFwiREVCVUdcIiAtIEFkZHMgbm90aWZpY2F0aW9ucyBmb3IgdGhlIHN0YXJ0IGFuZCBzdXBlcnNlZGluZyBvZiBhIHBpcGVsaW5lIGV4ZWN1dGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJXQVJOXCJcbiAgICovXG4gIG5vdGlmaWNhdGlvbkxldmVsPzogXCJXQVJOXCIgfCBcIklORk9cIiB8IFwiREVCVUdcIlxuICAvKipcbiAgICogVGhlIGtleSBvZiB0aGUgb2JqZWN0IChlLmcuLCBgbXktcHJlZml4L215LWZpbGUuanNvbmApIHRoYXQgdHJpZ2dlcnMgdGhlIFMzIFNvdXJjZSBBY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBwaXBlbGluZS5cbiAgICogQnkgY29uZmlndXJpbmcgdGhpcyBwYXJhbWV0ZXIgeW91IGNhbiBzcGVjaWZ5IHdoaWNoIG9iamVjdHMgdGhlIExhbWJkYSBmdW5jdGlvbiB0aGF0IHNlbmRzIG1lc3NhZ2VzIHRvIFNsYWNrIGNhbiBhY2Nlc3MgaW4gdGhlIGFydGlmYWN0cyBidWNrZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIExhbWJkYSBmdW5jdGlvbiBjYW4gcmVhZCBhbGwgb2JqZWN0cyBpbiB0aGUgYXJ0aWZhY3RzIGJ1Y2tldC5cbiAgICovXG4gIHRyaWdnZXJPYmplY3RLZXk/OiBzdHJpbmdcbn1cblxuLyoqXG4gKiBNb25pdG9yIGEgQ29kZVBpcGVsaW5lIGFuZCBzZW5kIG1lc3NhZ2UgdG8gU2xhY2sgb24gZmFpbHVyZVxuICogYW5kIHNvbWUgc3VjY2VlZGVkIGV2ZW50cy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNsYWNrTm90aWZpY2F0aW9uIGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogU2xhY2tOb3RpZmljYXRpb25Qcm9wcyxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuXG4gICAgY29uc3QgZW52aXJvbm1lbnQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBTTEFDS19VUkxfU0VDUkVUX05BTUU6IHByb3BzLnNsYWNrV2ViaG9va1VybFNlY3JldC5zZWNyZXROYW1lLFxuICAgICAgTk9USUZJQ0FUSU9OX0xFVkVMOiBwcm9wcy5ub3RpZmljYXRpb25MZXZlbCA/PyBcIldBUk5cIixcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuYWNjb3VudEZyaWVuZGx5TmFtZSAhPSBudWxsKSB7XG4gICAgICBlbnZpcm9ubWVudC5BQ0NPVU5UX0ZSSUVORExZX05BTUUgPSBwcm9wcy5hY2NvdW50RnJpZW5kbHlOYW1lXG4gICAgfVxuXG4gICAgY29uc3QgcmVwb3J0RnVuY3Rpb24gPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKHRoaXMsIFwiRnVuY3Rpb25cIiwge1xuICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KFxuICAgICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uLy4uL2Fzc2V0cy9waXBlbGluZS1zbGFjay1ub3RpZmljYXRpb24tbGFtYmRhXCIpLFxuICAgICAgKSxcbiAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuUFlUSE9OXzNfMTEsXG4gICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24uc2Vjb25kcygxMCksXG4gICAgICBlbnZpcm9ubWVudCxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkhhbmRsZSBDb2RlUGlwZWxpbmUgcGlwZWxpbmUgc3RhdGUgY2hhbmdlIGFuZCByZXBvcnQgdG8gU2xhY2tcIixcbiAgICB9KVxuXG4gICAgcmVwb3J0RnVuY3Rpb24uZ3JhbnRQcmluY2lwYWwuYWRkVG9QcmluY2lwYWxQb2xpY3koXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICBcImNvZGVwaXBlbGluZTpMaXN0QWN0aW9uRXhlY3V0aW9uc1wiLFxuICAgICAgICAgIFwiY29kZXBpcGVsaW5lOkxpc3RQaXBlbGluZUV4ZWN1dGlvbnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbcHJvcHMucGlwZWxpbmUucGlwZWxpbmVBcm5dLFxuICAgICAgfSksXG4gICAgKVxuXG4gICAgcHJvcHMuc2xhY2tXZWJob29rVXJsU2VjcmV0LmdyYW50UmVhZChyZXBvcnRGdW5jdGlvbilcblxuICAgIHByb3BzLmFydGlmYWN0c0J1Y2tldC5ncmFudFJlYWQocmVwb3J0RnVuY3Rpb24sIHByb3BzLnRyaWdnZXJPYmplY3RLZXkpXG5cbiAgICBwcm9wcy5waXBlbGluZS5vblN0YXRlQ2hhbmdlKGBFdmVudCR7aWR9YCwge1xuICAgICAgZXZlbnRQYXR0ZXJuOiB7XG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIC8vIEF2YWlsYWJsZSBzdGF0ZXM6IGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb2RlcGlwZWxpbmUvbGF0ZXN0L3VzZXJndWlkZS9kZXRlY3Qtc3RhdGUtY2hhbmdlcy1jbG91ZHdhdGNoLWV2ZW50cy5odG1sXG4gICAgICAgICAgc3RhdGU6IFtcIlNVQ0NFRURFRFwiLCBcIkZBSUxFRFwiLCBcIlNUQVJURURcIiwgXCJTVVBFUlNFREVEXCJdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHRhcmdldDogbmV3IGV2ZW50c1RhcmdldHMuTGFtYmRhRnVuY3Rpb24ocmVwb3J0RnVuY3Rpb24pLFxuICAgIH0pXG4gIH1cbn1cbiJdfQ==
@@ -1,15 +0,0 @@
1
- /**
2
- * Get a value from "variables.json" in the current working directory.
3
- *
4
- * The name must exist or an error will be thrown.
5
- *
6
- * The variables.json file should have variablesTimestamp field
7
- * with a timestamp no longer than 6 hours old.
8
- *
9
- * To be used with sourceType "cdk-source" in LifligCdkPipeline.
10
- */
11
- export declare function getVariable(name: string): string;
12
- /**
13
- * Read all variables from SSM Parameter Store under a given prefix.
14
- */
15
- export declare function getVariablesFromParameterStore(prefix: string): Promise<Record<string, string>>;
@@ -1,80 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getVariablesFromParameterStore = exports.getVariable = void 0;
4
- const aws_sdk_1 = require("aws-sdk");
5
- const fs = require("fs");
6
- const path = require("path");
7
- const process = require("process");
8
- const __1 = require("..");
9
- let variables = undefined;
10
- function isInCodeBuild() {
11
- return "CODEBUILD_BUILD_ID" in process.env;
12
- }
13
- function checkTimestamp(timestampStr) {
14
- if (timestampStr == null) {
15
- // Don't enforce check in CodeBuild. This is needed for migration before
16
- // the lambda itself is updated to generate the variablesTimestamp field.
17
- if (isInCodeBuild()) {
18
- return;
19
- }
20
- throw new Error(`Variable variablesTimestamp not found`);
21
- }
22
- const ageMs = new Date().getTime() - new Date(Date.parse(timestampStr)).getTime();
23
- if (ageMs > 3600 * 6 * 1000) {
24
- throw new Error("The timestamp stored in variables.json is too old and must be refreshed - refetch variables or manually override");
25
- }
26
- }
27
- /**
28
- * Get a value from "variables.json" in the current working directory.
29
- *
30
- * The name must exist or an error will be thrown.
31
- *
32
- * The variables.json file should have variablesTimestamp field
33
- * with a timestamp no longer than 6 hours old.
34
- *
35
- * To be used with sourceType "cdk-source" in LifligCdkPipeline.
36
- */
37
- function getVariable(name) {
38
- if (__1.isSnapshot) {
39
- return "snapshot-value";
40
- }
41
- if (variables == null) {
42
- const variablesFile = path.join(process.cwd(), "variables.json");
43
- if (!fs.existsSync(variablesFile)) {
44
- throw new Error("variables.json not found");
45
- }
46
- variables = JSON.parse(fs.readFileSync(variablesFile, "utf-8"));
47
- }
48
- const timestampStr = variables["variablesTimestamp"];
49
- checkTimestamp(timestampStr);
50
- const value = variables[name];
51
- if (value == null) {
52
- throw new Error(`Variable ${name} not found`);
53
- }
54
- return value;
55
- }
56
- exports.getVariable = getVariable;
57
- /**
58
- * Read all variables from SSM Parameter Store under a given prefix.
59
- */
60
- async function getVariablesFromParameterStore(prefix) {
61
- const ssm = new aws_sdk_1.SSM();
62
- const parameters = {};
63
- let nextToken = undefined;
64
- do {
65
- const result = await ssm
66
- .getParametersByPath({
67
- Path: prefix,
68
- NextToken: nextToken,
69
- })
70
- .promise();
71
- for (const parameter of result.Parameters) {
72
- const name = parameter.Name.slice(prefix.length);
73
- parameters[name] = parameter.Value;
74
- }
75
- nextToken = result.NextToken;
76
- } while (nextToken != null);
77
- return parameters;
78
- }
79
- exports.getVariablesFromParameterStore = getVariablesFromParameterStore;
80
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWFibGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Nkay1waXBlbGluZXMvdmFyaWFibGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFDQUE2QjtBQUM3Qix5QkFBd0I7QUFDeEIsNkJBQTRCO0FBQzVCLG1DQUFrQztBQUNsQywwQkFBK0I7QUFFL0IsSUFBSSxTQUFTLEdBQW1ELFNBQVMsQ0FBQTtBQUV6RSxTQUFTLGFBQWE7SUFDcEIsT0FBTyxvQkFBb0IsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFBO0FBQzVDLENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxZQUFnQztJQUN0RCxJQUFJLFlBQVksSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN6Qix3RUFBd0U7UUFDeEUseUVBQXlFO1FBQ3pFLElBQUksYUFBYSxFQUFFLEVBQUUsQ0FBQztZQUNwQixPQUFNO1FBQ1IsQ0FBQztRQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQTtJQUMxRCxDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQ1QsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUE7SUFDckUsSUFBSSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUM1QixNQUFNLElBQUksS0FBSyxDQUNiLGtIQUFrSCxDQUNuSCxDQUFBO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFnQixXQUFXLENBQUMsSUFBWTtJQUN0QyxJQUFJLGNBQVUsRUFBRSxDQUFDO1FBQ2YsT0FBTyxnQkFBZ0IsQ0FBQTtJQUN6QixDQUFDO0lBRUQsSUFBSSxTQUFTLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdEIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtRQUVoRSxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQTtRQUM3QyxDQUFDO1FBRUQsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLENBRzdELENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLG9CQUFvQixDQUFDLENBQUE7SUFDcEQsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFBO0lBRTVCLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUU3QixJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLFlBQVksSUFBSSxZQUFZLENBQUMsQ0FBQTtJQUMvQyxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBNUJELGtDQTRCQztBQUVEOztHQUVHO0FBQ0ksS0FBSyxVQUFVLDhCQUE4QixDQUNsRCxNQUFjO0lBRWQsTUFBTSxHQUFHLEdBQUcsSUFBSSxhQUFHLEVBQUUsQ0FBQTtJQUVyQixNQUFNLFVBQVUsR0FBMkIsRUFBRSxDQUFBO0lBRTdDLElBQUksU0FBUyxHQUF1QixTQUFTLENBQUE7SUFDN0MsR0FBRyxDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQWtDLE1BQU0sR0FBRzthQUNwRCxtQkFBbUIsQ0FBQztZQUNuQixJQUFJLEVBQUUsTUFBTTtZQUNaLFNBQVMsRUFBRSxTQUFTO1NBQ3JCLENBQUM7YUFDRCxPQUFPLEVBQUUsQ0FBQTtRQUVaLEtBQUssTUFBTSxTQUFTLElBQUksTUFBTSxDQUFDLFVBQVcsRUFBRSxDQUFDO1lBQzNDLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUNqRCxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQU0sQ0FBQTtRQUNyQyxDQUFDO1FBRUQsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUE7SUFDOUIsQ0FBQyxRQUFRLFNBQVMsSUFBSSxJQUFJLEVBQUM7SUFFM0IsT0FBTyxVQUFVLENBQUE7QUFDbkIsQ0FBQztBQXpCRCx3RUF5QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTU00gfSBmcm9tIFwiYXdzLXNka1wiXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiXG5pbXBvcnQgKiBhcyBwcm9jZXNzIGZyb20gXCJwcm9jZXNzXCJcbmltcG9ydCB7IGlzU25hcHNob3QgfSBmcm9tIFwiLi5cIlxuXG5sZXQgdmFyaWFibGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkXG5cbmZ1bmN0aW9uIGlzSW5Db2RlQnVpbGQoKSB7XG4gIHJldHVybiBcIkNPREVCVUlMRF9CVUlMRF9JRFwiIGluIHByb2Nlc3MuZW52XG59XG5cbmZ1bmN0aW9uIGNoZWNrVGltZXN0YW1wKHRpbWVzdGFtcFN0cjogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gIGlmICh0aW1lc3RhbXBTdHIgPT0gbnVsbCkge1xuICAgIC8vIERvbid0IGVuZm9yY2UgY2hlY2sgaW4gQ29kZUJ1aWxkLiBUaGlzIGlzIG5lZWRlZCBmb3IgbWlncmF0aW9uIGJlZm9yZVxuICAgIC8vIHRoZSBsYW1iZGEgaXRzZWxmIGlzIHVwZGF0ZWQgdG8gZ2VuZXJhdGUgdGhlIHZhcmlhYmxlc1RpbWVzdGFtcCBmaWVsZC5cbiAgICBpZiAoaXNJbkNvZGVCdWlsZCgpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFZhcmlhYmxlIHZhcmlhYmxlc1RpbWVzdGFtcCBub3QgZm91bmRgKVxuICB9XG5cbiAgY29uc3QgYWdlTXMgPVxuICAgIG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gbmV3IERhdGUoRGF0ZS5wYXJzZSh0aW1lc3RhbXBTdHIpKS5nZXRUaW1lKClcbiAgaWYgKGFnZU1zID4gMzYwMCAqIDYgKiAxMDAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJUaGUgdGltZXN0YW1wIHN0b3JlZCBpbiB2YXJpYWJsZXMuanNvbiBpcyB0b28gb2xkIGFuZCBtdXN0IGJlIHJlZnJlc2hlZCAtIHJlZmV0Y2ggdmFyaWFibGVzIG9yIG1hbnVhbGx5IG92ZXJyaWRlXCIsXG4gICAgKVxuICB9XG59XG5cbi8qKlxuICogR2V0IGEgdmFsdWUgZnJvbSBcInZhcmlhYmxlcy5qc29uXCIgaW4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuXG4gKlxuICogVGhlIG5hbWUgbXVzdCBleGlzdCBvciBhbiBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAqXG4gKiBUaGUgdmFyaWFibGVzLmpzb24gZmlsZSBzaG91bGQgaGF2ZSB2YXJpYWJsZXNUaW1lc3RhbXAgZmllbGRcbiAqIHdpdGggYSB0aW1lc3RhbXAgbm8gbG9uZ2VyIHRoYW4gNiBob3VycyBvbGQuXG4gKlxuICogVG8gYmUgdXNlZCB3aXRoIHNvdXJjZVR5cGUgXCJjZGstc291cmNlXCIgaW4gTGlmbGlnQ2RrUGlwZWxpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYXJpYWJsZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoaXNTbmFwc2hvdCkge1xuICAgIHJldHVybiBcInNuYXBzaG90LXZhbHVlXCJcbiAgfVxuXG4gIGlmICh2YXJpYWJsZXMgPT0gbnVsbCkge1xuICAgIGNvbnN0IHZhcmlhYmxlc0ZpbGUgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXCJ2YXJpYWJsZXMuanNvblwiKVxuXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHZhcmlhYmxlc0ZpbGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ2YXJpYWJsZXMuanNvbiBub3QgZm91bmRcIilcbiAgICB9XG5cbiAgICB2YXJpYWJsZXMgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh2YXJpYWJsZXNGaWxlLCBcInV0Zi04XCIpKSBhcyBSZWNvcmQ8XG4gICAgICBzdHJpbmcsXG4gICAgICBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICA+XG4gIH1cblxuICBjb25zdCB0aW1lc3RhbXBTdHIgPSB2YXJpYWJsZXNbXCJ2YXJpYWJsZXNUaW1lc3RhbXBcIl1cbiAgY2hlY2tUaW1lc3RhbXAodGltZXN0YW1wU3RyKVxuXG4gIGNvbnN0IHZhbHVlID0gdmFyaWFibGVzW25hbWVdXG5cbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFZhcmlhYmxlICR7bmFtZX0gbm90IGZvdW5kYClcbiAgfVxuXG4gIHJldHVybiB2YWx1ZVxufVxuXG4vKipcbiAqIFJlYWQgYWxsIHZhcmlhYmxlcyBmcm9tIFNTTSBQYXJhbWV0ZXIgU3RvcmUgdW5kZXIgYSBnaXZlbiBwcmVmaXguXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRWYXJpYWJsZXNGcm9tUGFyYW1ldGVyU3RvcmUoXG4gIHByZWZpeDogc3RyaW5nLFxuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gIGNvbnN0IHNzbSA9IG5ldyBTU00oKVxuXG4gIGNvbnN0IHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuXG4gIGxldCBuZXh0VG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuICBkbyB7XG4gICAgY29uc3QgcmVzdWx0OiBTU00uR2V0UGFyYW1ldGVyc0J5UGF0aFJlc3VsdCA9IGF3YWl0IHNzbVxuICAgICAgLmdldFBhcmFtZXRlcnNCeVBhdGgoe1xuICAgICAgICBQYXRoOiBwcmVmaXgsXG4gICAgICAgIE5leHRUb2tlbjogbmV4dFRva2VuLFxuICAgICAgfSlcbiAgICAgIC5wcm9taXNlKClcblxuICAgIGZvciAoY29uc3QgcGFyYW1ldGVyIG9mIHJlc3VsdC5QYXJhbWV0ZXJzISkge1xuICAgICAgY29uc3QgbmFtZSA9IHBhcmFtZXRlci5OYW1lIS5zbGljZShwcmVmaXgubGVuZ3RoKVxuICAgICAgcGFyYW1ldGVyc1tuYW1lXSA9IHBhcmFtZXRlci5WYWx1ZSFcbiAgICB9XG5cbiAgICBuZXh0VG9rZW4gPSByZXN1bHQuTmV4dFRva2VuXG4gIH0gd2hpbGUgKG5leHRUb2tlbiAhPSBudWxsKVxuXG4gIHJldHVybiBwYXJhbWV0ZXJzXG59XG4iXX0=
@@ -1,47 +0,0 @@
1
- import * as constructs from "constructs";
2
- import * as cdk from "aws-cdk-lib";
3
- import * as cloudwatch from "aws-cdk-lib/aws-cloudwatch";
4
- export interface CloudTrailSlackIntegrationProps extends cdk.StackProps {
5
- /**
6
- * A key-value pair of values to augment (e.g., AWS account IDs, principal IDs) with friendly names
7
- * to use when sending messages to Slack.
8
- *
9
- * NOTE: A simple heuristic is used to avoid replacing values inside of ARNs etc. as this can
10
- * lead to unpleasant formatting of various fields in the Slack message.
11
- */
12
- friendlyNames?: {
13
- [key: string]: string;
14
- };
15
- slackWebhookUrl: string;
16
- slackChannel: string;
17
- /**
18
- * A list of ARNs of roles in the current account to monitor usage of.
19
- */
20
- rolesToMonitor?: string[];
21
- /**
22
- * Whether to monitor various IAM API calls associated with the current account's root user (e.g., console login, password reset, etc.)
23
- *
24
- * @default true
25
- */
26
- monitorRootUserActions?: boolean;
27
- /**
28
- * Whether to set up additional AWS infrastructure to deduplicate CloudTrail events in order to avoid duplicate Slack messages. May be used to decrease noise.
29
- *
30
- * @default false
31
- */
32
- deduplicateEvents?: boolean;
33
- /**
34
- * If supplied, CloudWatch alarms will be created for the construct's underlying infrastructure (e.g., Lambda functions) and the action will be used to notify on OK and ALARM actions.
35
- */
36
- infrastructureAlarmAction?: cloudwatch.IAlarmAction;
37
- }
38
- /**
39
- * Forward a predefined set of CloudTrail API events to Slack using EventBridge, Lambda
40
- * and an optional SQS FIFO queue for deduplicating events.
41
- * The API events are limited to monitoring access to the current account's root user and/or specific IAM roles.
42
- *
43
- * NOTE: The construct needs to be provisioned in us-east-1, and requires an existing CloudTrail set up in that region.
44
- */
45
- export declare class CloudTrailSlackIntegration extends constructs.Construct {
46
- constructor(scope: constructs.Construct, id: string, props: CloudTrailSlackIntegrationProps);
47
- }