diff --git a/packages/@aws-cdk/aws-ecs-patterns/lib/base/application-load-balanced-service-base.ts b/packages/@aws-cdk/aws-ecs-patterns/lib/base/application-load-balanced-service-base.ts index 3ebcc2e995ad6..68365b43be51e 100644 --- a/packages/@aws-cdk/aws-ecs-patterns/lib/base/application-load-balanced-service-base.ts +++ b/packages/@aws-cdk/aws-ecs-patterns/lib/base/application-load-balanced-service-base.ts @@ -255,7 +255,12 @@ export abstract class ApplicationLoadBalancedServiceBase extends cdk.Construct { /** * The Application Load Balancer for the service. */ - public readonly loadBalancer: ApplicationLoadBalancer; + public get loadBalancer(): ApplicationLoadBalancer { + if (!this._applicationLoadBalancer) { + throw new Error('.loadBalancer can only be accessed if the class was constructed with an owned, not imported, load balancer'); + } + return this._applicationLoadBalancer; + } /** * The listener for the service. @@ -277,6 +282,8 @@ export abstract class ApplicationLoadBalancedServiceBase extends cdk.Construct { */ public readonly cluster: ICluster; + private readonly _applicationLoadBalancer?: ApplicationLoadBalancer; + /** * Constructs a new instance of the ApplicationLoadBalancedServiceBase class. */ @@ -300,20 +307,20 @@ export abstract class ApplicationLoadBalancedServiceBase extends cdk.Construct { internetFacing }; - this.loadBalancer = props.loadBalancer !== undefined ? props.loadBalancer as ApplicationLoadBalancer + const loadBalancer = props.loadBalancer !== undefined ? props.loadBalancer : new ApplicationLoadBalancer(this, 'LB', lbProps); if (props.certificate !== undefined && props.protocol !== undefined && props.protocol !== ApplicationProtocol.HTTPS) { throw new Error('The HTTPS protocol must be used when a certificate is given'); } const protocol = props.protocol !== undefined ? props.protocol : - (props.certificate ? ApplicationProtocol.HTTPS : ApplicationProtocol.HTTP); + (props.certificate ? ApplicationProtocol.HTTPS : ApplicationProtocol.HTTP); const targetProps = { port: 80 }; - this.listener = this.loadBalancer.addListener('PublicListener', { + this.listener = loadBalancer.addListener('PublicListener', { protocol, port: props.listenerPort, open: true @@ -338,7 +345,7 @@ export abstract class ApplicationLoadBalancedServiceBase extends cdk.Construct { this.listener.addCertificates('Arns', [ListenerCertificate.fromCertificateManager(this.certificate)]); } - let domainName = this.loadBalancer.loadBalancerDnsName; + let domainName = loadBalancer.loadBalancerDnsName; if (typeof props.domainName !== 'undefined') { if (typeof props.domainZone === 'undefined') { throw new Error('A Route53 hosted domain zone name is required to configure the specified domain name'); @@ -347,13 +354,17 @@ export abstract class ApplicationLoadBalancedServiceBase extends cdk.Construct { const record = new ARecord(this, "DNS", { zone: props.domainZone, recordName: props.domainName, - target: RecordTarget.fromAlias(new LoadBalancerTarget(this.loadBalancer)), + target: RecordTarget.fromAlias(new LoadBalancerTarget(loadBalancer)), }); domainName = record.domainName; } - new cdk.CfnOutput(this, 'LoadBalancerDNS', { value: this.loadBalancer.loadBalancerDnsName }); + if (loadBalancer instanceof ApplicationLoadBalancer) { + this._applicationLoadBalancer = loadBalancer; + } + + new cdk.CfnOutput(this, 'LoadBalancerDNS', { value: loadBalancer.loadBalancerDnsName }); new cdk.CfnOutput(this, 'ServiceURL', { value: protocol.toLowerCase() + '://' + domainName }); } diff --git a/packages/@aws-cdk/aws-ecs-patterns/lib/base/network-load-balanced-service-base.ts b/packages/@aws-cdk/aws-ecs-patterns/lib/base/network-load-balanced-service-base.ts index e24f0ae7c0973..6e5e7a07edc61 100644 --- a/packages/@aws-cdk/aws-ecs-patterns/lib/base/network-load-balanced-service-base.ts +++ b/packages/@aws-cdk/aws-ecs-patterns/lib/base/network-load-balanced-service-base.ts @@ -230,7 +230,12 @@ export abstract class NetworkLoadBalancedServiceBase extends cdk.Construct { /** * The Network Load Balancer for the service. */ - public readonly loadBalancer: NetworkLoadBalancer; + public get loadBalancer(): NetworkLoadBalancer { + if (!this._networkLoadBalancer) { + throw new Error(".loadBalancer can only be accessed if the class was constructed with an owned, not imported, load balancer"); + } + return this._networkLoadBalancer; + } /** * The listener for the service. @@ -247,6 +252,7 @@ export abstract class NetworkLoadBalancedServiceBase extends cdk.Construct { */ public readonly cluster: ICluster; + private readonly _networkLoadBalancer?: NetworkLoadBalancer; /** * Constructs a new instance of the NetworkLoadBalancedServiceBase class. */ @@ -270,7 +276,8 @@ export abstract class NetworkLoadBalancedServiceBase extends cdk.Construct { internetFacing }; - this.loadBalancer = props.loadBalancer !== undefined ? props.loadBalancer as NetworkLoadBalancer : new NetworkLoadBalancer(this, 'LB', lbProps); + const loadBalancer = props.loadBalancer !== undefined ? props.loadBalancer : + new NetworkLoadBalancer(this, 'LB', lbProps); const listenerPort = props.listenerPort !== undefined ? props.listenerPort : 80; @@ -278,7 +285,7 @@ export abstract class NetworkLoadBalancedServiceBase extends cdk.Construct { port: 80 }; - this.listener = this.loadBalancer.addListener('PublicListener', { port: listenerPort }); + this.listener = loadBalancer.addListener('PublicListener', { port: listenerPort }); this.targetGroup = this.listener.addTargets('ECS', targetProps); if (typeof props.domainName !== 'undefined') { @@ -289,10 +296,14 @@ export abstract class NetworkLoadBalancedServiceBase extends cdk.Construct { new ARecord(this, "DNS", { zone: props.domainZone, recordName: props.domainName, - target: RecordTarget.fromAlias(new LoadBalancerTarget(this.loadBalancer)), + target: RecordTarget.fromAlias(new LoadBalancerTarget(loadBalancer)), }); } + if (loadBalancer instanceof NetworkLoadBalancer) { + this._networkLoadBalancer = loadBalancer; + } + if (props.loadBalancer === undefined) { new cdk.CfnOutput(this, 'LoadBalancerDNS', { value: this.loadBalancer.loadBalancerDnsName }); } diff --git a/packages/@aws-cdk/aws-ecs-patterns/test/ec2/test.l3s.ts b/packages/@aws-cdk/aws-ecs-patterns/test/ec2/test.l3s.ts index 5f3baa444b9c7..53b5600fc7234 100644 --- a/packages/@aws-cdk/aws-ecs-patterns/test/ec2/test.l3s.ts +++ b/packages/@aws-cdk/aws-ecs-patterns/test/ec2/test.l3s.ts @@ -941,7 +941,7 @@ export = { cluster.addCapacity("Capacity", {instanceType: new ec2.InstanceType('t2.micro')}); const nlb = NetworkLoadBalancer.fromNetworkLoadBalancerAttributes(stack, "NLB", { loadBalancerArn: nlbArn, - loadBalancerVpc: vpc, + vpc, }); const taskDef = new ecs.Ec2TaskDefinition(stack, 'TaskDef'); const container = taskDef.addContainer('Container', { diff --git a/packages/@aws-cdk/aws-ecs-patterns/test/fargate/test.load-balanced-fargate-service.ts b/packages/@aws-cdk/aws-ecs-patterns/test/fargate/test.load-balanced-fargate-service.ts index 6f26c50712f30..72353f74ec427 100644 --- a/packages/@aws-cdk/aws-ecs-patterns/test/fargate/test.load-balanced-fargate-service.ts +++ b/packages/@aws-cdk/aws-ecs-patterns/test/fargate/test.load-balanced-fargate-service.ts @@ -511,7 +511,7 @@ export = { // WHEN const nlb2 = NetworkLoadBalancer.fromNetworkLoadBalancerAttributes(stack2, "ImportedNLB", { loadBalancerArn: nlbArn, - loadBalancerVpc: vpc1, + vpc: vpc1, }); const taskDef = new ecs.FargateTaskDefinition(stack2, 'TaskDef', { cpu: 1024, diff --git a/packages/@aws-cdk/aws-elasticloadbalancingv2/lib/nlb/network-load-balancer.ts b/packages/@aws-cdk/aws-elasticloadbalancingv2/lib/nlb/network-load-balancer.ts index 1de0e742e139e..15f626989b36a 100644 --- a/packages/@aws-cdk/aws-elasticloadbalancingv2/lib/nlb/network-load-balancer.ts +++ b/packages/@aws-cdk/aws-elasticloadbalancingv2/lib/nlb/network-load-balancer.ts @@ -45,7 +45,7 @@ export interface NetworkLoadBalancerAttributes { * @default - When not provided, listeners cannot be created on imported load * balancers. */ - readonly loadBalancerVpc?: ec2.IVpc; + readonly vpc?: ec2.IVpc; } /** @@ -57,7 +57,7 @@ export class NetworkLoadBalancer extends BaseLoadBalancer implements INetworkLoa public static fromNetworkLoadBalancerAttributes(scope: Construct, id: string, attrs: NetworkLoadBalancerAttributes): INetworkLoadBalancer { class Import extends Resource implements INetworkLoadBalancer { public readonly loadBalancerArn = attrs.loadBalancerArn; - public readonly vpc?: ec2.IVpc = attrs.loadBalancerVpc; + public readonly vpc?: ec2.IVpc = attrs.vpc; public addListener(lid: string, props: BaseNetworkListenerProps): NetworkListener { return new NetworkListener(this, lid, { loadBalancer: this, diff --git a/packages/@aws-cdk/aws-elasticloadbalancingv2/test/nlb/test.load-balancer.ts b/packages/@aws-cdk/aws-elasticloadbalancingv2/test/nlb/test.load-balancer.ts index 8da84eb10e0cb..6b53784f4f074 100644 --- a/packages/@aws-cdk/aws-elasticloadbalancingv2/test/nlb/test.load-balancer.ts +++ b/packages/@aws-cdk/aws-elasticloadbalancingv2/test/nlb/test.load-balancer.ts @@ -216,7 +216,7 @@ export = { const nlbArn = "arn:aws:elasticloadbalancing::000000000000::dummyloadbalancer"; const nlb = elbv2.NetworkLoadBalancer.fromNetworkLoadBalancerAttributes(stack, 'NLB', { loadBalancerArn: nlbArn, - loadBalancerVpc: vpc, + vpc, }); // WHEN const listener = nlb.addListener('Listener', {port: 80});