constructor()

in lib/ide-services-cloudfront.ts [23:90]


    constructor(scope: Construct, id: string, props: IdeServicesCloudfrontProps) {
        super(scope, id, props);

        const {cluster, ideServicesChart} = props;
        const vpc = cluster.vpc;

        const findLoadBalancerFunction = this.createFindLoadBalancerFunction();

        // Provision a custom resource provider framework
        const provider = new cr.Provider(this, 'FindLoadBalancerProvider', {
            onEventHandler: findLoadBalancerFunction,
            logGroup: new logs.LogGroup(this, 'FindLoadBalancerLogs', {
                retention: logs.RetentionDays.ONE_DAY,
            }),
        });

        // Create a custom resource to look up the ALB by its DNS name
        const ingressNamePrefix = "k8s-ideservicesgroup-"
        const findLoadBalancer = new CustomResource(this , 'FindLoadBalancer', {
            serviceToken: provider.serviceToken,
            properties: {
                namePrefix: ingressNamePrefix,
            },
        });
        findLoadBalancer.node.addDependency(ideServicesChart)

        // Extract the load balancer ARN and security group ID from the Lambda function's response
        const loadBalancerArn = findLoadBalancer.getAttString('loadBalancerArn');
        const loadBalancerDnsName = findLoadBalancer.getAttString('dnsName');
        const securityGroupId = findLoadBalancer.getAttString('securityGroupId');

        // Import the ALB using its attributes
        const alb = elasticloadbalancingv2.ApplicationLoadBalancer.fromApplicationLoadBalancerAttributes(
            this,
            'ImportedAlb',
            {
                loadBalancerArn: loadBalancerArn,
                loadBalancerDnsName: loadBalancerDnsName,
                securityGroupId: securityGroupId,
                vpc: vpc,
            }
        );

        // An Application Load Balancer as a VPC origin
        const albOrigin = cloudfront_origins.VpcOrigin.withApplicationLoadBalancer(alb, {
            // Optional VPC origin configurations
            domainName: loadBalancerDnsName,
            readTimeout: cdk.Duration.seconds(30),
            keepaliveTimeout: cdk.Duration.seconds(5),
            protocolPolicy: OriginProtocolPolicy.HTTP_ONLY,
        });

        // Create CloudFront distribution with ALB as VPC origin
        const distribution = new cloudfront.Distribution(this, 'AlbCloudFrontDistribution', {
            defaultBehavior: {
                origin: albOrigin,
                originRequestPolicy: cloudfront.OriginRequestPolicy.ALL_VIEWER,
                allowedMethods: cloudfront.AllowedMethods.ALLOW_ALL,
                cachePolicy: cloudfront.CachePolicy.CACHING_DISABLED,
                viewerProtocolPolicy: cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
            },
            priceClass: cloudfront.PriceClass.PRICE_CLASS_100, // Use only North America and Europe
            enabled: true,
            comment: 'CloudFront distribution with VPC origin for ALB',
        });

        this.deploymentUrl = `https://${distribution.distributionDomainName}`
    }