private createFindLoadBalancerFunction()

in lib/ide-services-cloudfront.ts [92:153]


    private createFindLoadBalancerFunction(): lambda.Function {
        // Create a Lambda function to find the ALB by its DNS name
        const fn = new lambda.Function(this, 'FindLoadBalancerFunction', {
            runtime: lambda.Runtime.NODEJS_22_X,
            handler: 'index.handler',
            code: lambda.Code.fromInline(`
                // Import AWS SDK v3 modules
                const { ElasticLoadBalancingV2Client, DescribeLoadBalancersCommand } = require('@aws-sdk/client-elastic-load-balancing-v2');
                const { EC2Client, DescribeSecurityGroupsCommand } = require('@aws-sdk/client-ec2');
    
                exports.handler = async (event) => {
                    console.log('Event:', JSON.stringify(event));
    
                    const namePrefix = event.ResourceProperties.namePrefix;
                    if (!namePrefix) {
                        throw new Error('ALB name prefix is required');
                    }
    
                    // Initialize AWS clients
                    const elbv2Client = new ElasticLoadBalancingV2Client();
                    const ec2Client = new EC2Client();
    
                    try {
                        // Get all load balancers
                        const describeLoadBalancersCommand = new DescribeLoadBalancersCommand({});
                        const loadBalancersResponse = await elbv2Client.send(describeLoadBalancersCommand);
                        console.log('Load balancers:', JSON.stringify(loadBalancersResponse));
    
                        // Find the load balancer with the matching DNS name
                        const loadBalancer = loadBalancersResponse.LoadBalancers.find(lb => lb.LoadBalancerName.startsWith(namePrefix));
                        if (!loadBalancer) {
                            throw new Error(\`Load balancer with name \${namePrefix} not found\`);
                        }
    
                        return {
                            PhysicalResourceId: loadBalancer.LoadBalancerArn,
                            Data: {
                                loadBalancerArn: loadBalancer.LoadBalancerArn,
                                securityGroupId: loadBalancer.SecurityGroups[0],
                                dnsName: loadBalancer.DNSName,
                            }
                        };
                    } catch (error) {
                        console.error('Error:', error);
                        throw error;
                    }
                };
            `),
            timeout: cdk.Duration.minutes(5),
        });

        // Grant the Lambda function permission to describe load balancers and security groups
        fn.addToRolePolicy(new iam.PolicyStatement({
            actions: [
                'elasticloadbalancing:DescribeLoadBalancers',
                'ec2:DescribeSecurityGroups'
            ],
            resources: ['*'],
        }));

        return fn;
    }