Skip to content

Commit 140892a

Browse files
authoredSep 29, 2021
fix(elasticloadbalancingv2): Incorrect validation on NetworkLoadBalancer.configureHealthCheck() (aws#16445)
## Summary The [`NetworkLoadBalancer`'s](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-elasticloadbalancingv2.NetworkLoadBalancer.html) [`configureHealthCheck()`](https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-elasticloadbalancingv2.ApplicationTargetGroup.html#configurewbrhealthwbrcheckhealthcheck) method is incorrectly throwing a validation error when provided a valid `protocol` and the same value for both `interval` and `timeout`. ```sh Error: Healthcheck interval 10 seconds must be greater than the timeout 10 seconds ``` This rule only applies to Application Load Balancers and not Network Load Balancers. This PR: - Moves the mentioned validation logic from the `BaseTargetGroup` class to the `ApplicationTargetGroup` class. - Adds tests that check a validation error is thrown when **invalid** `protocol`, `interval`, `timeout`, & `path` combinations are provided for the respected TargetGroup type. - Adds tests that check a validation error is **not** thrown when **valid** `protocol`, `interval`, `timeout`, & `path` combinations are provided for the respected TargetGroup type. Provides fix for SIM ticket: V427669955 Fixes issue: aws#16446 Refs: - [The mentioned validation logic was implemented by this PR.](aws#16107) - [CreateTargetGroup CloudFormation docs](https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_CreateTargetGroup.html) - [Application Load Balancer's Health check configuration docs](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/target-group-health-checks.html) - [Network Load Balancer's Health check configuration docs](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/target-group-health-checks.html) ---- *By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license*
1 parent f24a1ae commit 140892a

File tree

4 files changed

+413
-77
lines changed

4 files changed

+413
-77
lines changed
 

‎packages/@aws-cdk/aws-elasticloadbalancingv2/lib/alb/application-target-group.ts

+15-5
Original file line numberDiff line numberDiff line change
@@ -376,11 +376,21 @@ export class ApplicationTargetGroup extends TargetGroupBase implements IApplicat
376376
ret.push('At least one of \'port\' or \'protocol\' is required for a non-Lambda TargetGroup');
377377
}
378378

379-
if (this.healthCheck && this.healthCheck.protocol && !ALB_HEALTH_CHECK_PROTOCOLS.includes(this.healthCheck.protocol)) {
380-
ret.push([
381-
`Health check protocol '${this.healthCheck.protocol}' is not supported. `,
382-
`Must be one of [${ALB_HEALTH_CHECK_PROTOCOLS.join(', ')}]`,
383-
].join(''));
379+
if (this.healthCheck && this.healthCheck.protocol) {
380+
381+
if (ALB_HEALTH_CHECK_PROTOCOLS.includes(this.healthCheck.protocol)) {
382+
if (this.healthCheck.interval && this.healthCheck.timeout &&
383+
this.healthCheck.interval.toMilliseconds() <= this.healthCheck.timeout.toMilliseconds()) {
384+
ret.push(`Healthcheck interval ${this.healthCheck.interval.toHumanString()} must be greater than the timeout ${this.healthCheck.timeout.toHumanString()}`);
385+
}
386+
}
387+
388+
if (!ALB_HEALTH_CHECK_PROTOCOLS.includes(this.healthCheck.protocol)) {
389+
ret.push([
390+
`Health check protocol '${this.healthCheck.protocol}' is not supported. `,
391+
`Must be one of [${ALB_HEALTH_CHECK_PROTOCOLS.join(', ')}]`,
392+
].join(''));
393+
}
384394
}
385395

386396
return ret;

‎packages/@aws-cdk/aws-elasticloadbalancingv2/lib/shared/base-target-group.ts

+1-6
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ export abstract class TargetGroupBase extends CoreConstruct implements ITargetGr
269269
healthyThresholdCount: cdk.Lazy.number({ produce: () => this.healthCheck?.healthyThresholdCount }),
270270
unhealthyThresholdCount: cdk.Lazy.number({ produce: () => this.healthCheck?.unhealthyThresholdCount }),
271271
matcher: cdk.Lazy.any({
272-
produce: () => this.healthCheck?.healthyHttpCodes !== undefined || this.healthCheck?.healthyGrpcCodes !== undefined ? {
272+
produce: () => this.healthCheck?.healthyHttpCodes !== undefined || this.healthCheck?.healthyGrpcCodes !== undefined ? {
273273
grpcCode: this.healthCheck.healthyGrpcCodes,
274274
httpCode: this.healthCheck.healthyHttpCodes,
275275
} : undefined,
@@ -297,11 +297,6 @@ export abstract class TargetGroupBase extends CoreConstruct implements ITargetGr
297297
* Set/replace the target group's health check
298298
*/
299299
public configureHealthCheck(healthCheck: HealthCheck) {
300-
if (healthCheck.interval && healthCheck.timeout) {
301-
if (healthCheck.interval.toMilliseconds() <= healthCheck.timeout.toMilliseconds()) {
302-
throw new Error(`Healthcheck interval ${healthCheck.interval.toHumanString()} must be greater than the timeout ${healthCheck.timeout.toHumanString()}`);
303-
}
304-
}
305300
this.healthCheck = healthCheck;
306301
}
307302

‎packages/@aws-cdk/aws-elasticloadbalancingv2/test/alb/target-group.test.ts

+168-25
Original file line numberDiff line numberDiff line change
@@ -282,44 +282,187 @@ describe('tests', () => {
282282
});
283283
});
284284

285-
test('Interval equal to timeout', () => {
286-
// GIVEN
287-
const app = new cdk.App();
288-
const stack = new cdk.Stack(app, 'Stack');
289-
const vpc = new ec2.Vpc(stack, 'VPC', {});
285+
test.each([elbv2.Protocol.UDP, elbv2.Protocol.TCP_UDP, elbv2.Protocol.TLS])(
286+
'Throws validation error, when `healthCheck` has `protocol` set to %s',
287+
(protocol) => {
288+
// GIVEN
289+
const app = new cdk.App();
290+
const stack = new cdk.Stack(app, 'Stack');
291+
const vpc = new ec2.Vpc(stack, 'VPC', {});
292+
293+
// WHEN
294+
new elbv2.ApplicationTargetGroup(stack, 'TargetGroup', {
295+
vpc,
296+
healthCheck: {
297+
protocol: protocol,
298+
},
299+
});
290300

291-
// WHEN
292-
const tg = new elbv2.ApplicationTargetGroup(stack, 'TargetGroup', {
293-
vpc,
301+
// THEN
302+
expect(() => {
303+
app.synth();
304+
}).toThrow(`Health check protocol '${protocol}' is not supported. Must be one of [HTTP, HTTPS]`);
294305
});
295306

296-
// THEN
297-
expect(() => {
307+
test.each([elbv2.Protocol.UDP, elbv2.Protocol.TCP_UDP, elbv2.Protocol.TLS])(
308+
'Throws validation error, when `configureHealthCheck()` has `protocol` set to %s',
309+
(protocol) => {
310+
// GIVEN
311+
const app = new cdk.App();
312+
const stack = new cdk.Stack(app, 'Stack');
313+
const vpc = new ec2.Vpc(stack, 'VPC', {});
314+
const tg = new elbv2.ApplicationTargetGroup(stack, 'TargetGroup', {
315+
vpc,
316+
});
317+
318+
// WHEN
319+
tg.configureHealthCheck({
320+
protocol: protocol,
321+
});
322+
323+
// THEN
324+
expect(() => {
325+
app.synth();
326+
}).toThrow(`Health check protocol '${protocol}' is not supported. Must be one of [HTTP, HTTPS]`);
327+
});
328+
329+
test.each([elbv2.Protocol.HTTP, elbv2.Protocol.HTTPS])(
330+
'Does not throw validation error, when `healthCheck` has `protocol` set to %s',
331+
(protocol) => {
332+
// GIVEN
333+
const app = new cdk.App();
334+
const stack = new cdk.Stack(app, 'Stack');
335+
const vpc = new ec2.Vpc(stack, 'VPC', {});
336+
337+
// WHEN
338+
new elbv2.ApplicationTargetGroup(stack, 'TargetGroup', {
339+
vpc,
340+
healthCheck: {
341+
protocol: protocol,
342+
},
343+
});
344+
345+
// THEN
346+
expect(() => {
347+
app.synth();
348+
}).not.toThrowError();
349+
});
350+
351+
test.each([elbv2.Protocol.HTTP, elbv2.Protocol.HTTPS])(
352+
'Does not throw validation error, when `configureHealthCheck()` has `protocol` set to %s',
353+
(protocol) => {
354+
// GIVEN
355+
const app = new cdk.App();
356+
const stack = new cdk.Stack(app, 'Stack');
357+
const vpc = new ec2.Vpc(stack, 'VPC', {});
358+
const tg = new elbv2.ApplicationTargetGroup(stack, 'TargetGroup', {
359+
vpc,
360+
});
361+
362+
// WHEN
363+
tg.configureHealthCheck({
364+
protocol: protocol,
365+
});
366+
367+
// THEN
368+
expect(() => {
369+
app.synth();
370+
}).not.toThrowError();
371+
});
372+
373+
test.each([elbv2.Protocol.HTTP, elbv2.Protocol.HTTPS])(
374+
'Throws validation error, when `healthCheck` has `protocol` set to %s and `interval` is equal to `timeout`',
375+
(protocol) => {
376+
// GIVEN
377+
const app = new cdk.App();
378+
const stack = new cdk.Stack(app, 'Stack');
379+
const vpc = new ec2.Vpc(stack, 'VPC', {});
380+
381+
// WHEN
382+
new elbv2.ApplicationTargetGroup(stack, 'TargetGroup', {
383+
vpc,
384+
healthCheck: {
385+
interval: cdk.Duration.seconds(60),
386+
timeout: cdk.Duration.seconds(60),
387+
protocol: protocol,
388+
},
389+
});
390+
391+
// THEN
392+
expect(() => {
393+
app.synth();
394+
}).toThrow('Healthcheck interval 1 minute must be greater than the timeout 1 minute');
395+
});
396+
397+
test.each([elbv2.Protocol.HTTP, elbv2.Protocol.HTTPS])(
398+
'Throws validation error, when `healthCheck` has `protocol` set to %s and `interval` is smaller than `timeout`',
399+
(protocol) => {
400+
// GIVEN
401+
const app = new cdk.App();
402+
const stack = new cdk.Stack(app, 'Stack');
403+
const vpc = new ec2.Vpc(stack, 'VPC', {});
404+
405+
// WHEN
406+
new elbv2.ApplicationTargetGroup(stack, 'TargetGroup', {
407+
vpc,
408+
healthCheck: {
409+
interval: cdk.Duration.seconds(60),
410+
timeout: cdk.Duration.seconds(120),
411+
protocol: protocol,
412+
},
413+
});
414+
415+
// THEN
416+
expect(() => {
417+
app.synth();
418+
}).toThrow('Healthcheck interval 1 minute must be greater than the timeout 2 minutes');
419+
});
420+
421+
test.each([elbv2.Protocol.HTTP, elbv2.Protocol.HTTPS])(
422+
'Throws validation error, when `configureHealthCheck()` has `protocol` set to %s and `interval` is equal to `timeout`',
423+
(protocol) => {
424+
// GIVEN
425+
const app = new cdk.App();
426+
const stack = new cdk.Stack(app, 'Stack');
427+
const vpc = new ec2.Vpc(stack, 'VPC', {});
428+
const tg = new elbv2.ApplicationTargetGroup(stack, 'TargetGroup', {
429+
vpc,
430+
});
431+
432+
// WHEN
298433
tg.configureHealthCheck({
299434
interval: cdk.Duration.seconds(60),
300435
timeout: cdk.Duration.seconds(60),
436+
protocol: protocol,
301437
});
302-
}).toThrow(/Healthcheck interval 1 minute must be greater than the timeout 1 minute/);
303-
});
304-
305-
test('Interval smaller than timeout', () => {
306-
// GIVEN
307-
const app = new cdk.App();
308-
const stack = new cdk.Stack(app, 'Stack');
309-
const vpc = new ec2.Vpc(stack, 'VPC', {});
310438

311-
// WHEN
312-
const tg = new elbv2.ApplicationTargetGroup(stack, 'TargetGroup', {
313-
vpc,
439+
// THEN
440+
expect(() => {
441+
app.synth();
442+
}).toThrow('Healthcheck interval 1 minute must be greater than the timeout 1 minute');
314443
});
315444

316-
// THEN
317-
expect(() => {
445+
test.each([elbv2.Protocol.HTTP, elbv2.Protocol.HTTPS])(
446+
'Throws validation error, when `configureHealthCheck()` has `protocol` set to %s and `interval` is smaller than `timeout`',
447+
(protocol) => {
448+
// GIVEN
449+
const app = new cdk.App();
450+
const stack = new cdk.Stack(app, 'Stack');
451+
const vpc = new ec2.Vpc(stack, 'VPC', {});
452+
const tg = new elbv2.ApplicationTargetGroup(stack, 'TargetGroup', {
453+
vpc,
454+
});
455+
456+
// WHEN
318457
tg.configureHealthCheck({
319458
interval: cdk.Duration.seconds(60),
320459
timeout: cdk.Duration.seconds(120),
460+
protocol: protocol,
321461
});
322-
}).toThrow(/Healthcheck interval 1 minute must be greater than the timeout 2 minutes/);
323-
});
324462

463+
// THEN
464+
expect(() => {
465+
app.synth();
466+
}).toThrow('Healthcheck interval 1 minute must be greater than the timeout 2 minutes');
467+
});
325468
});

‎packages/@aws-cdk/aws-elasticloadbalancingv2/test/nlb/target-group.test.ts

+229-41
Original file line numberDiff line numberDiff line change
@@ -126,19 +126,6 @@ describe('tests', () => {
126126
});
127127
});
128128

129-
test('Throws error for unacceptable protocol', () => {
130-
const stack = new cdk.Stack();
131-
const vpc = new ec2.Vpc(stack, 'Vpc');
132-
133-
expect(() => {
134-
new elbv2.NetworkTargetGroup(stack, 'Group', {
135-
vpc,
136-
port: 80,
137-
protocol: elbv2.Protocol.HTTPS,
138-
});
139-
}).toThrow();
140-
});
141-
142129
test('Throws error for invalid health check interval', () => {
143130
const app = new cdk.App();
144131
const stack = new cdk.Stack(app, 'Stack');
@@ -157,42 +144,243 @@ describe('tests', () => {
157144
}).toThrow(/Health check interval '5' not supported. Must be one of the following values '10,30'./);
158145
});
159146

160-
test('Throws error for invalid health check protocol', () => {
161-
const app = new cdk.App();
162-
const stack = new cdk.Stack(app, 'Stack');
163-
const vpc = new ec2.Vpc(stack, 'Vpc');
147+
test.each([elbv2.Protocol.UDP, elbv2.Protocol.TCP_UDP, elbv2.Protocol.TLS])(
148+
'Throws validation error, when `healthCheck` has `protocol` set to %s',
149+
(protocol) => {
150+
// GIVEN
151+
const app = new cdk.App();
152+
const stack = new cdk.Stack(app, 'Stack');
153+
const vpc = new ec2.Vpc(stack, 'VPC', {});
164154

165-
new elbv2.NetworkTargetGroup(stack, 'Group', {
166-
vpc,
167-
port: 80,
168-
healthCheck: {
169-
protocol: elbv2.Protocol.UDP,
170-
},
155+
// WHEN
156+
new elbv2.NetworkTargetGroup(stack, 'TargetGroup', {
157+
vpc,
158+
port: 80,
159+
healthCheck: {
160+
protocol: protocol,
161+
},
162+
});
163+
164+
// THEN
165+
expect(() => {
166+
app.synth();
167+
}).toThrow(`Health check protocol '${protocol}' is not supported. Must be one of [HTTP, HTTPS, TCP]`);
171168
});
172169

173-
expect(() => {
174-
app.synth();
175-
}).toThrow(/Health check protocol 'UDP' is not supported. Must be one of \[HTTP, HTTPS, TCP\]/);
176-
});
170+
test.each([elbv2.Protocol.UDP, elbv2.Protocol.TCP_UDP, elbv2.Protocol.TLS])(
171+
'Throws validation error, when `configureHealthCheck()` has `protocol` set to %s',
172+
(protocol) => {
173+
// GIVEN
174+
const app = new cdk.App();
175+
const stack = new cdk.Stack(app, 'Stack');
176+
const vpc = new ec2.Vpc(stack, 'VPC', {});
177+
const tg = new elbv2.NetworkTargetGroup(stack, 'TargetGroup', {
178+
vpc,
179+
port: 80,
180+
});
177181

178-
test('Throws error for health check path property when protocol does not support it', () => {
179-
const app = new cdk.App();
180-
const stack = new cdk.Stack(app, 'Stack');
181-
const vpc = new ec2.Vpc(stack, 'Vpc');
182+
// WHEN
183+
tg.configureHealthCheck({
184+
protocol: protocol,
185+
});
182186

183-
new elbv2.NetworkTargetGroup(stack, 'Group', {
184-
vpc,
185-
port: 80,
186-
healthCheck: {
187+
// THEN
188+
expect(() => {
189+
app.synth();
190+
}).toThrow(`Health check protocol '${protocol}' is not supported. Must be one of [HTTP, HTTPS, TCP]`);
191+
});
192+
193+
test.each([elbv2.Protocol.HTTP, elbv2.Protocol.HTTPS, elbv2.Protocol.TCP])(
194+
'Does not throw validation error, when `healthCheck` has `protocol` set to %s',
195+
(protocol) => {
196+
// GIVEN
197+
const app = new cdk.App();
198+
const stack = new cdk.Stack(app, 'Stack');
199+
const vpc = new ec2.Vpc(stack, 'VPC', {});
200+
201+
// WHEN
202+
new elbv2.NetworkTargetGroup(stack, 'TargetGroup', {
203+
vpc,
204+
port: 80,
205+
healthCheck: {
206+
protocol: protocol,
207+
},
208+
});
209+
210+
// THEN
211+
expect(() => {
212+
app.synth();
213+
}).not.toThrowError();
214+
});
215+
216+
test.each([elbv2.Protocol.HTTP, elbv2.Protocol.HTTPS, elbv2.Protocol.TCP])(
217+
'Does not throw validation error, when `configureHealthCheck()` has `protocol` set to %s',
218+
(protocol) => {
219+
// GIVEN
220+
const app = new cdk.App();
221+
const stack = new cdk.Stack(app, 'Stack');
222+
const vpc = new ec2.Vpc(stack, 'VPC', {});
223+
const tg = new elbv2.NetworkTargetGroup(stack, 'TargetGroup', {
224+
vpc,
225+
port: 80,
226+
});
227+
228+
// WHEN
229+
tg.configureHealthCheck({
230+
protocol: protocol,
231+
});
232+
233+
// THEN
234+
expect(() => {
235+
app.synth();
236+
}).not.toThrowError();
237+
});
238+
239+
test.each([elbv2.Protocol.TCP, elbv2.Protocol.HTTPS])(
240+
'Does not throw a validation error, when `healthCheck` has `protocol` set to %s and `interval` is equal to `timeout`',
241+
(protocol) => {
242+
// GIVEN
243+
const app = new cdk.App();
244+
const stack = new cdk.Stack(app, 'Stack');
245+
const vpc = new ec2.Vpc(stack, 'VPC', {});
246+
247+
// WHEN
248+
new elbv2.NetworkTargetGroup(stack, 'TargetGroup', {
249+
vpc,
250+
port: 80,
251+
healthCheck: {
252+
interval: cdk.Duration.seconds(10),
253+
timeout: cdk.Duration.seconds(10),
254+
protocol: protocol,
255+
},
256+
});
257+
258+
// THEN
259+
expect(() => {
260+
app.synth();
261+
}).not.toThrowError();
262+
});
263+
264+
test.each([elbv2.Protocol.TCP, elbv2.Protocol.HTTPS])(
265+
'Does not throw a validation error, when `configureHealthCheck()` has `protocol` set to %s and `interval` is equal to `timeout`',
266+
(protocol) => {
267+
// GIVEN
268+
const app = new cdk.App();
269+
const stack = new cdk.Stack(app, 'Stack');
270+
const vpc = new ec2.Vpc(stack, 'VPC', {});
271+
const tg = new elbv2.NetworkTargetGroup(stack, 'TargetGroup', {
272+
vpc,
273+
port: 80,
274+
});
275+
276+
// WHEN
277+
tg.configureHealthCheck({
278+
interval: cdk.Duration.seconds(10),
279+
timeout: cdk.Duration.seconds(10),
280+
protocol: protocol,
281+
});
282+
283+
// THEN
284+
expect(() => {
285+
app.synth();
286+
}).not.toThrowError();
287+
});
288+
289+
test.each([elbv2.Protocol.UDP, elbv2.Protocol.TCP_UDP, elbv2.Protocol.TLS])(
290+
'Throws validation error,`healthCheck` has `protocol` set to %s and `path` is provided',
291+
(protocol) => {
292+
// GIVEN
293+
const app = new cdk.App();
294+
const stack = new cdk.Stack(app, 'Stack');
295+
const vpc = new ec2.Vpc(stack, 'VPC', {});
296+
297+
// WHEN
298+
new elbv2.NetworkTargetGroup(stack, 'TargetGroup', {
299+
vpc,
300+
port: 80,
301+
healthCheck: {
302+
path: '/my-path',
303+
protocol: protocol,
304+
},
305+
});
306+
307+
// THEN
308+
expect(() => {
309+
app.synth();
310+
}).toThrow(`'${protocol}' health checks do not support the path property. Must be one of [HTTP, HTTPS]`);
311+
});
312+
313+
test.each([elbv2.Protocol.UDP, elbv2.Protocol.TCP_UDP, elbv2.Protocol.TLS])(
314+
'Throws validation error, when `configureHealthCheck()` has `protocol` set to %s and `path` is provided',
315+
(protocol) => {
316+
// GIVEN
317+
const app = new cdk.App();
318+
const stack = new cdk.Stack(app, 'Stack');
319+
const vpc = new ec2.Vpc(stack, 'VPC', {});
320+
const tg = new elbv2.NetworkTargetGroup(stack, 'TargetGroup', {
321+
vpc,
322+
port: 80,
323+
});
324+
325+
// WHEN
326+
tg.configureHealthCheck({
187327
path: '/my-path',
188-
protocol: elbv2.Protocol.TCP,
189-
},
328+
protocol: protocol,
329+
});
330+
331+
// THEN
332+
expect(() => {
333+
app.synth();
334+
}).toThrow(`'${protocol}' health checks do not support the path property. Must be one of [HTTP, HTTPS]`);
190335
});
191336

192-
expect(() => {
193-
app.synth();
194-
}).toThrow(/'TCP' health checks do not support the path property. Must be one of \[HTTP, HTTPS\]/);
195-
});
337+
test.each([elbv2.Protocol.HTTP, elbv2.Protocol.HTTPS])(
338+
'Does not throw validation error, when `healthCheck` has `protocol` set to %s and `path` is provided',
339+
(protocol) => {
340+
// GIVEN
341+
const app = new cdk.App();
342+
const stack = new cdk.Stack(app, 'Stack');
343+
const vpc = new ec2.Vpc(stack, 'VPC', {});
344+
345+
// WHEN
346+
new elbv2.NetworkTargetGroup(stack, 'TargetGroup', {
347+
vpc,
348+
port: 80,
349+
healthCheck: {
350+
path: '/my-path',
351+
protocol: protocol,
352+
},
353+
});
354+
355+
// THEN
356+
expect(() => {
357+
app.synth();
358+
}).not.toThrowError();
359+
});
360+
361+
test.each([elbv2.Protocol.HTTP, elbv2.Protocol.HTTPS])(
362+
'Does not throw validation error, when `configureHealthCheck()` has `protocol` set to %s and `path` is provided',
363+
(protocol) => {
364+
// GIVEN
365+
const app = new cdk.App();
366+
const stack = new cdk.Stack(app, 'Stack');
367+
const vpc = new ec2.Vpc(stack, 'VPC', {});
368+
const tg = new elbv2.NetworkTargetGroup(stack, 'TargetGroup', {
369+
vpc,
370+
port: 80,
371+
});
372+
373+
// WHEN
374+
tg.configureHealthCheck({
375+
path: '/my-path',
376+
protocol: protocol,
377+
});
378+
379+
// THEN
380+
expect(() => {
381+
app.synth();
382+
}).not.toThrowError();
383+
});
196384

197385
test('Throws error for invalid health check healthy threshold', () => {
198386
const app = new cdk.App();

0 commit comments

Comments
 (0)
Please sign in to comment.