amazon-web-servicesaws-cdkaws-application-load-balancernlb

How to assign a ALB as a target to a NLB Target Group? Using CDK


How do I assign a ALB to the NLB Target group using cdk? Here is my code, everything works great and deploys no issue, the only thing is that I have to manually in the aws console assign the target for the NLB Target Group which I was able to define for ALB use.

Here is my code and I put a comment in the NLBTargetGroup where I would expect to be able to assign the ALB however it does not build/deploy when I do that.

const vpc = new ec2.Vpc($this, `BackendVpc-${stage}`, { 
        ip_addresses: ec2.IpAddresses.cidr('10.0.0.0/16'),
        enableDnsSupport: true,
        subnetConfiguration: [
          {
              cidrMask: 24,
              name: 'private',
              subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS,
          },
          {
            cidrMask: 24,
            name: 'public',
            subnetType: ec2.SubnetType.PUBLIC,
        }
      ],
      } as ec2.VpcProps);

configVPC(vpc);

const cluster = new ecs.Cluster($this, `BackendCluster-${stage}`, { vpc: vpc, enableFargateCapacityProviders: true });

const imageRepo = new ecr.Repository($this, `BackendRepo-${stage}`, {
    repositoryName: `backend-repo-${stage}`
});

const dockerImage = new DockerImageAsset($this,`DockerImage-${stage}`,{
    directory: path.join(__dirname, '..', '..', 'backend'),
});

const deployment = new ECRDeployment($this, `DeployDockerImage-${stage}`, {
    src: new DockerImageName(dockerImage.imageUri),
    dest: new DockerImageName(`${imageRepo.repositoryUri}:latest`),
});

dockerImage.node.addDependency(imageRepo);
deployment.node.addDependency(imageRepo);

const service = new ApplicationLoadBalancedFargateService($this, `BackendService-${stage}`, {
    serviceName: `BackendService-${stage}`,
    cluster: cluster,
    cpu: 256, 
    memoryLimitMiB: 2048,
    taskImageOptions: {
        image: ecs.ContainerImage.fromEcrRepository(imageRepo, 'latest'),
        containerName: `backend-repo-${stage}`,
        containerPort: 80,
        environment: { 
            PORT: "80",
            STAGE: stage,
            AWS_DEFAULT_REGION: props?.env?.region || "",
            USERPOOLID: userPool.userPoolId,

        }
    },
    desiredCount: 1,
    publicLoadBalancer: false,
});

const nlb = new NetworkLoadBalancer($this, `BackendNLB-${stage}`, {
    vpc: vpc,
    crossZoneEnabled: true,
    internetFacing: false,
    vpcSubnets: {
        subnets: vpc.privateSubnets
    } 
});

const nlbListener = nlb.addListener(`BackendNLBListener-${stage}`, {
    port: 80,
});

const nlbTargetGroup = new NetworkTargetGroup($this, `BackendNLBTargetGroup-${stage}`, {
    port: 80,
    vpc: vpc,
    targetType: TargetType.ALB,
    // here I would expect to set the target to my ALB 
    // target: [service.loadBalancer]
    // but I get the following error 
    // Property 'attachToNetworkTargetGroup' is missing in type 'ApplicationLoadBalancer' but required in type 'INetworkLoadBalancerTarget'.

});

nlbListener.addTargetGroups(`BackendNLBAddingTargetGroup-${stage}`, nlbTargetGroup);

Solution

  • The targets prop of the NetworkTargetGroup expects a INetworkLoadBalancerTarget. When you go to its documentation, it contains the list of classes that implement this interface. Among them is AlbTarget.

    const nlbTargetGroup = new NetworkTargetGroup($this, `BackendNLBTargetGroup-${stage}`, {
        port: 80,
        vpc: vpc,
        targets: [new AlbTarget(service.loadBalancer, 80)]
    });
    

    You do not have to specify the targetType prop, it is determined automatically.